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

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,因为它在设计时就考虑到了这种类型的用例。

【讨论】:

以上是关于如何在不消耗事件的情况下监听事件的主要内容,如果未能解决你的问题,请参考以下文章

js中如何在不影响既有事件监听的前提下新增监听器

今日说说| js中如何在不影响既有事件监听的前提下新增监听器

cloneNode 不会丢失事件监听器

监听滑动事件而不消耗任何触摸事件

怎样理解js中的事件监听

在测试 Laravel 时有没有办法伪造特定的事件监听器?