Camel - 设计可扩展的动态数据流

时间:2018-05-02 23:07:24

标签: java apache-camel

使用案例:我从源端点收到消息。根据消息的类型,它由完全不同的业务逻辑(例如,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调用。

或许我错误地接近了这个问题。

1 个答案:

答案 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或日志来跟踪消息所采用的路由。