You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何重复接收事件?代码日志显示事件重复触发问题求助

可能导致事件重复接收的原因及排查方案

从你提供的代码片段来看,最常见的原因是事件监听器被重复注册,下面是具体分析和解决思路:

1. 监听器被多次绑定

你的代码里有两个和监听相关的方法:实例方法listen()和静态方法static async listen(args)。如果这两个方法被分别调用,或者同一个监听逻辑被执行了多次(比如多次实例化CommodityRegistry并调用listen()),就会导致同一个event事件被绑定多个相同的回调函数。当事件触发时,所有绑定的回调都会执行,自然就会看到重复的日志输出。

你可以先在listen()方法开头加一行日志排查:

listen() { 
  LOG.info('listen method executed'); // 新增这行,观察是否输出多次
  LOG.info('Awaiting events'); 
  this.bizNetworkConnection.on('event', (event) => { 
    LOG.info('************Received Event**************'); 
    LOG.info(event); 
    let options = { properties: { key:'value'} }; 
  }); 
}

如果运行时看到多次listen method executed,那基本可以确定是重复绑定的问题。

2. 框架层面的重复推送(概率较低)

如果排除了代码重复绑定的情况,那可能是你使用的业务网络框架(比如Hyperledger Fabric的商业网络连接)本身存在事件重复推送的问题,但这种情况比较少见,建议优先排查代码层面的问题。

解决方法

  • 确保监听器只绑定一次:可以把监听器绑定逻辑放到init()方法里(因为init()是异步且应该只执行一次),而不是单独的listen()方法,避免重复调用绑定。
  • 用once替代on测试:临时把on改成once,如果事件只触发一次,就能确认是重复绑定的问题。
  • 添加绑定标志位:在实例中加一个变量比如this.eventListened = false,在listen()里先判断,如果已经绑定过就不再执行绑定逻辑:
listen() { 
  if (this.eventListened) return;
  this.eventListened = true;
  LOG.info('Awaiting events'); 
  this.bizNetworkConnection.on('event', (event) => { 
    LOG.info('************Received Event**************'); 
    LOG.info(event); 
    let options = { properties: { key:'value'} }; 
  }); 
}

内容的提问来源于stack exchange,提问作者Dennis Miller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:56:42