如何在不消耗事件的情况下监听事件
Posted
技术标签:
【中文标题】如何在不消耗事件的情况下监听事件【英文标题】:How to listen to events without consuming them 【发布时间】:2022-01-14 10:31:36 【问题描述】:我正在开发一个 Java 模拟器,该模拟器使用 ActiveMQ 在各个部分之间进行通信,这些部分将存在于不同的机器上。我的大部分工作都已启动并正在运行,但客户要求其中一项服务记录所有通过的事件。问题是,据我了解,在队列模式下(我正在使用的代码中的默认设置),一旦读取,事件就会被消耗。有没有办法“偷看”事件而不消耗它?我考虑过阅读它,然后重新记录它,但感觉这需要额外的检查以确保记录服务不会再次抓取它。
【问题讨论】:
我建议您添加更多标签,例如关注语言 谢谢。我没想过这样做。 你使用的是什么版本的 ActiveMQ? 【参考方案1】:请考虑,在您的设计中,您可能有多个事件流订阅者——应用程序使用消息,以及需要跟踪信息的日志服务。允许日志服务接收他们自己的消息副本,并且他们可以根据需要存储或丢弃
查看Virtual Topic 模式——将消息发送到主题并从队列中读取。通过这种设计,您可以随时添加其他订阅者,并为日志记录服务提供他们自己的消息副本。
编辑:
此外,您可以配置复合目标以将消息副本发送到第二个队列。
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeQueue name="APP.DATA.IN" forwardOnly="false">
<forwardTo>
<queue physicalName="APP.DATA.IN.LOGGING.SERVICE" />
</forwardTo>
</compositeQueue>
</virtualDestinations>
</virtualDestinationInterceptor>
这需要为您想要第二个副本的每个队列手动添加。使用虚拟主题方法,您无需为每个主题添加配置。
【讨论】:
【参考方案2】:如果您使用的是 Java,并且由于您使用的是队列,那么您可以使用 JMS QueueBrowser
。它将允许您检查队列中的消息,而无需实际使用它们。
您也可以考虑使用mirrored queue,因为它在设计时就考虑到了这种类型的用例。
【讨论】:
以上是关于如何在不消耗事件的情况下监听事件的主要内容,如果未能解决你的问题,请参考以下文章