У PrometheusMetricsExportAutoConfiguration
действительно есть проблема:
(Не запрашивайте bean-компонент в BeanFactory в реализации метода уничтожения!)
shutdown()
вызывает push();
, который в конечном итоге выполняет DefaultGauge.value()
, и он точно такой же, как лямбда в этом вызове:
this.metricsCaptor.gaugeBuilder("spring.integration.channels", this,
(c) -> this.applicationContext.getBeansOfType(MessageChannel.class).size())
.description("The number of message channels")
.build();
В соответствии с этим исправлением в Spring Framework мы не можем вызвать getBean()
из BeanFactory
при его уничтожении.
Я не вижу простого исправления для вас, если только вы не отключите этот PrometheusMetricsExportAutoConfiguration
через management.metrics.export.prometheus.enabled=false
и скопируете / вставите содержимое этого класса в свой собственный и замените @PreDestroy
на ApplicationListener<ContextClosedEvent>
.Этот будет вызван до уничтожения бобов.См. AbstractApplicationContext.doClose()
:
try {
// Publish shutdown event.
publishEvent(new ContextClosedEvent(this));
}
catch (Throwable ex) {
...
}
// Destroy all cached singletons in the context's BeanFactory.
destroyBeans();
А также, пожалуйста, поднимите проблему с проектом Micrometer, чтобы исправить эту проблему в PrometheusMetricsExportAutoConfiguration
способом, который я предлагаю для вас.