天天看點

【Java web應用線上問題排查】spring異常BeanCreationNotAllowedException

在釋出線上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)

  • 搜了下資料排查了下原因:
    1. Tomcat伺服器關閉;
    2. 線程池threadpooltaskexecutor繼續運作“waitfortaskstocompleteonshutdown”和“awaitterminationseconds”;
    3. 請求打到伺服器上時,在應用程式啟動之前通路了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