在釋出線上web應用時遇到BeanCreationNotAllowedException報錯,具體資訊如下:
org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name ‘transactionManagerMopay’: 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:210)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:331)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:250)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy. Proxy113.updateApprovalStatus(UnknownSource)atcom.dianping.tp.dock.facade.service.impl.SolutionFacadeServiceImpl.updateApprovalStatus(SolutionFacadeServiceImpl.java:621)atsun.reflect.GeneratedMethodAccessor278.invoke(UnknownSource)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atjava.lang.reflect.Method.invoke(Method.java:606)atorg.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)atorg.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)atorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)atcom.dianping.combiz.aop.MethodExceptionLogInterceptor.invoke(MethodExceptionLogInterceptor.java:46)atorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)atorg.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)atorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)atorg.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)atcom.sun.proxy. Proxy122.updateApprovalStatus(Unknown Source)
at com.dianping.tp.dock.facade.service.impl.ProcessServiceAgentImpl.syncProcessStatus(ProcessServiceAgentImpl.java:35)
at com.dianping.tp.dock.facade.mq.consumer.BaseListener.onMessage(BaseListener.java:79)
at com.dianping.tp.dock.facade.mq.consumer.CreateListener.onMessage(CreateListener.java:10)
at com.dianping.swallow.consumer.internal.task.AbstractConsumerTask 1.doAction(AbstractConsumerTask.java:58)atcom.dianping.swallow.consumer.internal.action.AbstractRetryWrapper.doAction(AbstractRetryWrapper.java:39)atcom.dianping.swallow.consumer.internal.task.AbstractConsumerTask.doConsumerTask(AbstractConsumerTask.java:52)atcom.dianping.swallow.consumer.internal.task.DefaultConsumerTask.run(DefaultConsumerTask.java:44)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)atjava.util.concurrent.ThreadPoolExecutor Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
- 搜了下資料排查了下原因:
- Tomcat伺服器關閉;
- 線程池threadpooltaskexecutor繼續運作“waitfortaskstocompleteonshutdown”和“awaitterminationseconds”;
- 請求打到伺服器上時,在應用程式啟動之前通路了bean,這個時候由于Tomcat還未啟動是以還無法建立bean,抛出beanCreationNotAllowedException是因為任務執行個體還需要在使用的bean注入範圍内。
- 建議的解決方法:就是防止如tomcat關閉且在bean factory銷毀期間,正在進行任務的線程池中通路應用,可以在伺服器設定Tomcat選項或任何伺服器選項,優化Nginx負載均衡配置一類方法,并将部署時間重置為更長的部署時間。例如Tomcat将解除安裝任何應用程式的執行個體和再啟動,提供更長所需要的時間來啟動Tomcat。
參考:https://stackoverflow.com/questions/24545702/org-springframework-beans-factory-beancreationnotallowedexception-error-creatin
https://jira.spring.io/browse/SPR-9512