Spring boot: запускать приложение автоматически при запуске сервера приложений Webshere?

Предположим, у меня есть приложение 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

person robert    schedule 02.09.2016    source источник


Ответы (1)


Вы можете изменить loadOnStartup, настроив сервлет отправки Spring, вот пример вопроса, и вы можете использовать код

@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);
        }
    };
}

Ссылка: как настроить загрузку 'dispatcherServlet' при запуске с помощью весенний ботинок?

Обновить

Кажется, есть более простой способ, вы можете настроить его в application.properites

spring.mvc.servlet.load-on-startup=1

person Liping Huang    schedule 02.09.2016
comment
В Spring Boot сейчас есть явная поддержка этого материала, просто установите spring.mvc.servlet.load-on-startup=1 - person Stephane Nicoll; 02.09.2016
comment
Эти 2 решения не работают. Если я использую приведенный выше код конфигурации и помещаю println непосредственно перед возвратом, тогда вызывается этот beanFactoryPostProcessor (так он вызывается) после того, как я сделал HTTP-запрос, сразу после заставки и перед запуском. - person robert; 02.09.2016
comment
@robert для WAS, возможно, вам нужно проверить <webcontainer deferservletload="false"/> в server.xml из документации WAS. - person Liping Huang; 02.09.2016
comment
@LipingHuang Вам, вероятно, следует добавить деталь deferServletLoad в начало вашего ответа, поскольку это наиболее важная часть конфигурации. - person Brett Kail; 03.09.2016