Scala инициализация обратных вызовов событий в pub / подмодели

#java #scala #jvm

#java #scala #jvm

Вопрос:

У меня есть класс publisher, который создает события, и множество классов-слушателей, которые хотят подписаться на события, чтобы запускать свои собственные обратные вызовы.

Все эти классы прослушивателей известны заранее.

Каков наилучший способ для всех моих слушателей подписаться на издателя во время инициализации приложения? Я бы предпочел, чтобы весь код, специфичный для прослушивателя, был частью класса listener. Я думал, что слушатель может подписаться на издателя в статическом блоке (Object), но, насколько я понимаю, Java лениво загружает классы, поэтому нет гарантии, что все слушатели будут подписаны немедленно. Чтобы обойти это, я мог бы потенциально сделать что-нибудь, чтобы заставить JVM немедленно загрузить всех моих слушателей?

Есть ли что-то более простое, чего мне не хватает?

Ответ №1:

Используйте актеров! По одному участнику для каждого издателя и по одному участнику для каждого подписчика. Издатель поддерживает список подписчиков. Подписчики добавляются путем отправки сообщения издателю с чем-то вроде: pub! добавить (sub)

Когда издателю есть что опубликовать, он перебирает свой список подписчиков и сообщений каждого из них. Смотрите http://www.scala-lang.org/node/242 для вступления к актеру.

Комментарии:

1. Да, это интересная идея для реальной реализации pub / sub. Однако, учитывая реализацию pub / sub, издателя и подписчиков, я ищу способ для всех подписчиков легко подписаться во время инициализации приложения (изменил свой вопрос, чтобы прояснить это). Я хочу избежать наличия огромного блока кода в моем приложении init, который повторяет каждого определенного мной подписчика, вызывая pub! добавить (sub).

Ответ №2:

Лучше использовать какую-либо контролируемую среду выполнения, такую как OSGi или RCP, основу Eclipse. Они предлагают множество способов декларативного управления процессом загрузки приложения и установления зависимостей между модулями во время компиляции и выполнения.

Например, вы можете упаковать всех своих слушателей в виде отдельных пакетов, пометить все из них как загруженные не лениво и добавить подписывающийся код в перехватчики инициализации.