使用案例:我从源端点收到消息。根据消息的类型,它由完全不同的业务逻辑(例如,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调用。
或许我错误地接近了这个问题。
答案 0 :(得分:1)
您可以采用的一种方法是让处理器在收到的邮件上设置标头,并为每种类型设置目标路由,然后使用驼峰收件人列表将邮件发送到这些目标路由。
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或日志来跟踪消息所采用的路由。