From 77d36c9627b4370f7c5cfc264fc8f654747f93ea Mon Sep 17 00:00:00 2001 From: herley Date: Sun, 29 Mar 2026 08:55:53 +0700 Subject: [PATCH] fix: stop StatusUpdateTrigger from overriding user-configured StatusUpdater timeout (#5147) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit StatusUpdateTrigger.updateStatus() was calling statusUpdater.timeout(intervalCheck.getInterval()) on every invocation, which unconditionally overwrote the timeout to the status-check interval value (default 10s). This made it impossible for users to configure a custom timeout on StatusUpdater, either via a custom bean definition or through the monitor.default-timeout property — the value was always replaced before updateStatus() was called. Root cause: - StatusUpdater.timeout() is a mutable setter that modifies the instance's internal timeout field and returns `this`. - StatusUpdateTrigger called it on every status check cycle, resetting the timeout to intervalCheck.getInterval() regardless of what was previously configured. Changes: - Remove the timeout() call from StatusUpdateTrigger.updateStatus(), making it consistent with InfoUpdateTrigger which never overrides InfoUpdater's timeout. - Apply monitor.defaultTimeout from AdminServerProperties when constructing the auto-configured StatusUpdater bean, so the property spring.boot.admin.monitor.default-timeout is respected out of the box. - Users who define a custom StatusUpdater bean with a custom timeout will now have that timeout honored, as documented. --- .../server/config/AdminServerAutoConfiguration.java | 3 ++- .../admin/server/services/StatusUpdateTrigger.java | 11 ++++------- .../server/services/StatusUpdateTriggerTest.java | 1 - 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/config/AdminServerAutoConfiguration.java b/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/config/AdminServerAutoConfiguration.java index 1739db2fd7a..39febfd230a 100644 --- a/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/config/AdminServerAutoConfiguration.java +++ b/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/config/AdminServerAutoConfiguration.java @@ -100,7 +100,8 @@ public InstanceIdGenerator instanceIdGenerator() { @ConditionalOnMissingBean public StatusUpdater statusUpdater(InstanceRepository instanceRepository, InstanceWebClient.Builder instanceWebClientBuilder) { - return new StatusUpdater(instanceRepository, instanceWebClientBuilder.build(), new ApiMediaTypeHandler()); + return new StatusUpdater(instanceRepository, instanceWebClientBuilder.build(), new ApiMediaTypeHandler()) + .timeout(this.adminServerProperties.getMonitor().getDefaultTimeout()); } @Bean(initMethod = "start", destroyMethod = "stop") diff --git a/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/services/StatusUpdateTrigger.java b/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/services/StatusUpdateTrigger.java index 80470f96957..0906f7a5948 100644 --- a/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/services/StatusUpdateTrigger.java +++ b/spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/services/StatusUpdateTrigger.java @@ -54,13 +54,10 @@ protected Publisher handle(Flux publisher) { } protected Mono updateStatus(InstanceId instanceId) { - return this.statusUpdater.timeout(this.intervalCheck.getInterval()) - .updateStatus(instanceId) - .onErrorResume((e) -> { - log.warn("Unexpected error while updating status for {}", instanceId, e); - return Mono.empty(); - }) - .doFinally((s) -> this.intervalCheck.markAsChecked(instanceId)); + return this.statusUpdater.updateStatus(instanceId).onErrorResume((e) -> { + log.warn("Unexpected error while updating status for {}", instanceId, e); + return Mono.empty(); + }).doFinally((s) -> this.intervalCheck.markAsChecked(instanceId)); } @Override diff --git a/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/services/StatusUpdateTriggerTest.java b/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/services/StatusUpdateTriggerTest.java index e1899409f20..f6432a7550e 100644 --- a/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/services/StatusUpdateTriggerTest.java +++ b/spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/services/StatusUpdateTriggerTest.java @@ -56,7 +56,6 @@ class StatusUpdateTriggerTest { @BeforeEach void setUp() { when(this.updater.updateStatus(any(InstanceId.class))).thenReturn(Mono.empty()); - when(this.updater.timeout(any())).thenReturn(this.updater); this.trigger = new StatusUpdateTrigger(this.updater, this.events.flux(), Duration.ofSeconds(10), Duration.ofSeconds(10), Duration.ofSeconds(60));