MBean只发送一条消息,除非在调试模式下

时间:2015-01-20 03:06:47

标签: swing debugging mbassador

我有一个MBassador 1.2.0事件,但设置了自定义消息类型(接口Message):

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

每当我的Swing UI选择文件时,我将它们添加到文件封装对象的地图中,然后发送带有新值的消息:

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

在我的主面板类中,我有一个监听器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());

当我正常运行此程序时,第一次选择文件时,我会收到一条日志消息,告诉我我选择的文件数。但如果我回去选择完全相同的文件,我就不会再收到日志消息! (根据代码,即使没有添加新文件,仍应使用所选文件总数发布事件。)

这是奇怪的地方,如果我在发布消息处理器的地方放置一个断点,然后我在调试模式下运行应用程序,每次选择文件时都会触发两个断点,并且每次都会打印日志消息!但是,如果我继续处于调试模式并删除消息处理程序中的断点,应用程序将发布消息发布的断点,但永远不会打印日志消息。即使我将断点返回放在消息处理程序中,也不会再次命中消息处理程序断点!

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

我理解我建立MBassador的方式已被弃用,我asked关于创建事件总线实例的正确方法(因为在线文档已过期且不正确)。但这仍然无法解释这种奇怪的行为。

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

1 个答案:

答案 0 :(得分:1)

在我今天早上起床之前,答案打击了我。 MBassador默认使用弱引用,所以我确定监听器bean被垃圾收集。调试器中的断点必须保持更长时间。我只是想知道为什么它长时间悬挂并且没有立即释放。但无论如何,我已经验证bean类上的@Listener(references = References.Strong)会导致预期的行为。