Skip to content

Bug: Application can't deregister #4488

@cdprete

Description

@cdprete

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions