8

因此,在阅读了一些文档并从你们这里得到了很多帮助之后,我终于实现了一个动态选择端点的收件人列表(一个动态收件人列表):

在我的代码中,MainApp_A 每 10 秒生成一次报告,我希望它同时将报告发送到所有服务器,而不是一一进行。因此,我开发了以下路线。

主应用程序_A

main.addRouteBuilder(new RouteBuilder(){
    @Override
        public void configure() throws Exception {
            from("direct:start").multicast().parallelProcessing()
                .beanRef("recipientListBean", "route").end()
            .log("${body}");
        }
});

收件人列表Bean

@RecipientList
public Set<String> route(String body) {
        return servers; //returns a collection of several severs
}

我还检查了多播模式和动态路由的文档:

现在我有几个问题,我很困惑。所以我有几个问题:

  1. 接收者动态列表是否只是多播模式与动态路由模式的结合点?
  2. 单独的多播()调用纯粹是顺序的,对吗?使用 multicast() 和 recipientList() 有什么区别?
  3. 为了使多播()和收件人列表()一致,我必须使用并行处理()。就我而言,哪个更有效?
4

1 回答 1

15
  1. 动态路由器用于评估在运行时将特定消息发送到哪些端点,一次一个端点。收件人列表是一组用于发送相同消息的端点。

我建议您阅读 Gregor Hohpe 和 Bobby Woolf 的 EAI 模式,了解一些背景和见解。

http://www.eaipatterns.com/

  1. 多播允许硬编码的收件人列表并recipientList(..)允许在运行时计算端点。两者都是“收件人列表”。

  2. 如果您没有大量逻辑(例如数据库查找)来计算收件人列表中的端点,它们可能同样有效 - 端点的调用可能是迄今为止 Camel 最难的部分。无论如何 - 静态“多播”更具可读性。

在 Camel 中,选择一个结构而不是另一个结构的原因通常是路线的可读性。您应该能够查看路线并遵循它的功能(假设您知道 EIP)。至少,这是一个很好的目标。

于 2013-11-10T22:47:39.120 回答