Spring引导:当Webhere应用程序服务器启动时自动启动应用程序?
假设我有一个SpringBoot应用程序作为WAR部署到WebSphereApplicationServer(WAS)。这场战争包含一个守护进程,因此它必须在WAS启动时立即启动(并且只启动一次)。 但是,我仍然需要通过执行http请求来激活SpringBoot Servlet 现在我明白了servlet的概念是处理http请求,我仍然希望在appserver start上自动启动它。这使得我的守护进程可以从独立的jar/main移植到war/webapp。 我尝试了一个Spring引导:当Webhere应用程序服务器启动时自动启动应用程序?,spring,spring-boot,websphere,servlet-3.0,servletcontextlistener,Spring,Spring Boot,Websphere,Servlet 3.0,Servletcontextlistener,假设我有一个SpringBoot应用程序作为WAR部署到WebSphereApplicationServer(WAS)。这场战争包含一个守护进程,因此它必须在WAS启动时立即启动(并且只启动一次)。 但是,我仍然需要通过执行http请求来激活SpringBoot Servlet 现在我明白了servlet的概念是处理http请求,我仍然希望在appserver start上自动启动它。这使得我的守护进程可以从独立的jar/main移植到war/webapp。 我尝试了一个ServletConte
ServletContextListener
,但是contextinitialized
也只在第一个http请求时被调用
我没有web.xml(servlet 3)
代码:
以及:
当我开始时,我第一次得到这个:
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
您可以通过定制spring dispatch servlet来更改
loadOnStartup
,下面是示例问题,您可以使用代码
@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return new BeanFactoryPostProcessor() {
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bean = beanFactory.getBeanDefinition(
DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
bean.getPropertyValues().add("loadOnStartup", 1);
}
};
}
参考:
Upate
似乎有一种更简单的方法,您可以在application.properites
spring.mvc.servlet.load-on-startup=1
现在spring Boot中已经明确支持了这一点,只需设置spring.mvc.servlet.load-on-startup=1
这两种解决方案都不起作用。如果我使用上面的配置代码,并在返回之前放置一个println,那么在我发出HTTP请求之后、启动之后和启动之前,就会调用这个beanFactoryPostProcessor(因此正在调用它)。@robert for,也许您需要从WAS文档中检查server.xml中的
。@LipingHuang您可能应该在答案的顶部添加deferServletLoad详细信息,因为这是最相关的配置。
[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
@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return new BeanFactoryPostProcessor() {
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bean = beanFactory.getBeanDefinition(
DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
bean.getPropertyValues().add("loadOnStartup", 1);
}
};
}