【问题标题】:Apache Camel Forwarding and Order of MessagesApache Camel 转发和消息顺序
【发布时间】:2014-08-28 23:32:58
【问题描述】:

我正在调查 Camel 是否可以满足以下要求。要求是:传入队列中消息的顺序应该与传出队列中消息的顺序一致。

我认为问题归结为 Camel 如何将消息从传入队列转发到传出队列的内部结构。

在简单的示例中,路由如下所示:

from("incomingQueue").to("outgoingQueue);

incomingQueue 有 4 条消息开始(按此顺序到达):消息 1、消息 2、消息 3、消息 4。

是否有保证或选项告诉 Camel 以保持原始接收顺序的方式转发消息?因此,如果侦听器正在侦听传出队列,它将收到消息 1,然后是消息 2,然后是消息 3,然后是消息 4(假设是单线程接收器)。

感谢您的帮助。

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    队列是先进先出的。因此,在单线程进程中,队列#2 将按照与队列#1 相同的顺序接收消息。如果您愿意,大多数端点都有办法将消费者减少到 1。

    如果您想保持消费者数量增加,那么您可以在将消息放入队列 #2 之前使用resequencer。就在将消息放入队列 #1 之前,您可以使用序列号填充标头,然后队列 #2 之前的重新排序器将确保它们被重新排序

    【讨论】:

    • 感谢达科他州。我知道队列是先进先出的。我的问题主要是关于 Camel 作为路由引擎如何在端点/队列之间移动消息,以及路由本身是单线程还是多线程。我看到的所有选项都与许多端点有关,例如:parallelProcessing(将消息并行发送到许多端点)。我没有看到将消息从一个端点发送到另一个端点的并行处理选项(不包括拆分器 EIP 之类的东西)。
    • 据我了解,路由默认是单线程的(由于消费者端点配置)。即使具有线程池的组件也默认为 1 个并发使用者。如果您使用的是 JMS 组件(如上面的 activeMQ 组件),则可以通过在 uri 中设置 concurrentConsumer 参数来覆盖它。这一切都取决于您使用的端点。
    【解决方案2】:

    是的,如果您在路由上有一个单线程使用者,那么它将一次在顺序的队列之间移动一条消息。

    【讨论】:

    • 感谢克劳斯的回答。所以 Camel 作为路由引擎保证在两个端点(在我的例子中是队列)之间移动消息保持源和目标之间消息的顺序。 Camel 是否使用单个线程在 2 个端点之间移动消息?是否可配置?你能给我指个参考吗?
    猜你喜欢
    • 2014-12-30
    • 2013-12-25
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多