【问题标题】:How to create/preconfigure durable subscriber(s) in activemq.xml so that these subscriptions are ready upon ActiveMQ starts up?如何在 activemq.xml 中创建/预配置持久订阅者,以便在 ActiveMQ 启动时准备好这些订阅?
【发布时间】:2012-07-04 09:52:21
【问题描述】:

如何在 activemq.xml 中创建/预配置持久订阅者,以便在 ActiveMQ 出现时这些订阅准备就绪?好像订阅者处于离线状态。

我们预计已知订阅者的数量是固定的(但可配置)。 想要缓冲发布者从第 1 天开始发送的所有消息,以防不是所有订阅者 起来了。不确定这是否是常见情况,但提前感谢您的帮助。

【问题讨论】:

  • 这是以数据为中心的分布式系统的常见场景,作为一个仅供参考,当使用使用 Durability QoS 的 OMG DDS 实现时,您的用例很容易实现。请参阅OMG Data Distribution Service portal 了解更多信息。

标签: java jms activemq publish-subscribe subscriber


【解决方案1】:

您可以考虑使用持久队列(而不是主题)并使用队列浏览器(订阅者)来接收消息。跟踪序列号的责任在订阅者一方(不确定在您的情况下是否可行)。队列浏览器不会从持久队列中删除消息。您要么必须使用有时间的消息,要么可能在特定时间段后使用常规队列订阅者来清除旧消息。

具有持久队列的队列浏览器对服务器的负担较小 - 但您将更多负载推给订阅者。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    这是一个非常常见的用例。您实际上应该查看的是composite destinations,而不是持久主题(此功能存在大量问题,主要问题是默认情况下消息未持久化,因此无法在代理中断中幸存)。

    使用此方案,您可以设置一个复合主题,将每条消息转发到多个队列 - 每个订阅者都有一个专用队列。

    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <compositeTopic name="orders">
            <forwardTo>
              <queue physicalName="orders.consumer1" />
              <queue physicalName="orders.consumer2" />
            </forwardTo>
          </compositeTopic>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors>
    

    这样,当您的订阅者最终连接到自己的队列时,它会耗尽输入的消息。

    请注意,请确保您的memory limits are large enough 处理存储在这些队列中的消息,否则您的代理将出现挂起(称为生产者流控制的代理功能)。

    我看到您是新用户,所以如果这回答了您的问题,请打勾。

    【讨论】:

    • 感谢您的回答。在什么情况下我们会使用 pub/durable sub 而不是虚拟主题?到目前为止,我对虚拟主题的印象似乎总体上是一种更好的发布/订阅方法,唯一的区别是由队列支持?
    • 在实践中,我总是偏爱虚拟主题。我能想到的唯一可以考虑持久主题的用例,例如连接到代理的 Web 客户端,几乎总是由追溯消费者提供更好的服务。虚拟主题更容易思考,可以通过 JMX 检查,可以连接池,在代理网络中正常工作,并在它们上设置目标策略(如消息到期、内存限制和 DLQ)。简而言之,他们在各个方面都好得多。如果有帮助别忘了投票!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2015-08-24
    • 2016-01-14
    • 1970-01-01
    • 2017-02-20
    • 2014-10-12
    相关资源
    最近更新 更多