是否有一种简单的方法来创建通过队列发送的每条消息的副本,以便在需要时,用户可以浏览以前传输的消息列表并通过单击按钮多次重播它们?
我有程序X向队列发送消息,程序Y然后读取它。我希望能够重放以前发送的消息,而不必返回程序X并再次重新生成它。 / p>
答案 0 :(得分:4)
如果你没有太多的消息或太多的队列,有很简单的入门方法。
首先,您可以设置将邮件复制到“复制队列”。使用此策略,每个队列必须执行一次。在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开头的队列。*
此路由需要一些复制队列名称的修复,但在priniple中它作为一次性配置进行窃听。
<route>
<from uri="activemq:FOO.>"/>
<setHeader headerName="CamelJMSDestination">
<simple>COPY.${header.JMSDestination}</simple>
</setHeader>
<to uri="activemq:dummy"/>
</route>
这里一个非常重要的方面是,如果您存储所有消息,您的服务器将随着时间的推移而填满。我建议您阅读ActiveMQ memory management或者只是在给定的时间范围内保留邮件副本。这可以自动化,因为发送系统实际上可以设置message expiry,以便在几天/几周/几个月后自动删除邮件。
答案 1 :(得分:0)
我担心没有简单的方法,因为这种行为会违反排队系统的想法。但是,您可以尝试一些事项:
QueueBrowser
来访问它们。但是,他们最终会超时send()
或preDispatch()
方法中拦截消息。在那里,您可以存储内容的副本。您还必须侦听重播请求并根据请求发送历史记录(您可以使用JMS消息头中的reply-to字段)。 ActiveMQ附带的统计插件是从这里开始的好资源。哦,当然你的服务器最终也会耗尽内存。