如何使用Camel在同一JVM进程中广播消息?

时间:2014-06-02 14:01:49

标签: apache-camel

我正在使用一个目录,我想在同一个JVM进程中向监听器广播一条消息。我不知道有兴趣的人是谁,因为他们出现时会自我注册:我的JVM流程中的服务集取决于配置。

组播似乎不是我想要的,因为我不知道在路由构建时发送消息的位置。

除了使用排队解决方案(ActiveMQ,RabbitMQ)之外,还有其他解决方案吗?

3 个答案:

答案 0 :(得分:1)

在运行时解析目标端点时使用recipient list模式...

例如,您可以实现一种方法来动态确定收件人等...

from("direct:test").recipientList().method(MessageRouter.class, "routeTo");

public class MessageRouter {
    public String[] routeTo() {
        return new String[] {
            "direct:a", "direct:b"      
        };
    }
}

答案 1 :(得分:1)

除了排队解决方案(JMS / ActiveMQ和RabbitMQ)之外,您还可以使用VM组件进行内部JVM通信。 VM是SEDA组件的扩展。与只能用于单个Camel上下文中不同路由之间的通信的SEDA相比,VM可用于在不同上下文中运行的路由之间的通信。

发送消息:

final ProducerTemplate template = context.createProducerTemplate();
template.sendBody("vm:start", "World!");

使用multipleConsumers=true可以模拟发布 - 订阅消息,即可以配置多个消费者:

from("vm:start?multipleConsumers=true")
     .log("********** Hello: 1 ************");
from("vm:start?multipleConsumers=true")
    .log("********** Hello: 2 ************");

打印:

route1 INFO  ********** Hello: 1 ************
route2 INFO  ********** Hello: 2 ************

然而,与JMS / ActiveMQ和RabbitMQ相比,消息不能离开JVM。并且消息不会持久化。这意味着消息丢失,a)如果在发送消息时没有启动消费者,b)如果JVM在消息被消耗之前崩溃。

答案 2 :(得分:0)

Camel SEDA组件可以为您提供此功能。但是,它仅在当前Camel上下文中有效。如果这个限制适合你,那就是你要走的路。它将处理队列样式的消息传递系统或pub / sub。

Camel SEDA Component