【发布时间】:2016-12-13 09:55:48
【问题描述】:
我有一个 spring 应用程序,并且有一个预定逻辑以固定速率生成原型 bean。
在我的笔记本电脑上一切正常,但在将其部署到服务器后,我的应用无法启动,原因是:
2016-12-13 04:13:01.885 ERROR 4688 --- [TaskScheduler-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task.
...
BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'metaDataSourceAdvisor': 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!)
...
这是第一个预定通话。看起来是时间问题。在我的笔记本电脑上,应用程序的初始化速度要快得多,并且第一次计划调用(生成原型 bean)没有发生任何错误。
有没有办法了解 Spring bean 创建流程的当前状态,以便我可以在预定逻辑中检查它并且在应用程序创建未完成时不产生任何结果?
谢谢!
【问题讨论】:
-
您需要发布完整的调用堆栈。你能写更多关于你的笔记本电脑环境和服务器环境之间的差异吗?服务器是 servlet/应用程序容器吗?它与用于开发的服务器是否不同?
-
嗨,克劳斯!我的问题是:我可以注入任何开箱即用的 spring 核心 bean,它会在我的计划逻辑中告诉我 Spring 应用程序初始化的当前状态吗?因为我不想在应用未初始化时生成原型bean
-
我在 SO 上有 cmets,所以请参阅下面的答案。基本上上下文创建是单线程的。如果您调用 ApplicationContext.getBean() ,请确保执行此操作的线程与 spring 上下文的生命周期同步。如果线程由 servlet-container 或类似的运行时提供,您可以使用 AbstractApplicationContext.isActive() 和 .isRunning(),但与所有并发编程一样,上下文可能在您读取状态后关闭,所以为了安全起见应该只对 spring 管理的线程执行 spring 操作。
标签: java spring spring-bean spring-ioc