1

SpringBoot 응용 프로그램을 WAR (Websphere Application Server)에 배포했다고 가정합니다. 이 WAR에는 데몬이 포함되어 있으므로 은 WAS가 시작되면 바로 시작해야합니다 (한 번만).스프링 부트 : Webshere Application Server가 시작될 때 자동으로 응용 프로그램을 시작 하시겠습니까?

그러나 http 요청을 수행하여 SpringBoot Servlet을 활성화해야합니다.

서블릿의 개념이 http 요청에 따라 작동한다는 것을 알았으므로 여전히 appserver start에서 자동 시작되도록하고 싶습니다. 이것은 내 데몬을 독립 실행 형 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) { 
     // 
    } 
} 

과 : 내가 먼저 얻을 WAS 시작

@Component 
public class DemoRunner implements ApplicationRunner { 

    @Override 
    public void run(ApplicationArguments arg0) throws Exception { 
     System.err.println("I AM RUNNING"); 
    } 

} 

: 내 봄 부팅 응용 프로그램의 시작을 얻으려면

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. 

, I 먼저이 링크 (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 

답변

1

당신은 봄 파견 서블릿을 사용자 정의로 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); 
     } 
    }; 
} 

참조 사용할 수 있습니다 how to configure 'dispatcherServlet' load on startup by spring boot?

Upate

에게

더 간단한 기능이있는 것 같습니다. 제작 방법, 당신은 지금, 바로 '설정 그 물건에 대한 봄 부팅에 명시 적으로 지원이 있습니다 application.properites

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

+0

에서을 config (설정) 할 수있다 spring.mvc.servlet.load -에 - 시작 = 1' –

+0

그 2 솔루션이 작동하지 않습니다. 위의 config-code를 사용하고 리턴 직전에 println을 배치하면,이 beanFactoryPostProcessor는 HTTP 요청을 한 후, 스플래쉬 직후와 onstartup 전에 호출됩니다 (그래서 호출됩니다). – robert

+1

@robert for WAS, 아마도 server.xml의''를 WAS 문서에서 검사 할 필요가있을 것이다. –