如何在不消耗事件的情况下收听事件

How to listen to events without consuming them

我正在 Java 开发一个模拟器,它使用 ActiveMQ 进行各个部分之间的通信,这些部分将存在于不同的机器上。我大部分时间都在 运行,但客户要求其中一项服务记录所有发生的事件。问题是,据我所知,在队列模式下(我正在使用的代码中的默认设置),一旦读取,事件就会被消耗掉。有没有办法在不消耗事件的情况下“窥视”事件?我考虑过阅读它,然后重新记录它,但感觉这需要额外的检查级别以确保日志记录服务不会再次抓取它。

考虑到在您的设计中,您可能有多个事件流订阅者——应用程序使用消息,以及需要跟踪信息的日志记录服务。允许日志服务接收他们自己的消息副本,并且他们可以根据需要存储或丢弃

查看 Virtual Topic 模式 -- 将消息发送到主题并从队列中读取。通过这种设计,您可以随时添加其他订阅者并为日志记录服务提供他们自己的消息副本。

编辑:

此外,您可以配置复合目标以将邮件副本发送到第二个队列。

<destinationInterceptors>
  <virtualDestinationInterceptor> 
    <virtualDestinations> 
      <compositeQueue name="APP.DATA.IN" forwardOnly="false"> 
        <forwardTo>
          <queue physicalName="APP.DATA.IN.LOGGING.SERVICE" />
        </forwardTo>
     </compositeQueue>
   </virtualDestinations>
 </virtualDestinationInterceptor>

这需要为每个您想要第二个副本的队列手动添加。使用虚拟主题方法,您无需为每个主题添加配置。

如果您正在使用 Java 并且因为您正在使用队列,那么您可以使用 JMS QueueBrowser。它将允许您检查队列中的消息而无需实际使用它们。

您也可以考虑使用 mirrored queue,因为它是为此类用例设计的。

最终,由于定义哪些服务将接收哪些主题的简单性,以及当前设置的消息消耗速度几乎尽可能快,我最终选择了发布者和列出的订阅者的 Topic 设置被生产。我所要做的就是让日志模块订阅所有定义的消息,以及任何其他接收它们的模块。