2015-01-20 2 views
1

У меня есть MBassador 1.2.0 событие, но создать с типом пользовательского сообщения (интерфейс Message):MBassador отправляет только одно сообщение, если в режиме отладки

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

Всякий раз, когда мой Swing UI выбирает файлы, я добавить их на карту объектов файловой инкапсуляции, а затем отправить сообщение с новыми значениями:

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

в моем главном классе панели, у меня есть слушатель боб, чтобы слушать за это сообщение:

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

Конечно зарегистрировать этот компонент в качестве абонента, когда моя панель инициализации:

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

Когда я запускаю эту программу нормально, первый раз я выбираю файлы, которые я получаю сообщение журнала говорит мне количество файлов, которые я выбран. Но если я вернусь и выберу тот же самый файл, я не получу дальнейших сообщений журнала! (В соответствии с кодом, даже если новые файлы не добавлены, событие должно быть опубликовано с общим количеством выбранных файлов.)

Вот где странно, если я поставил точку останова в том месте, где я отправляю сообщение messsage и один в обработчике сообщений, а затем я запускаю приложение в режиме отладки, оба точки останова попадают каждый раз, когда я выбираю файл, и сообщение журнала также печатается каждый раз! Но если я продолжаю в режиме отладки и удаляю точку останова в обработчике сообщений, приложение попадает в точку останова, где отправляется сообщение, но сообщение журнала никогда не печатается. Даже если я положил точку останова назад в обработчике сообщений, точка останова обработчика сообщения никогда не попадает!

Такое поведение возникает, если я отправляю сообщение синхронно или асинхронно.

Я понимаю, что способ, которым я создал MBassador, устарел, и у меня есть asked о том, как создать экземпляр шины событий (поскольку онлайн-документация устарела и некорректна). Но это все еще не объясняет это странное поведение.

Любая идея, почему только первое сообщение проходит --- но работает нормально, пока я в режиме отладки с установленными точками останова?

ответ

1

Ответ ударил меня, прежде чем я даже встал с постели сегодня утром. По умолчанию MBassador использует слабые ссылки, поэтому я уверен, что компонент-слушатель собирался в мусор. Точка останова в отладчике должна была поддерживать ее дольше. Я только удивляюсь, почему она так долго висела и не сразу освободилась. Но в любом случае, я подтвердил, что @Listener(references = References.Strong) в классе bean-компонента приводит к ожидаемому поведению.

Смежные вопросы