从处理器调用路由



我正在使用Camel集成两个系统。我定义了不同的路由,其中一个路由使用特定的rabbitmqqueue,并将其发送到REST服务。这里没有什么新奇的东西,路线看起来是这样的:

public class WebSurfingRabbitToRestRoute extends RouteBuilder{
@Override
public void configure() throws Exception {
from("rabbitmq://rabbit_host:port/Rabbit_Exchange").
setHeader("CamelHttpMethod", constant("POST")).
setHeader("Content-Type", constant("application/json")).
bean(TransformResponse.class, "transform").
to("http4://rest_service_host:port/MyRestService).
}
}

正如你所看到的,我在将每条消息发送到rest服务之前都会处理它,因为我需要调整一些事情。当我发现有时(我不知道如何或何时),发布到rabbit的系统会同时发送两条串联的消息时,问题就来了。

我期望得到的是一个简单的json,如下所示:

[{field1:value1, field2:value2}]

我有时得到的是:

[{field1:value1, field2:value2},{field1:value3, field2:value4}]

因此,当我面对这种情况时,将消息路由到的rest服务(显然)失败了。

为了解决这个问题,我想知道是否有一种方法可以从处理器内部调用路由。从前面的代码片段中,你可以看到Im正在调用transform方法,所以我们的想法是做一些类似于下面的伪代码的事情,因为在路由已经启动后,我无法将事件拆分并在同一路由"实例"中发送它们,所以我想调用一个不同的路由,我可以从这里调用它,它将把message2发送到同一个rest服务。

public class TransformRabbitmqResponse {
public String transform(String body) throws Exception {
// In here i do stuff with the message
// Check if i got 2 messages concatenated
// if body.contains("},{") {
//    split_messages
//    InvokeDifferentRoute(message2)
//}
}
}

你们认为这有可能吗?

一个选项(尽管我不确定这是最好的选项)是使用direct端点将其拆分为两个不同的路由。

public class WebSurfingRabbitToRestRoute extends RouteBuilder{
@Override
public void configure() throws Exception {
from("rabbitmq://rabbit_host:port/Rabbit_Exchange")
.setHeader("CamelHttpMethod", constant("POST"))
.setHeader("Content-Type", constant("application/json"))
.bean(TransformResponse.class, "transform");
from("direct:transformedResponses")
.to("http4://rest_service_host:port/MyRestService");
}
}

然后,在您的转换bean中,您可以使用camelProducer模板将转换后的有效负载发布到新的直接端点(假设您使用的是json?)。

producerTemplate.sendBody("direct:transformedResponses", jsonString);

最新更新