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) }
the reason:
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.
Summarized: applicationInfoManager is refreshscoped bean, bean calls every reload, rebuild service during the shutdown bean, causes the exception, then restored in subsequent editions.
Repair submit: https://github.com/spring-cloud/spring-cloud-netflix/commit/0c3fbc34f6b906bbe5ffc0a6ac5900357b67c72a