2014-12-18 2 views
0

다양한 게이트웨이와 서비스 활성기로 구성된 스프링 통합 프로젝트에서 애플리케이션 컨텍스트를 새로 고칩니다. 새로 고침은 처음에는 문제가 없지만 이후의 새로 고침 (이 간격을두고 완료)에서이 예외가 발생합니다.스프링 통합 : 애플리케이션 컨텍스트 새로 고침시 예외 발생하기 2 회째

컨트롤러 :

@RequestMapping(value = "/contextReload", method = RequestMethod.GET) 
public String contextReload() throws Exception { 
    LOG.info(" Reloading Application Context"); 
    refreshAsync(); 
    return "responseOK"; 
} 

private void refreshAsync() { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(REFRESH_WAIT_TIME_MILLIS); //This fixed the issue 
       getContextService().refresh(); 
      } catch (Exception e) { 
       LOG.error("Error in refreshing context: ", e); 
      } 
     } 
    }).start(); 
} 

ApplicationContextService

public synchronized void refresh(){ 
    /*Refresh from top to bottom such that child context beans 
    * have new parent bean reference*/ 
    while(!appContexts.isEmpty()){ 
     ConfigurableApplicationContext ctx = (ConfigurableApplicationContext)appContexts.pop(); 
     LOG.info("Refreshing context: "+ctx); 
     ctx.refresh(); 
     LOG.info("Finished refreshing context: "+ctx); 
    } 
    LOG.info("Context refresh complete!"); 
} 

예외 로그 :

org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'org.springframework.integration.config.IdGeneratorConfigurer#0': Singleton bean creation not allowed while the singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:212) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:148) 
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:86) 
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324) 
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:326) 
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:326) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:919) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:91) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:662) 

모든 포인터 왜 이런 일이 수에 관해서는?

+0

예외의 첫 번째 라인으로가는 호출 할 수 있습니다, 당신이 파괴 된 이전의 상황에서 콩의 모든 전에 새로운 컨텍스트를 만드는 것으로 생각된다. 문맥을 상쾌하게하는 방법을 * 표시하는 것이 좋습니다. 이전 컨텍스트가 파괴되지 않은 이유는 이전 컨텍스트의 빈에 대한 참조를 유지하는 스레드가 여전히 실행되고 있다는 것입니다. 이것들은 당신의 스레드일지도 모르지만 Spring Integration 내에서 비동기 처리 쓰레드 일 가능성이 높습니다. – Steve

답변

1

모든 이전 싱글 톤의 파괴가 완료 될 때까지 기다려야합니다.

분리가 깨끗하지 않았습니다. 어느 bean이 파괴되지 않았는지 보려면 클래스 DefaultSingletonBeanRegistry의 로깅 출력을 늘리십시오.

또한

@Component 
    public class MyStopApp implements ApplicationListener<ContextClosedEvent> (... 
    @Autowired 
    DefaultSingletonBeanRegistry registry; 

    public void onApplicationEvent(final ContextClosedEvent event){ 
    registry.destroySingletons(); 
    } 
+0

이유가 있습니다. 이것은 봄 mvc 응용 프로그램입니다. 다른 스레드에서 컨텍스트 새로 고침을 호출하고 새로 고침을 마칠 때까지 기다리지 않고 컨트롤러에서 돌아 오는 중입니다. 컨트롤러가 반환했을 때 리프레시 스레드가 리프레시 중이고 컨트롤러 스레드가 리턴 중일 때 예외가 발생했습니다. 웹 필터가 특정 빈에 액세스하려고 했으므로 예외가 발생했습니다. 새로 고침을 시작하기 전에 2 초 동안 새로 고침 스레드를 잠자기 상태로 만들었습니다. 이번에는 tomcat 컨트롤러 스레드가 http 요청 흐름을 완료 할 수 있습니다. –

+0

좋아, 제발이 의견에 쓰지 말고, 당신 자신의 질문에 답하십시오. –

관련 문제