From a52bf9e06ac3435d1eb1087ad2a8aeee2b2bd934 Mon Sep 17 00:00:00 2001 From: Abdullah <89297042+AzazelSensei@users.noreply.github.com> Date: Sat, 15 Aug 2026 08:46:23 +0000 Subject: [PATCH] Honor spring.cloud.config.watch.enabled on Log4j2EventListener spring.factories constructs the listener outside the bean factory, so @ConditionalOnProperty never applies. Check the property in onApplicationEvent as well. Fixes #4244 --- .../config/client/Log4j2EventListener.java | 33 ++++++++++++++++++- .../client/Log4j2EventListenerTest.java | 23 +++++++++++++ ..._honor_watch_enabled_on_event_listener.xml | 12 +++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/changelog/.2.x.x/4244_honor_watch_enabled_on_event_listener.xml diff --git a/log4j-spring-cloud-config-client/src/main/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListener.java b/log4j-spring-cloud-config-client/src/main/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListener.java index 4495c7bafcd..f051f95354c 100644 --- a/log4j-spring-cloud-config-client/src/main/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListener.java +++ b/log4j-spring-cloud-config-client/src/main/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListener.java @@ -20,17 +20,48 @@ import org.apache.logging.log4j.Logger; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; +import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component @ConditionalOnProperty(value = "spring.cloud.config.watch.enabled") -public class Log4j2EventListener implements ApplicationListener { +public class Log4j2EventListener implements ApplicationListener, EnvironmentAware { private static Logger LOGGER = LogManager.getLogger(Log4j2EventListener.class); + private Environment environment; + + @Override + public void setEnvironment(final Environment environment) { + this.environment = environment; + } @Override public void onApplicationEvent(final EnvironmentChangeEvent environmentChangeEvent) { + if (!isWatchEnabled(environmentChangeEvent)) { + LOGGER.debug("Ignoring environment change event; spring.cloud.config.watch.enabled is false"); + return; + } LOGGER.debug("Application change event triggered"); WatchEventManager.publishEvent(); } + + /** + * {@code spring.factories} constructs this listener outside the bean factory, so + * {@code @ConditionalOnProperty} never applies. Honor the same property here. + */ + private boolean isWatchEnabled(final EnvironmentChangeEvent event) { + Environment env = this.environment; + if (env == null) { + final Object source = event.getSource(); + if (source instanceof ApplicationContext) { + env = ((ApplicationContext) source).getEnvironment(); + } + } + if (env == null) { + return true; + } + return !Boolean.FALSE.equals(env.getProperty("spring.cloud.config.watch.enabled", Boolean.class)); + } } diff --git a/log4j-spring-cloud-config-client/src/test/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListenerTest.java b/log4j-spring-cloud-config-client/src/test/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListenerTest.java index 57749b2de80..c27455fb9cb 100644 --- a/log4j-spring-cloud-config-client/src/test/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListenerTest.java +++ b/log4j-spring-cloud-config-client/src/test/java/org/apache/logging/log4j/spring/cloud/config/client/Log4j2EventListenerTest.java @@ -16,6 +16,7 @@ */ package org.apache.logging.log4j.spring.cloud.config.client; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; @@ -35,6 +36,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.mock.env.MockEnvironment; import org.springframework.test.context.junit4.SpringRunner; /** @@ -69,6 +72,26 @@ public void test() { assertTrue(count.get() > 0); } + @Test + public void doesNotReloadWhenWatchDisabled() { + final MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.cloud.config.watch.enabled", "false"); + try (GenericApplicationContext context = new GenericApplicationContext()) { + context.setEnvironment(environment); + context.refresh(); + final AtomicInteger count = new AtomicInteger(0); + final Source source = new Source(new File("test.java")); + loggerContextRule + .getLoggerContext() + .getConfiguration() + .getWatchManager() + .watch(source, new TestWatcher(count)); + new Log4j2EventListener() + .onApplicationEvent(new EnvironmentChangeEvent(context, new HashSet<>())); + assertEquals(0, count.get()); + } + } + private static class TestWatcher implements Watcher { private final AtomicInteger count; diff --git a/src/changelog/.2.x.x/4244_honor_watch_enabled_on_event_listener.xml b/src/changelog/.2.x.x/4244_honor_watch_enabled_on_event_listener.xml new file mode 100644 index 00000000000..9d123ccfbf2 --- /dev/null +++ b/src/changelog/.2.x.x/4244_honor_watch_enabled_on_event_listener.xml @@ -0,0 +1,12 @@ + + + + + Honor `spring.cloud.config.watch.enabled` in `Log4j2EventListener` when it is created from `spring.factories`. + +