【问题标题】:2 Camel routes consume same Queue2骆驼路线消耗相同的队列
【发布时间】:2018-10-18 01:50:08
【问题描述】:

我在这个地址中创建了多播地址 FROM.TEXT 和一个任播队列 FROM.TEXT。将此队列配置为 max-consumers="10"。

    <address name="FROM.TEXT">
        <multicast>
            <queue name="FROM.TEXT" max-consumers="10">
                <durable>true</durable>
            </queue>
        </multicast>
    </address>

我创建了 2 个 Camel 路由,它们将使用来自该队列的消息并路由到 2 个不同的队列:

public void configure() throws Exception {

    InitialContext context = new InitialContext();

    from("jms:FROM.TEXT")
    .routeId("route1")
    .autoStartup(true)
    .convertBodyTo(String.class, "UTF-8")
    .to("jms:QUEUE1");

    getContext().start();

}

当我启动 route1 时,它的工作为队列创建了一个消费者,但是当我启动 route2 时,什么也没有发生。我需要这样做,因为同一条消息必须路由到 2 个不同的队列。

谢谢。

【问题讨论】:

  • 说你创建了一个带有任播队列的多播地址是没有意义的。您所做的是使用单个多播队列创建地址。但是,由于只有 1 个多播队列,因此语义与拥有单个任播队列没有什么不同。多播的要点是所有多播队列都会收到发送到该地址的任何消息。任播的要点是,1 个任播队列将收到发送到该地址的任何消息。

标签: apache-camel activemq-artemis


【解决方案1】:

如果您希望连接到目标的任何客户端都获得相同的消息,那么您应该使用 JMS 主题。只需定义一个支持多播的地址:

<address name="FROM.TEXT">
    <multicast/>
</address>

那么你的路线会是这样的:

public void configure() throws Exception {
   InitialContext context = new InitialContext();

   from("jms:topic:FROM.TEXT")
   .routeId("route1")
   .autoStartup(true)
   .convertBodyTo(String.class, "UTF-8")
   .to("jms:queue:QUEUE1");

   getContext().start();
}

您可以像这样定义您的 to 队列:

<address name="QUEUE1">
   <anycast>
      <queue name="QUEUE1">
   </anycast>
</address>

【讨论】:

  • 感谢您的回答。所以要在 Artemis 中创建一个主题,我只需要创建一个带有多播标签的地址,而不是创建一个队列?抱歉,我真的不明白 Topic 在 Artemis 版本上的工作原理。
  • 是的。要在 Artemis 中创建 JMS 主题,只需创建一个支持 multicastaddress。不需要任何队列,因为队列将在订阅者连接时由代理自动创建。然后发送到该地址的任何消息将被放置在所有订阅者的所有队列中。此信息在the documentation 中注明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2014-08-03
  • 1970-01-01
  • 2023-03-04
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多