我正在使用一个目录,我想在同一个JVM进程中向监听器广播一条消息。我不知道有兴趣的人是谁,因为他们出现时会自我注册:我的JVM流程中的服务集取决于配置。
组播似乎不是我想要的,因为我不知道在路由构建时发送消息的位置。
除了使用排队解决方案(ActiveMQ,RabbitMQ)之外,还有其他解决方案吗?
答案 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。