Проект - это война с использованием местного кота
Мне интересно, как запустить метод автоматически после запуска сервера? Я знаю способы запустить его ВО ВРЕМЯ запуска сервера, например метод @Bean или во время инициализации контекста, но как я могу это сделать ПОСЛЕ успешного запуска сервера?
Насколько я понял, вы используете Spring. Таким образом, вы можете просматривать события контекста приложения Spring. Например, вы можете определить метод прослушивания событий следующим образом.
@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
System.out.println("Context Start Event received.");
}
В Tomcat вы можете использовать собственный Жизненный циклПрослушиватель Tomcat. Если вы зарегистрируете слушателя для AFTER_START_EVENT на хост-компоненте, вы должны получить то, что хотите.
Пример кода LifecycleListener:
package my.sourcecode;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleListener;
public class TomcatHostLifecycleListener implements LifecycleListener {
@Override
public void lifecycleEvent(LifecycleEvent lifeCE) {
if (Lifecycle.AFTER_START_EVENT.equals(lifeCE.getType())) {
System.out.println("************ TomcatHostLifecycleListener: After Start Event");
}
}
}
Код должен быть помещен в виде JAR-файла в глобальную папку lib Tomcat!
LifecycleListener должен быть зарегистрирован в Tomcats сервер.xml, в вашем случае внутри элемента хоста, потому что мы хотим прослушивать запуск хоста:
....
<Host ... >
<Listener className = "my.sourcecode.TomcatHostLifecycleListener"/>
....
См. Lifecycle-Doc для получения дополнительной документации.
(Протестировано с Tomcat 8.5.30 и Java 11)
При использовании Spring Boot добавление аннотации @PostConstruct к методу приводит к его запуску после запуска приложения Spring Boot.
Spring не может узнать, когда открыт порт прослушивания Tomcat, ContextStartedEvent может произойти до того, как порт будет открыт.