BeanCreationNotAllowedException
It can be easily reproduced with Boot 2.0.4
or 1.5.14
(ie Spring Cloud Edgware.SR4
or Finchley.SR1
)
(1) public synchronized void shutdown() {
(2) if (isShutdown.compareAndSet(false, true)) {
(3) logger.info("Shutting down DiscoveryClient ...");
(4)
(5) if (statusChangeListener != null && applicationInfoManager != null) {
(6) applicationInfoManager.unregisterStatusChangeListener(statusChangeListener.getId());
(7) }
原因:
Let's recap:
- DiscoveryClient.shutdown() is invoked during the application context shutdown/close process
- DiscoveryClient needs to unregister from the ApplicationInfoManager
- applicationInfoManager is refresh-scoped, its target must be resolved for every method invocation
- the resolution fails with a BeanCreationNotAllowedException because the BeanFactory is in closing state.
归纳: applicationInfoManager是refreshscoped bean, 每次调用进行bean的重新加载,关闭服务期间重新生成bean, 导致该异常, 在后续版本中进行了修复.
修复提交 : https://github.com/spring-cloud/spring-cloud-netflix/commit/0c3fbc34f6b906bbe5ffc0a6ac5900357b67c72a