重播通过ActiveMQ发送的消息

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

我有程序X向队列发送消息,程序Y然后读取它。我希望能够重放以前发送的消息,而不必返回程序X并再次重新生成它。

如果你没有太多的消息或太多的队列,有很简单的入门方法。

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

              

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

如果你想要更精彩的东西,你可以阅读镜像队列 。

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

使用与activemq捆绑在一起的apache-camel。 camel.xml此配置将实现所有消息自动复制到以FOO开头的队列。*此路由需要一些复制队列名称的修复,但在原理中它作为一次性配置用于窃听。

    COPY.${header.JMSDestination}    

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

我担心没有简单的方法,因为这种行为会违反排队系统的想法。 但是,有些事情你可以尝试:

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