Весна - Как запустить событие и знать, что слушатель (ы) выполняется? - PullRequest
0 голосов
/ 29 января 2020

Я работаю над большим приложением, которое инициализирует различные модули путем запуска событий с помощью 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), но я не хочу загрязнять мой очень чистый код дополнительными методами или классами, просто чтобы выступать в качестве слушателей этих новых событий. , Есть ли способ для вызывающего метода каким-то образом узнать, когда выполняется контроллер, нигде не ссылаясь на его класс?

...