Я работаю над большим приложением, которое инициализирует различные модули путем запуска событий с помощью ApplicationEventPublisher из расширения Task, например так:
class StartupTask extends Task<Void>
{
@Override
protected Void call() throws Exception
{
logEntryService.logDebug(LogEntrySource.SERVICE, LogEntryType.CORE, "Publishing startup events", log);
try
{
updateMessage("Starting Communications");
publisher.publishEvent(new StartCommunicationsEvent(this));
updateProgress(1, 8);
TimeUnit.SECONDS.sleep(5);
updateMessage("Starting Messaging");
publisher.publishEvent(new StartMessagingEvent(this));
updateProgress(2, 8);
//6 more of these...
}
catch (Exception ex)
{
//Log stuff
}
return null;
}
}
Затем у меня есть класс контроллера для каждого модуля, который слушает Указанные события и инициализируют различные компоненты каждого модуля, например так:
@EventListener(StartMessagingEvent.class)
public void startMessaging()
{
//Do stuff
}
Проблема возникает при попытке синхронизировать эти события вместе. Разным модулям требуется разное количество времени для полной инициализации, и на данный момент я просто угадываю количество сна и надеюсь на лучшее. Я думал о том, чтобы запустить событие обратно из класса контроллера, когда он завершит инициализацию соответствующих компонентов (например, событие MessagingProcessStarted), но я не хочу загрязнять мой очень чистый код дополнительными методами или классами, просто чтобы выступать в качестве слушателей этих новых событий. , Есть ли способ для вызывающего метода каким-то образом узнать, когда выполняется контроллер, нигде не ссылаясь на его класс?