除非处于调试模式,否则 MBassador 只发送一条消息

MBassador only sends one message unless in debug mode

我有一个 MBassador 1.2.0 活动,但设置了自定义消息类型(界面 Message):

private final MBassador<Message> bus = new MBassador<Message>(BusConfiguration.SyncAsync());

每当我的 Swing UI selects 文件时,我将它们添加到文件封装对象的映射中,然后发送一条包含新值的消息:

getBus().post(new FilesSelectedMessage(fileObjectMap.values())).asynchronously();

在我的主面板 class 中,我有一个侦听器 bean 来侦听此消息:

private class MessageHandler {
  @Handler
  public void handleFilesSelected(final FilesSelectedMessage message) {
    getLogger().info("new files selected; count {}", message.fileObjects().size());
  };
}

当然,我在面板初始化时将该 bean 注册为订阅者:

getBus().subscribe(new MessageHandler());

当我 运行 这个程序正常时,第一次 select 文件时,我收到一条日志消息,告诉我我 select 编辑的文件数量。但是,如果我返回 select 完全相同的文件,我将不会收到更多日志消息! (根据代码,即使没有添加新文件,事件仍应 posted 与文件总数 selected。)

这就是奇怪的地方,如果我在 post 消息和消息处理程序中的位置放置一个断点,然后我 运行 处于调试模式的应用程序,两者每次我 select 文件时都会遇到断点,并且每次都会打印日志消息!但是如果我在调试模式下继续并删除消息处理程序中的断点,应用程序会在消息被 posted 的地方命中断点,但日志消息永远不会被打印出来。即使我将断点 back 放在消息处理程序中,消息处理程序断点也不会再命中!

无论我 post 同步还是异步发送消息,都会发生此行为。

我知道我构建 MBassador 的方式已被弃用,并且我 asked 了解创建事件总线实例的正确方法(因为在线文档已过时且不正确)。但这仍然不能解释这种奇怪的行为。

知道为什么只有第一条消息通过 --- 但是只要我处于设置了断点的调试模式就可以正常运行吗?

今天早上我还没起床,这个答案就打动了我。 MBassador 默认使用弱引用,所以我确定侦听器 bean 正在被垃圾收集。调试器中的断点必须让它保持更长时间。我只是想知道为什么它会挂那么久而没有立即发布。但无论如何,我已经验证了 bean class 上的 @Listener(references = References.Strong) 会导致预期的行为。