使用案例:我从源端点收到消息.根据消息的类型,它由完全不同的业务逻辑(例如,http请求,tcp消息,db调用)处理.然后,结果并传递到下游(假设输出消息的统一标准)
路线看起来像这样:
from(_source_)
...
// handle data (this is dynamic)
...
process(_logger_)
to(_receiver_)
一个直接的解决方案是使用choice():
... // Upstream
.choice()
.when(someCondition).process(sendHTTP)
.when(anotherCondition).process(getToken).process(sendTCP)
.otherwise().process(sendToDB)
... // Downstream
但那不是很容易扩展.
另一个解决方案是将所有内容放在一个处理器中,然后调用具有多态行为的客户端:
... // Upstream
.process(messageSwitch)
... // Downstream
public class MessageSwitch implements Processor {
public void process(Exchange ex) {
RequestClient client = this.resolveClient(ex);
client.sendRequest(ex.getIn());
}
}
然而,这也使我们忽略了这条路线.在这种情况下,我的问题是执行在处理器内部发生的新路由是否是常见做法.例如,我可能想通过http4库(http://camel.apache.org/http4.html)执行http调用.
或者我可能不正确地接近这个问题.
最佳答案 解决此问题的一种方法是让处理器在接收到的消息上设置标头,并为每种类型设置目标路由,然后使用驼峰接收者列表将消息发送到这些目标路由.
from(_source_)
.process(_processorcodebelow_)
.recipientList(simple("direct:${header.MessageRouterByType}"));
处理器看起来像:
public void doProcees(Message message){
Message message = exchange.getIn();
... //logic to check type
message.setHeader("MessageRouterByType", "messagetype1");
...//etc for different types
然后,您可以使用不同的路由为每种不同的消息类型执行业务逻辑.
from("direct:messagetype1").routeId("messagetype1")
.process(_messagetype1processor_)
.to(_receiver_)
您可以使用路由ID或日志记录来跟踪消息所采用的路由.