From 708cbd72942e65906ea32ab3204af6c4e58a7314 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 10 Feb 2021 15:02:38 +0000 Subject: [PATCH] Ignore events from other contexts when waiting for DS init to complete Fixes gh-24966 --- .../orm/jpa/DataSourceInitializedPublisher.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java index 415482cada3b..b935b6d0974d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java @@ -36,6 +36,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceSchemaCreatedEvent; import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.context.event.ContextRefreshedEvent; @@ -136,12 +137,17 @@ private boolean isInitializingDatabase(DataSource dataSource) { * blocks until any asynchronous DataSource initialization has completed. */ static class DataSourceInitializationCompletionListener - implements ApplicationListener, Ordered { + implements ApplicationListener, Ordered, ApplicationContextAware { + + private volatile ApplicationContext applicationContext; private volatile Future dataSourceInitialization; @Override public void onApplicationEvent(ContextRefreshedEvent event) { + if (!event.getApplicationContext().equals(this.applicationContext)) { + return; + } Future dataSourceInitialization = this.dataSourceInitialization; if (dataSourceInitialization != null) { try { @@ -158,6 +164,11 @@ public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + } /**