Polishing (backported from 6.2.x)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2024 the original author or authors.
|
||||
* Copyright 2002-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -61,7 +61,8 @@ import org.springframework.util.ClassUtils;
|
||||
* interactions on a {@link org.springframework.context.ConfigurableApplicationContext}.
|
||||
*
|
||||
* <p>As of 6.1, this also includes support for JVM checkpoint/restore (Project CRaC)
|
||||
* when the {@code org.crac:crac} dependency on the classpath.
|
||||
* when the {@code org.crac:crac} dependency is on the classpath. All running beans
|
||||
* will get stopped and restarted according to the CRaC checkpoint/restore callbacks.
|
||||
*
|
||||
* @author Mark Fisher
|
||||
* @author Juergen Hoeller
|
||||
@@ -379,7 +380,7 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor
|
||||
}
|
||||
|
||||
|
||||
// overridable hooks
|
||||
// Overridable hooks
|
||||
|
||||
/**
|
||||
* Retrieve all applicable Lifecycle beans: all singletons that have already been created,
|
||||
@@ -493,11 +494,13 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor
|
||||
}
|
||||
}
|
||||
try {
|
||||
latch.await(this.timeout, TimeUnit.MILLISECONDS);
|
||||
if (latch.getCount() > 0 && !countDownBeanNames.isEmpty() && logger.isInfoEnabled()) {
|
||||
logger.info("Shutdown phase " + this.phase + " ends with " + countDownBeanNames.size() +
|
||||
" bean" + (countDownBeanNames.size() > 1 ? "s" : "") +
|
||||
" still running after timeout of " + this.timeout + "ms: " + countDownBeanNames);
|
||||
if (!latch.await(this.timeout, TimeUnit.MILLISECONDS)) {
|
||||
// Count is still >0 after timeout
|
||||
if (!countDownBeanNames.isEmpty() && logger.isInfoEnabled()) {
|
||||
logger.info("Shutdown phase " + this.phase + " ends with " + countDownBeanNames.size() +
|
||||
" bean" + (countDownBeanNames.size() > 1 ? "s" : "") +
|
||||
" still running after timeout of " + this.timeout + "ms: " + countDownBeanNames);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InterruptedException ex) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2024 the original author or authors.
|
||||
* Copyright 2002-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -54,10 +54,11 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void customLifecycleProcessorInstance() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
BeanDefinition beanDefinition = new RootBeanDefinition(DefaultLifecycleProcessor.class);
|
||||
beanDefinition.getPropertyValues().addPropertyValue("timeoutPerShutdownPhase", 1000);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.registerBeanDefinition("lifecycleProcessor", beanDefinition);
|
||||
context.registerBeanDefinition(StaticApplicationContext.LIFECYCLE_PROCESSOR_BEAN_NAME, beanDefinition);
|
||||
|
||||
context.refresh();
|
||||
LifecycleProcessor bean = context.getBean("lifecycleProcessor", LifecycleProcessor.class);
|
||||
Object contextLifecycleProcessor = new DirectFieldAccessor(context).getPropertyValue("lifecycleProcessor");
|
||||
@@ -70,11 +71,12 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void singleSmartLifecycleAutoStartup() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean bean = TestSmartLifecycleBean.forStartupTests(1, startedBeans);
|
||||
bean.setAutoStartup(true);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean", bean);
|
||||
|
||||
assertThat(bean.isRunning()).isFalse();
|
||||
context.refresh();
|
||||
assertThat(bean.isRunning()).isTrue();
|
||||
@@ -114,12 +116,13 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void singleSmartLifecycleAutoStartupWithFailingLifecycleBean() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean bean = TestSmartLifecycleBean.forStartupTests(1, startedBeans);
|
||||
bean.setAutoStartup(true);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean", bean);
|
||||
context.registerSingleton("failingBean", FailingLifecycleBean.class);
|
||||
|
||||
assertThat(bean.isRunning()).isFalse();
|
||||
assertThatExceptionOfType(ApplicationContextException.class)
|
||||
.isThrownBy(context::refresh).withCauseInstanceOf(IllegalStateException.class);
|
||||
@@ -130,11 +133,12 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void singleSmartLifecycleWithoutAutoStartup() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean bean = TestSmartLifecycleBean.forStartupTests(1, startedBeans);
|
||||
bean.setAutoStartup(false);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean", bean);
|
||||
|
||||
assertThat(bean.isRunning()).isFalse();
|
||||
context.refresh();
|
||||
assertThat(bean.isRunning()).isFalse();
|
||||
@@ -148,15 +152,16 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void singleSmartLifecycleAutoStartupWithNonAutoStartupDependency() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean bean = TestSmartLifecycleBean.forStartupTests(1, startedBeans);
|
||||
bean.setAutoStartup(true);
|
||||
TestSmartLifecycleBean dependency = TestSmartLifecycleBean.forStartupTests(1, startedBeans);
|
||||
dependency.setAutoStartup(false);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean", bean);
|
||||
context.getBeanFactory().registerSingleton("dependency", dependency);
|
||||
context.getBeanFactory().registerDependentBean("dependency", "bean");
|
||||
|
||||
assertThat(bean.isRunning()).isFalse();
|
||||
assertThat(dependency.isRunning()).isFalse();
|
||||
context.refresh();
|
||||
@@ -171,18 +176,19 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void smartLifecycleGroupStartup() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forStartupTests(Integer.MIN_VALUE, startedBeans);
|
||||
TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forStartupTests(1, startedBeans);
|
||||
TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forStartupTests(2, startedBeans);
|
||||
TestSmartLifecycleBean bean3 = TestSmartLifecycleBean.forStartupTests(3, startedBeans);
|
||||
TestSmartLifecycleBean beanMax = TestSmartLifecycleBean.forStartupTests(Integer.MAX_VALUE, startedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean3", bean3);
|
||||
context.getBeanFactory().registerSingleton("beanMin", beanMin);
|
||||
context.getBeanFactory().registerSingleton("bean2", bean2);
|
||||
context.getBeanFactory().registerSingleton("beanMax", beanMax);
|
||||
context.getBeanFactory().registerSingleton("bean1", bean1);
|
||||
|
||||
assertThat(beanMin.isRunning()).isFalse();
|
||||
assertThat(bean1.isRunning()).isFalse();
|
||||
assertThat(bean2.isRunning()).isFalse();
|
||||
@@ -202,16 +208,17 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void contextRefreshThenStartWithMixedBeans() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestLifecycleBean simpleBean1 = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
TestLifecycleBean simpleBean2 = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
TestSmartLifecycleBean smartBean1 = TestSmartLifecycleBean.forStartupTests(5, startedBeans);
|
||||
TestSmartLifecycleBean smartBean2 = TestSmartLifecycleBean.forStartupTests(-3, startedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("simpleBean1", simpleBean1);
|
||||
context.getBeanFactory().registerSingleton("smartBean1", smartBean1);
|
||||
context.getBeanFactory().registerSingleton("simpleBean2", simpleBean2);
|
||||
context.getBeanFactory().registerSingleton("smartBean2", smartBean2);
|
||||
|
||||
assertThat(simpleBean1.isRunning()).isFalse();
|
||||
assertThat(simpleBean2.isRunning()).isFalse();
|
||||
assertThat(smartBean1.isRunning()).isFalse();
|
||||
@@ -233,16 +240,17 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void contextRefreshThenStopAndRestartWithMixedBeans() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestLifecycleBean simpleBean1 = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
TestLifecycleBean simpleBean2 = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
TestSmartLifecycleBean smartBean1 = TestSmartLifecycleBean.forStartupTests(5, startedBeans);
|
||||
TestSmartLifecycleBean smartBean2 = TestSmartLifecycleBean.forStartupTests(-3, startedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("simpleBean1", simpleBean1);
|
||||
context.getBeanFactory().registerSingleton("smartBean1", smartBean1);
|
||||
context.getBeanFactory().registerSingleton("simpleBean2", simpleBean2);
|
||||
context.getBeanFactory().registerSingleton("smartBean2", smartBean2);
|
||||
|
||||
assertThat(simpleBean1.isRunning()).isFalse();
|
||||
assertThat(simpleBean2.isRunning()).isFalse();
|
||||
assertThat(smartBean1.isRunning()).isFalse();
|
||||
@@ -270,16 +278,17 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void contextRefreshThenStopForRestartWithMixedBeans() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestLifecycleBean simpleBean1 = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
TestLifecycleBean simpleBean2 = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
TestSmartLifecycleBean smartBean1 = TestSmartLifecycleBean.forStartupTests(5, startedBeans);
|
||||
TestSmartLifecycleBean smartBean2 = TestSmartLifecycleBean.forStartupTests(-3, startedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("simpleBean1", simpleBean1);
|
||||
context.getBeanFactory().registerSingleton("smartBean1", smartBean1);
|
||||
context.getBeanFactory().registerSingleton("simpleBean2", simpleBean2);
|
||||
context.getBeanFactory().registerSingleton("smartBean2", smartBean2);
|
||||
|
||||
assertThat(simpleBean1.isRunning()).isFalse();
|
||||
assertThat(simpleBean2.isRunning()).isFalse();
|
||||
assertThat(smartBean1.isRunning()).isFalse();
|
||||
@@ -319,6 +328,7 @@ class DefaultLifecycleProcessorTests {
|
||||
@Test
|
||||
@EnabledForTestGroups(LONG_RUNNING)
|
||||
void smartLifecycleGroupShutdown() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 300, stoppedBeans);
|
||||
TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forShutdownTests(3, 100, stoppedBeans);
|
||||
@@ -327,7 +337,6 @@ class DefaultLifecycleProcessorTests {
|
||||
TestSmartLifecycleBean bean5 = TestSmartLifecycleBean.forShutdownTests(2, 700, stoppedBeans);
|
||||
TestSmartLifecycleBean bean6 = TestSmartLifecycleBean.forShutdownTests(Integer.MAX_VALUE, 200, stoppedBeans);
|
||||
TestSmartLifecycleBean bean7 = TestSmartLifecycleBean.forShutdownTests(3, 200, stoppedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean1", bean1);
|
||||
context.getBeanFactory().registerSingleton("bean2", bean2);
|
||||
context.getBeanFactory().registerSingleton("bean3", bean3);
|
||||
@@ -335,6 +344,7 @@ class DefaultLifecycleProcessorTests {
|
||||
context.getBeanFactory().registerSingleton("bean5", bean5);
|
||||
context.getBeanFactory().registerSingleton("bean6", bean6);
|
||||
context.getBeanFactory().registerSingleton("bean7", bean7);
|
||||
|
||||
context.refresh();
|
||||
context.stop();
|
||||
assertThat(stoppedBeans).satisfiesExactly(hasPhase(Integer.MAX_VALUE), hasPhase(3),
|
||||
@@ -345,11 +355,12 @@ class DefaultLifecycleProcessorTests {
|
||||
@Test
|
||||
@EnabledForTestGroups(LONG_RUNNING)
|
||||
void singleSmartLifecycleShutdown() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean bean = TestSmartLifecycleBean.forShutdownTests(99, 300, stoppedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean", bean);
|
||||
context.refresh();
|
||||
|
||||
assertThat(bean.isRunning()).isTrue();
|
||||
context.stop();
|
||||
assertThat(bean.isRunning()).isFalse();
|
||||
@@ -359,10 +370,11 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void singleLifecycleShutdown() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<>();
|
||||
Lifecycle bean = new TestLifecycleBean(null, stoppedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean", bean);
|
||||
|
||||
context.refresh();
|
||||
assertThat(bean.isRunning()).isFalse();
|
||||
bean.start();
|
||||
@@ -375,6 +387,7 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void mixedShutdown() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<>();
|
||||
Lifecycle bean1 = TestLifecycleBean.forShutdownTests(stoppedBeans);
|
||||
Lifecycle bean2 = TestSmartLifecycleBean.forShutdownTests(500, 200, stoppedBeans);
|
||||
@@ -383,7 +396,6 @@ class DefaultLifecycleProcessorTests {
|
||||
Lifecycle bean5 = TestSmartLifecycleBean.forShutdownTests(1, 200, stoppedBeans);
|
||||
Lifecycle bean6 = TestSmartLifecycleBean.forShutdownTests(-1, 100, stoppedBeans);
|
||||
Lifecycle bean7 = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 300, stoppedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("bean1", bean1);
|
||||
context.getBeanFactory().registerSingleton("bean2", bean2);
|
||||
context.getBeanFactory().registerSingleton("bean3", bean3);
|
||||
@@ -391,6 +403,7 @@ class DefaultLifecycleProcessorTests {
|
||||
context.getBeanFactory().registerSingleton("bean5", bean5);
|
||||
context.getBeanFactory().registerSingleton("bean6", bean6);
|
||||
context.getBeanFactory().registerSingleton("bean7", bean7);
|
||||
|
||||
context.refresh();
|
||||
assertThat(bean2.isRunning()).isTrue();
|
||||
assertThat(bean3.isRunning()).isTrue();
|
||||
@@ -418,17 +431,18 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void dependencyStartedFirstEvenIfItsPhaseIsHigher() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forStartupTests(Integer.MIN_VALUE, startedBeans);
|
||||
TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forStartupTests(2, startedBeans);
|
||||
TestSmartLifecycleBean bean99 = TestSmartLifecycleBean.forStartupTests(99, startedBeans);
|
||||
TestSmartLifecycleBean beanMax = TestSmartLifecycleBean.forStartupTests(Integer.MAX_VALUE, startedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("beanMin", beanMin);
|
||||
context.getBeanFactory().registerSingleton("bean2", bean2);
|
||||
context.getBeanFactory().registerSingleton("bean99", bean99);
|
||||
context.getBeanFactory().registerSingleton("beanMax", beanMax);
|
||||
context.getBeanFactory().registerDependentBean("bean99", "bean2");
|
||||
|
||||
context.refresh();
|
||||
assertThat(beanMin.isRunning()).isTrue();
|
||||
assertThat(bean2.isRunning()).isTrue();
|
||||
@@ -446,6 +460,7 @@ class DefaultLifecycleProcessorTests {
|
||||
@Test
|
||||
@EnabledForTestGroups(LONG_RUNNING)
|
||||
void dependentShutdownFirstEvenIfItsPhaseIsLower() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 100, stoppedBeans);
|
||||
TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 200, stoppedBeans);
|
||||
@@ -453,7 +468,6 @@ class DefaultLifecycleProcessorTests {
|
||||
TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forShutdownTests(2, 300, stoppedBeans);
|
||||
TestSmartLifecycleBean bean7 = TestSmartLifecycleBean.forShutdownTests(7, 400, stoppedBeans);
|
||||
TestSmartLifecycleBean beanMax = TestSmartLifecycleBean.forShutdownTests(Integer.MAX_VALUE, 400, stoppedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("beanMin", beanMin);
|
||||
context.getBeanFactory().registerSingleton("bean1", bean1);
|
||||
context.getBeanFactory().registerSingleton("bean2", bean2);
|
||||
@@ -461,6 +475,7 @@ class DefaultLifecycleProcessorTests {
|
||||
context.getBeanFactory().registerSingleton("bean99", bean99);
|
||||
context.getBeanFactory().registerSingleton("beanMax", beanMax);
|
||||
context.getBeanFactory().registerDependentBean("bean99", "bean2");
|
||||
|
||||
context.refresh();
|
||||
assertThat(beanMin.isRunning()).isTrue();
|
||||
assertThat(bean1.isRunning()).isTrue();
|
||||
@@ -486,17 +501,18 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void dependencyStartedFirstAndIsSmartLifecycle() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean beanNegative = TestSmartLifecycleBean.forStartupTests(-99, startedBeans);
|
||||
TestSmartLifecycleBean bean99 = TestSmartLifecycleBean.forStartupTests(99, startedBeans);
|
||||
TestSmartLifecycleBean bean7 = TestSmartLifecycleBean.forStartupTests(7, startedBeans);
|
||||
TestLifecycleBean simpleBean = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("beanNegative", beanNegative);
|
||||
context.getBeanFactory().registerSingleton("bean7", bean7);
|
||||
context.getBeanFactory().registerSingleton("bean99", bean99);
|
||||
context.getBeanFactory().registerSingleton("simpleBean", simpleBean);
|
||||
context.getBeanFactory().registerDependentBean("bean7", "simpleBean");
|
||||
|
||||
context.refresh();
|
||||
context.stop();
|
||||
startedBeans.clear();
|
||||
@@ -514,6 +530,7 @@ class DefaultLifecycleProcessorTests {
|
||||
@Test
|
||||
@EnabledForTestGroups(LONG_RUNNING)
|
||||
void dependentShutdownFirstAndIsSmartLifecycle() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 400, stoppedBeans);
|
||||
TestSmartLifecycleBean beanNegative = TestSmartLifecycleBean.forShutdownTests(-99, 100, stoppedBeans);
|
||||
@@ -521,7 +538,6 @@ class DefaultLifecycleProcessorTests {
|
||||
TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forShutdownTests(2, 300, stoppedBeans);
|
||||
TestSmartLifecycleBean bean7 = TestSmartLifecycleBean.forShutdownTests(7, 400, stoppedBeans);
|
||||
TestLifecycleBean simpleBean = TestLifecycleBean.forShutdownTests(stoppedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("beanMin", beanMin);
|
||||
context.getBeanFactory().registerSingleton("beanNegative", beanNegative);
|
||||
context.getBeanFactory().registerSingleton("bean1", bean1);
|
||||
@@ -529,6 +545,7 @@ class DefaultLifecycleProcessorTests {
|
||||
context.getBeanFactory().registerSingleton("bean7", bean7);
|
||||
context.getBeanFactory().registerSingleton("simpleBean", simpleBean);
|
||||
context.getBeanFactory().registerDependentBean("simpleBean", "beanNegative");
|
||||
|
||||
context.refresh();
|
||||
assertThat(beanMin.isRunning()).isTrue();
|
||||
assertThat(beanNegative.isRunning()).isTrue();
|
||||
@@ -551,15 +568,16 @@ class DefaultLifecycleProcessorTests {
|
||||
|
||||
@Test
|
||||
void dependencyStartedFirstButNotSmartLifecycle() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> startedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forStartupTests(Integer.MIN_VALUE, startedBeans);
|
||||
TestSmartLifecycleBean bean7 = TestSmartLifecycleBean.forStartupTests(7, startedBeans);
|
||||
TestLifecycleBean simpleBean = TestLifecycleBean.forStartupTests(startedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("beanMin", beanMin);
|
||||
context.getBeanFactory().registerSingleton("bean7", bean7);
|
||||
context.getBeanFactory().registerSingleton("simpleBean", simpleBean);
|
||||
context.getBeanFactory().registerDependentBean("simpleBean", "beanMin");
|
||||
|
||||
context.refresh();
|
||||
assertThat(beanMin.isRunning()).isTrue();
|
||||
assertThat(bean7.isRunning()).isTrue();
|
||||
@@ -572,19 +590,20 @@ class DefaultLifecycleProcessorTests {
|
||||
@Test
|
||||
@EnabledForTestGroups(LONG_RUNNING)
|
||||
void dependentShutdownFirstButNotSmartLifecycle() {
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<>();
|
||||
TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 200, stoppedBeans);
|
||||
TestLifecycleBean simpleBean = TestLifecycleBean.forShutdownTests(stoppedBeans);
|
||||
TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forShutdownTests(2, 300, stoppedBeans);
|
||||
TestSmartLifecycleBean bean7 = TestSmartLifecycleBean.forShutdownTests(7, 400, stoppedBeans);
|
||||
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 400, stoppedBeans);
|
||||
StaticApplicationContext context = new StaticApplicationContext();
|
||||
context.getBeanFactory().registerSingleton("beanMin", beanMin);
|
||||
context.getBeanFactory().registerSingleton("bean1", bean1);
|
||||
context.getBeanFactory().registerSingleton("bean2", bean2);
|
||||
context.getBeanFactory().registerSingleton("bean7", bean7);
|
||||
context.getBeanFactory().registerSingleton("simpleBean", simpleBean);
|
||||
context.getBeanFactory().registerDependentBean("bean2", "simpleBean");
|
||||
|
||||
context.refresh();
|
||||
assertThat(beanMin.isRunning()).isTrue();
|
||||
assertThat(bean1.isRunning()).isTrue();
|
||||
@@ -611,6 +630,7 @@ class DefaultLifecycleProcessorTests {
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
private static class TestLifecycleBean implements Lifecycle {
|
||||
|
||||
private final CopyOnWriteArrayList<Lifecycle> startedBeans;
|
||||
|
||||
Reference in New Issue
Block a user