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 :)