Предположим, у меня есть приложение SpringBoot, развернутое как WAR для Websphere Application Server (WAS). Эта WAR содержит демона, поэтому он должен запускаться сразу после запуска WAS (и только один раз).
Однако мне все еще нужно активировать сервлет SpringBoot, выполнив HTTP-запрос.
Теперь я понимаю, что концепция сервлетов состоит в том, чтобы работать с HTTP-запросами, я все еще хочу, чтобы они запускались автоматически при запуске сервера приложений. Благодаря этому мой демон переносится из автономного jar / main в war / webapp.
Я пробовал ServletContextListener
, но contextInitalized
также вызывается только при первом HTTP-запросе.
У меня нет web.xml (сервлет 3).
Код:
@SpringBootApplication
@WebListener
public class DemoApplication extends SpringBootServletInitializer implements ServletContextListener {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.err.println("ONSTARTUP");
super.onStartup(servletContext);
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.err.println("contextInitialized");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
//
}
}
и:
@Component
public class DemoRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments arg0) throws Exception {
System.err.println("I AM RUNNING");
}
}
Когда я начинаю WAS, я сначала получаю следующее:
Launching defaultServer (WebSphere Application Server
16.0.0.2/wlp-1.0.13.cl160220160526-2258) on Java HotSpot(TM) 64-Bit Server VM, version 1.7.0_79-b15 (en_US)
[...]
[AUDIT ] CWWKT0016I: Web application available (default_host): http://localhost:9080/demo/
[AUDIT ] CWWKZ0001I: Application test started in 17,282 seconds.
Чтобы запустить приложение Spring Boot, мне сначала нужно перейти по этой ссылке (http: / localhost: 9080 / demo /). Затем он начинает катиться, начиная с метода запуска, как вы можете видеть в журнале. Но как я могу начать работу без HTTP-запроса?
[err] ONSTARTUP
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.4.0.RELEASE)
2016-09-02 10:45:52.670 INFO 23716 --- [dPool-thread-48] com.example.DemoApplication : Starting DemoApplication on [...]
2016-09-02 10:45:58.019 INFO 23716 --- [dPool-thread-48] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0
[...]
[err] I AM RUNNING
[...]
2016-09-02 10:45:58.093 INFO 23716 --- [dPool-thread-48] com.example.DemoApplication : Started DemoApplication in 6.372 seconds (JVM running for 31.549)
[...]
[err] contextInitialized
[err] contextInitialized