2017-06-15 109 views
0

目前,我的用于根据JMS消息头字段在骆驼中路由消息的代码看起来是这样的:骆驼:基于在地图上的内容路由消息

// MyRouteBuilder.java 
@Override 
public void configure() { 

    from(...) 
     .choice() 
      .when(header("type").isEqualTo("A")) 
       .to("proc_a:1") 
      .when(header("type").isEqualTo("B")) 
       .to("proc_b:1", "proc_b:2", "proc_b:3") 
      .when(header("type").isEqualTo("C")) 
       .to("proc_c:1", "proc_c:2") 
      .when(...) 
       .to(...) // ~15 more branches to follow 
      .otherwise() 
       .to("proc_default"); 
} 

Dependend上type头字段的值,在每种情况下都应该使用特定的处理器流水线。正如你所看到的,代码不仅是重复的,而且还很麻烦。

已经存在动态创建的Map<String, String[]>,其将类型映射到处理器,例如,密钥B返回["proc_b:1", "proc_b:2", "proc_b:3"]。但是,我不知道如何在上面的场景中使用它。我也读了关于dynamic router。然而,给定的例子并没有真正帮助我,我不想通过管理我的路由逻辑状态或确保线程安全来增加更多的复杂性。

我很感激任何解决方案。唯一的要求是我坚持使用Camel 2.15,并且我不允许修改现有的处理器(这尤其意味着路由逻辑不应该删除任何标题字段,因为它们稍后需要)。

回答

0

使用动态到(例如toD),在您使用一些Java方法来计算URL路由到:http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html这里还有约动态到http://camel.apache.org/message-endpoint.html

+0

感谢您的答复。不幸的是,我忘记提及我被卡骆驼2.15卡住了。根据你的链接,我认为这意味着我必须使用'.recipientList()。method(MessageRouter.class,“routeTo”);'。这给我带来了两个问题。 ** 1。**如何从'MessageRouter'内部访问头文件? ** 2。**根据我的理解,收件人列表模式将*相同*消息分发到多个目的地。但在我的情况下,每个头映射到应该被顺序调用的处理器列表(例如,* proc_b:2 *应该看到* proc_b:1 *所做的更改。这是可能的吗? – ceran

+0

只需返回一个多个端点分隔的字符串事实上,这就是收件人列表EIP的全部内容,要发送一条消息到由该收件人列表确定的一个或多个目的地 –

+0

我明白,但作为非母语英语的发言者,我很困惑在文档中使用的单词* copy *如下:*“...第二部分简单地遍历列表并将收到的消息的副本发送给每个收件人”*。但在这种情况下,复制仅意味着对非常相同的对象(所有接收者都可以观察到变化)?或者我们真的在谈论单个拷贝? – ceran