Describe the bug
When an application tries to deregister itself due to a graceful shutdown, the call fails and, as such, the instance stays with status DOWN
in the registry.
- Spring Cloud version: 2025.0.0
- Spring Boot version: 3.5.5
Sample
Logs:
2025-09-09T15:33:18.525+02:00 INFO 3396 --- [HIKU DCD Monitoring Agent] [SpringApplicationShutdownHook] o.s.c.n.e.s.EurekaServiceRegistry : Unregistering application HIKU DCD MONITORING AGE
NT with eureka with status DOWN
2025-09-09T15:33:18.576+02:00 INFO 3396 --- [HIKU DCD Monitoring Agent] [SpringApplicationShutdownHook] o.s.b.w.embedded.netty.GracefulShutdown : Commencing graceful shutdown. Waiting for active
requests to complete
2025-09-09T15:33:18.586+02:00 INFO 3396 --- [HIKU DCD Monitoring Agent] [netty-shutdown] o.s.b.w.embedded.netty.GracefulShutdown : Graceful shutdown complete
2025-09-09T15:33:25.773+02:00 WARN 3396 --- [HIKU DCD Monitoring Agent] [SpringApplicationShutdownHook] io.netty.channel.AbstractChannel : Force-closing a channel whose registration task w
as not accepted by an event loop: [id: 0x70e721e6]
java.util.concurrent.RejectedExecutionException: event executor terminated
at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:934) ~[netty-common-4.1.124.Final.jar!/:4.1.124.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:353) ~[netty-common-4.1.124.Final.jar!/:4.1.124.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:346) ~[netty-common-4.1.124.Final.jar!/:4.1.124.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:836) ~[netty-common-4.1.124.Final.jar!/:4.1.124.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:827) ~[netty-common-4.1.124.Final.jar!/:4.1.124.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:817) ~[netty-common-4.1.124.Final.jar!/:4.1.124.Final]
at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:482) ~[netty-transport-4.1.124.Final.jar!/:4.1.124.Final]
at reactor.netty.transport.TransportConnector.doInitAndRegister(TransportConnector.java:294) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.transport.TransportConnector.connect(TransportConnector.java:165) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.transport.TransportConnector.connect(TransportConnector.java:124) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.resources.DefaultPooledConnectionProvider$PooledConnectionAllocator.lambda$connectChannel$0(DefaultPooledConnectionProvider.java:547) ~[reactor-netty-core-1.2.9.jar!/:1.2.9
]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.Mono.subscribeWith(Mono.java:4641) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.Mono.subscribe(Mono.java:4542) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.Mono.subscribe(Mono.java:4478) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.drainLoop(SimpleDequePool.java:449) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.pendingOffer(SimpleDequePool.java:625) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.doAcquire(SimpleDequePool.java:306) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.request(AbstractPool.java:425) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.resources.DefaultPooledConnectionProvider$DisposableAcquire.onSubscribe(DefaultPooledConnectionProvider.java:218) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool$QueueBorrowerMono.subscribe(SimpleDequePool.java:743) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.netty.resources.PooledConnectionProvider.lambda$acquire$3(PooledConnectionProvider.java:196) ~[reactor-netty-core-1.2.9.jar!/:1.2.9]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.lambda$subscribe$0(HttpClientConnect.java:287) ~[reactor-netty-http-1.2.9.jar!/:1.2.9]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.FluxRetryWhen.subscribe(FluxRetryWhen.java:81) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.MonoRetryWhen.subscribeOrReturn(MonoRetryWhen.java:46) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:63) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.subscribe(HttpClientConnect.java:290) ~[reactor-netty-http-1.2.9.jar!/:1.2.9]
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.9.jar!/:3.7.9]
at reactor.core.publisher.Mono.block(Mono.java:1778) ~[reactor-core-3.7.9.jar!/:3.7.9]
at org.springframework.cloud.netflix.eureka.http.WebClientEurekaHttpClient.cancel(WebClientEurekaHttpClient.java:78) ~[spring-cloud-netflix-eureka-client-4.3.0.jar!/:4.3.0]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$2.execute(EurekaHttpClientDecorator.java:74) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.executeOnNewServer(RedirectingEurekaHttpClient.java:121) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.execute(RedirectingEurekaHttpClient.java:80) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.cancel(EurekaHttpClientDecorator.java:71) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$2.execute(EurekaHttpClientDecorator.java:74) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:120) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.cancel(EurekaHttpClientDecorator.java:71) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$2.execute(EurekaHttpClientDecorator.java:74) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:76) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.cancel(EurekaHttpClientDecorator.java:71) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.DiscoveryClient.unregister(DiscoveryClient.java:919) ~[eureka-client-2.0.4.jar!/:2.0.4]
at com.netflix.discovery.DiscoveryClient.shutdown(DiscoveryClient.java:900) ~[eureka-client-2.0.4.jar!/:2.0.4]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMethod.invoke(InitDestroyAnnotationBeanPostProcessor.java:457) ~[spring-beans-6.2.10.jar!/:6.
2.10]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeDestroyMethods(InitDestroyAnnotationBeanPostProcessor.java:415) ~[spring-beans
-6.2.10.jar!/:6.2.10]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeDestruction(InitDestroyAnnotationBeanPostProcessor.java:239) ~[spring-beans-6.2.10.ja
r!/:6.2.10]
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:202) ~[spring-beans-6.2.10.jar!/:6.2.10]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:798) ~[spring-beans-6.2.10.jar!/:6.2.10]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:748) ~[spring-beans-6.2.10.jar!/:6.2.10]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:1481) ~[spring-beans-6.2.10.jar!/:6.2.10]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:707) ~[spring-beans-6.2.10.jar!/:6.2.10]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:1474) ~[spring-beans-6.2.10.jar!/:6.2.10]
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1219) ~[spring-context-6.2.10.jar!/:6.2.10]
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1180) ~[spring-context-6.2.10.jar!/:6.2.10]
at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.doClose(ReactiveWebServerApplicationContext.java:155) ~[spring-boot-3.5.5.jar!/:3.5.5]
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1126) ~[spring-context-6.2.10.jar!/:6.2.10]
at org.springframework.boot.SpringApplicationShutdownHook.closeAndWait(SpringApplicationShutdownHook.java:147) ~[spring-boot-3.5.5.jar!/:3.5.5]
at java.base/java.lang.Iterable.forEach(Unknown Source) ~[na:na]
at org.springframework.boot.SpringApplicationShutdownHook.run(SpringApplicationShutdownHook.java:116) ~[spring-boot-3.5.5.jar!/:3.5.5]
at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
2025-09-09T15:33:25.779+02:00 INFO 3396 --- [HIKU DCD Monitoring Agent] [SpringApplicationShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2025-09-09T15:33:25.818+02:00 INFO 3396 --- [HIKU DCD Monitoring Agent] [SpringApplicationShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
application.yaml
within the JAR
pring:
application.name: HIKU DCD Monitoring Agent
main.keep-alive: true
threads.virtual.enabled: true
cloud:
refresh.enabled: false
discovery.client.health-indicator.enabled: false
server:
port: 8081
http2.enabled: true
compression.enabled: true
servlet.jsp.registered: false
management:
endpoints.web.exposure.include: "*"
endpoint:
env.access: none
conditions.access: none
configprops.access: none
beans.access: none
caches.access: none
mappings.access: none
features.access: none
serviceregistry.access: none
scheduledtasks.access: none
health:
show-details: always
show-components: always
info:
os.enabled: true
env.enabled: true
git.enabled: false
process.enabled: true
health:
ssl.enabled: false
ping.enabled: false
eureka.enabled: false
refresh.enabled: false
eureka:
instance.hostname: ${HOSTNAME:localhost}
client:
enabled: true
fetch-registry: false
jersey.enabled: false
webclient.enabled: true
serviceUrl.defaultZone: http://localhost:8761/eureka
logging.level:
root: info
org.hibernate.validator.internal.util.Version: warn
application.yaml
outside the JAR (config folder):
spring:
main.banner-mode: log
ldap:
username: ${LDAP_USERNAME}
password: ${LDAP_PASSWORD}
datasource:
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
eureka.client.enabled: true
ibm.mq:
reconnect: "ANY" # See https://www.ibm.com/docs/en/ibm-mq/9.4.x?topic=objects-clientreconnectoptions
pool.enabled: true
channel: M.MQI.HIKU.DCD.13
user: ${MQ_USERNAME}
password: ${MQ_PASSWORD}
use-i-b-m-cipher-mappings: false
ssl-cipher-spec: TLS_AES_256_GCM_SHA384
logging:
file.name: ${logging.file.path}/monitoring-agent.log
logback.rollingpolicy:
max-history: 90
file-name-pattern: ${logging.file.path}/archive/monitoring-agent.%d{yyyy-MM-dd}.%i.log.gz
level:
root: info
com.netflix.eureka: off
com.netflix.discovery: off
org.hibernate.validator.internal.util.Version: warn
management:
health.diskspace.path: ${logging.file.path}
endpoint.logfile.external-file: ${logging.file.path}/server.err
application-qa.yaml
(for the QA profile which is active):
spring:
eureka.client.service-url.defaultZone: https://foo/eureka
info.tags.environment: qa
Eureka server config
server.port: 8761
eureka:
environment: qa
server.wait-time-in-ms-when-sync-empty: 0
instance:
hostname: "zksr.${HOSTNAME}"
The registration works fine, though.
Comment From: cdprete
/cc @OlgaMaciaszek @spencergibb maybe you can provide some input :)