重播通过ActiveMQ发送的消息

use*_*583 5 java activemq-classic

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

我有一个将消息发送到队列和程序y时,读取它的程序X,我希望能够重播以前,而不必返回到程序X,并再次重新生成发送的消息.

Pet*_*der 4

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

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

    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <compositeQueue name="INVOICE.OUT">
            <forwardTo>
              <queue physicalName="INVOICE.IN" />
              <queue physicalName="INVOICE.COPY" />
            </forwardTo>
          </compositeQueue>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors>
Run Code Online (Sandbox Code Playgroud)

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

如果您想要更奇特的东西,您可以阅读镜像队列

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

使用与 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>
Run Code Online (Sandbox Code Playgroud)

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