SmartLifecycle 的 phase 到底怎么排?refresh 时哪些会自动启动?关闭时每个阶段怎么等?一个停不下来的 Bean 会怎样?这篇在 Spring Framework 7.0.9 上用带时间戳的事件逐项验证。
--- refresh 完成后(5 个 SmartLifecycle,phase 各不同,@Bean 的定义顺序是 p100、pMin、p0、pMax、p-100) 1. 321 ms pMin.start() (phase -2147483648) 2. 323 ms p-100.start() (phase -100) 3. 323 ms p0(默认 phase).start() (phase 0) 4. 323 ms p100.start() (phase 100) 5. 323 ms pMax.start() (phase 2147483647) --- close() 之后 1. 326 ms pMax.stop() 耗时 0 ms 2. 326 ms p100.stop() 耗时 0 ms 3. 326 ms p0(默认 phase).stop() 耗时 0 ms 4. 327 ms p-100.stop() 耗时 0 ms 5. 327 ms pMin.stop() 耗时 0 ms 6. 327 ms Destroy.@PreDestroy
启动 phase 升序,停止 phase 降序;停止先于单例的销毁回调。
--- refresh 完成后 1. 358 ms auto.start() (phase 0) --- context.start() 之后 1. 361 ms --- 调用 context.start() 2. 361 ms manual(isAutoStartup=false).start() (phase 0) 3. 361 ms Plain(普通 Lifecycle).start() --- 手动 start manual 之后 1. 361 ms --- 调用 manual 的 start() 2. 361 ms manual(isAutoStartup=false).start() (phase 0)
refresh 只启动 isAutoStartup 为 true 的 SmartLifecycle;context.start() 启动所有 Lifecycle。
--- 同一个 phase(都是 10)的三个 Bean,各异步停 300 ms(close 耗时 308 ms) 1. 301 ms a.stop(callback) 开始,异步300 ms 后回调 2. 302 ms b.stop(callback) 开始,异步300 ms 后回调 3. 302 ms c.stop(callback) 开始,异步300 ms 后回调 4. 603 ms b 异步停止完成,调用 callback 5. 607 ms a 异步停止完成,调用 callback 6. 607 ms c 异步停止完成,调用 callback 7. 608 ms close() 返回 --- 三个不同 phase(10、20、30)各异步停 300 ms(close 耗时 918 ms) 1. 304 ms c.stop(callback) 开始,异步300 ms 后回调 2. 609 ms c 异步停止完成,调用 callback 3. 609 ms b.stop(callback) 开始,异步300 ms 后回调 4. 914 ms b 异步停止完成,调用 callback 5. 915 ms a.stop(callback) 开始,异步300 ms 后回调 6. 1220 ms a 异步停止完成,调用 callback 7. 1221 ms close() 返回
同一 phase 的并行停,不同 phase 的串行停,总耗时分别约等于最慢的一个和全部相加。
--- Hang 不调用 callback,timeoutPerShutdownPhase = 1000 ms(close 耗时 1004 ms) 1. 325 ms Hang.stop(callback):永远不调用 callback 2. 1328 ms other(phase 0).stop() 耗时 0 ms 3. 1329 ms close() 返回
stop(callback) 不回调时整个关闭会等到 timeoutPerShutdownPhase。