除非处于调试模式,否则 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)
会导致预期的行为。
我有一个 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)
会导致预期的行为。