Spring引导:当Webhere应用程序服务器启动时自动启动应用程序?

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

假设我有一个SpringBoot应用程序作为WAR部署到WebSphereApplicationServer(WAS)。这场战争包含一个守护进程,因此它必须在WAS启动时立即启动(并且只启动一次)。

但是,我仍然需要通过执行http请求来激活SpringBoot Servlet

现在我明白了servlet的概念是处理http请求,我仍然希望在appserver start上自动启动它。这使得我的守护进程可以从独立的jar/main移植到war/webapp。

我尝试了一个
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);
        }
    };
}