[英]Invoke route from Processor
我正在使用骆驼集成2个系统。 我定义了不同的路由,并且其中一个路由从特定的Rabbitmq队列中使用,并将其发送到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).
}
}
如您所见,由于我需要进行一些调整,因此我会先处理每条消息,然后再将其发送到其余服务。 问题出在我发现有时(我不知道如何或何时),发布到Rabbit中的系统一次发送2条串联的消息时。
我期望得到的是一个像这样的简单json:
[{field1:value1, field2:value2}]
我有时会得到的是:
[{field1:value1, field2:value2},{field1:value3, field2:value4}]
因此,当我面对这种情况时,其余的服务(将消息路由到)将失败(很明显)。
为了解决这个问题,我想知道是否有一种方法可以从处理器内部调用路由。 从前面的代码片段中,您可以看到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中,您可以使用骆驼生产者模板将转换后的有效载荷发布到新的直接端点(假设您正在使用json?)。
producerTemplate.sendBody("direct:transformedResponses", jsonString);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.