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

Apache camel 如何使用Camel在同一JVM进程中广播消息?,apache-camel,Apache Camel,我正在使用一个目录,我想在同一个JVM进程中向侦听器广播一条消息。我不知道感兴趣的人是谁,因为他们一出现就注册自己:JVM进程中的服务集取决于配置 多播似乎不是我想要的,因为在路由构建时我不知道在哪里发送消息 除了使用队列解决方案(ActiveMQ、RabbitMQ),还有其他解决方案吗?Camel SEDA组件可以为您提供这些解决方案。但是,它仅在当前Camel上下文中有效。如果这个限制对你有效的话,那就是最好的选择。它将处理队列样式的消息传递系统或发布/订阅 在运行时解析目标端点时使用该模式

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

多播似乎不是我想要的,因为在路由构建时我不知道在哪里发送消息


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

Camel SEDA组件可以为您提供这些解决方案。但是,它仅在当前Camel上下文中有效。如果这个限制对你有效的话,那就是最好的选择。它将处理队列样式的消息传递系统或发布/订阅

在运行时解析目标端点时使用该模式

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

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

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

除了队列解决方案(JMS/ActiveMQ和RabbitMQ)之外,您还可以使用该组件进行JVM内部通信。VM是组件的扩展。与只能用于单个驼峰上下文中不同路由之间通信的
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在消息被消费之前崩溃。

为什么会被否决?带
multipleConsumers=true
的SEDA正是我所需要的。我希望向所有消费者发送相同的消息。我想重现RabbitMQ/AMQP中的扇出交换。@boday“每条消息只处理一次”是错误的,请参见我回答中的示例。与
SEDA
相比,
VM
允许不同驼峰路由中的路由之间的通信。我更正了,SEDA有一个发布/订阅模式,但它确实需要您定义多个路由…recipientList对于将同一消息动态发送给多个收件人来说似乎更干净…谢谢。在我的例子中,收件人列表必须是全局已知的,这样我才能在每条消息中添加它。我真的想要类似于具有pub-sub语义的队列的东西。-1问题是显示队列解决方案的替代方案(ActiveMQ、RabbitMQ)。这不需要AMQ,只是在示例目的地中(为了清楚起见,我删除了它)由于我不知道该选项/模式,所以我被纠正了…一般使用concurrentConsumers作为阻塞队列,等等。。