【问题标题】:Replay Messages sent over ActiveMQ重放通过 ActiveMQ 发送的消息
【发布时间】:2012-12-16 02:25:47
【问题描述】:

是否有一种简单的方法可以创建通过队列发送的每条消息的副本,以便在需要时,用户可以浏览先前发送的消息列表并通过单击按钮多次重播它们?

我有程序 X 将消息发送到队列,然后程序 Y 将其读入。我希望能够重播先前发送的消息,而不必返回程序 X 并重新生成它。

【问题讨论】:

    标签: java activemq


    【解决方案1】:

    如果您没有太多消息或太多队列,有一些简单的方法可以开始。

    首先,您可以设置将消息复制到“复制队列”。使用此策略,每个队列必须执行一次。像这样在activemq.xml

        <destinationInterceptors>
          <virtualDestinationInterceptor>
            <virtualDestinations>
              <compositeQueue name="INVOICE.OUT">
                <forwardTo>
                  <queue physicalName="INVOICE.IN" />
                  <queue physicalName="INVOICE.COPY" />
                </forwardTo>
              </compositeQueue>
            </virtualDestinations>
          </virtualDestinationInterceptor>
        </destinationInterceptors>
    

    然后使用工具浏览 COPY 队列上的消息,如果需要,将它们重新发送到 OUT 队列。我喜欢 Hermes JMS 工具来处理这些事情。

    如果您想要更花哨的东西,可以阅读mirrored queues

    还有另一种相当简单的方法可以轻松复制所有消息。

    使用与 activemq 捆绑的 apache-camel。 camel.xml 中的这个配置将实现所有消息的自动复制到以 FOO 开头的队列。* 这条路线需要对复制队列名称进行一些修复,但原则上它可以作为窃听的一次性配置。

    <route>
       <from uri="activemq:FOO.>"/>
       <setHeader headerName="CamelJMSDestination">
         <simple>COPY.${header.JMSDestination}</simple>
       </setHeader>
       <to uri="activemq:dummy"/>
    </route>
    

    这里的一个非常重要的方面是,如果您存储所有消息,您的服务器将随着时间的推移而填满。我建议您阅读ActiveMQ memory management,或者,在给定的时间范围内保留消息副本。这可以自动化,因为发送系统实际上可以设置message expiry,以便消息在几天/几周/几个月后自动删除。

    【讨论】:

    • 我喜欢这个想法并且已经实现了它,并且到目前为止运行良好。我遇到的唯一问题是 HermesJMS,将消息从一个队列复制到另一个队列时可能会非常缓慢。我将不得不寻找替代方案。感谢您的帮助。
    • 好!是的,hermes 不是最优的,但开源选项的数量非常少。 JMX 支持 + 一些自定义代码或一些商业替代。可能会完成这项工作
    【解决方案2】:

    恐怕没有简单的方法,因为这样的行为会违反排队系统的概念。但是,您可以尝试一些方法:

    1. 这有点棘手:将消息发送到持久队列(并确保消息本身是持久的)并禁用自动确认。如果您不确认任何消息,服务器将保留它们,您可以使用QueueBrowser 访问它们。但是,它们最终会超时
    2. 当每条消息到达程序 Y 时存储一份副本。实际上,您只需要存储一个引用以确保消息不会被垃圾回收。根据您的消息速率和可用内存,您最终将不得不清除消息
    3. 创建一个 ActiveMQ 插件。这绝对是三者中最精细和最复杂的。您将创建一个插件(有关如何创建这些插件,请参阅 ActiveMQ 的文档)并在插件的 send()preDispatch() 方法中拦截消息。您可以在其中存储其内容的副本。您还必须侦听重播请求并根据请求发送您的历史记录(您可以使用 JMS 消息头中的回复字段)。 ActiveMQ 附带的统计插件是一个很好的起点。哦,当然你的服务器最终也会耗尽内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2012-01-24
      • 2019-04-09
      • 2013-02-05
      • 2012-09-10
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多