Spring Boot 2.3.1
I've been playing around with the latest Spring Boot Graceful Shutdown feature and discovered that after adding spring-cloud-config-server
, as a dependency, my Spring Boot application fails to use configured spring.lifecycle.timeout-per-shutdown-phase
property and, instead, it's using the default 30s value for graceful shutdown timeout.
I've prepared a minimal application:
https://github.com/pszemus/graceful-shutdown-demo
that has configured graceful shutdown timeout of 8s: https://github.com/pszemus/graceful-shutdown-demo/blob/master/src/main/resources/application.yml#L5
After requesting the long lasting endpoint /greeting
and stoping the application it should stop after 8 seconds, but it's stopping after 30 seconds, instead:
2020-06-18 16:02:59.629 INFO 31481 --- [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2020-06-18 16:03:29.631 INFO 31481 --- [extShutdownHook] o.s.c.support.DefaultLifecycleProcessor : Failed to shut down 1 bean with phase value 2147483647 within timeout of 30000ms: [webServerGracefulShutdown]
2020-06-18 16:03:29.680 INFO 31481 --- [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown aborted with one or more requests still active
Configured 8 seconds timeout is visible in /actuator/configprops
, but apparently it's not used:
"spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties": {
"prefix": "spring.lifecycle",
"properties": {
"timeoutPerShutdownPhase": "PT8S"
},
"inputs": {
"timeoutPerShutdownPhase": {
"origin": "class path resource [application.yml]:5:37",
"value": "8s"
}
}
}
If one gets rid of spring-cloud-config-server
from pom.xml: https://github.com/pszemus/graceful-shutdown-demo/blob/master/pom.xml#L22
then the application starts using configured 8s timeout:
C2020-06-18 15:54:13.934 INFO 30672 --- [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2020-06-18 15:54:21.937 INFO 30672 --- [extShutdownHook] o.s.c.support.DefaultLifecycleProcessor : Failed to shut down 1 bean with phase value 2147483647 within timeout of 8000ms: [webServerGracefulShutdown]
2020-06-18 15:54:21.983 INFO 30672 --- [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown aborted with one or more requests still active
Comment From: wilkinsona
Thanks for the sample. When spring-cloud-config-server
is added, it results in Spring Cloud creating a parent context that is configured in such a way that it does not include LifecycleAutoConfiguration
. As a result, the parent context uses the default lifecycle processor with the default timeout. When LifecycleAutoConfiguration
runs in the child context it backs off as it finds the lifecycle processor in the parent context so the main (child) context ends up creating a default lifecycle processor of its own with the default timeout.
We need to only check the current context for a bean named defaultLifecycleProcessor
.