【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

你可能感兴趣的:(问题排查,spring)