This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 75a2b670c52c697f56414cbd996ca1d4b8853f26 Author: LanKhuat <[email protected]> AuthorDate: Mon Mar 30 09:06:46 2020 +0700 JAMES-3117 Add PeriodicalHealthChecks/Test --- .../org/apache/james/PeriodicalHealthChecks.java | 30 +++++++++++++--------- .../apache/james/PeriodicalHealthChecksTest.java | 25 ++++++++++++++---- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java b/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java index 2d80593..11a82d6 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java @@ -19,7 +19,6 @@ package org.apache.james; -import java.time.Duration; import java.util.Set; import javax.annotation.PreDestroy; @@ -42,28 +41,38 @@ public class PeriodicalHealthChecks implements Startable { private static final Logger LOGGER = LoggerFactory.getLogger(PeriodicalHealthChecks.class); private final Set<HealthCheck> healthChecks; private final Scheduler scheduler; - private final Duration period; + private final PeriodicalHealthChecksConfiguration configuration; private Disposable disposable; @Inject - PeriodicalHealthChecks(Set<HealthCheck> healthChecks, Scheduler scheduler, PeriodicalHealthChecksConfiguration config) { + PeriodicalHealthChecks(Set<HealthCheck> healthChecks, PeriodicalHealthChecksConfiguration configuration) { + this.healthChecks = healthChecks; + this.scheduler = Schedulers.elastic(); + this.configuration = configuration; + } + + PeriodicalHealthChecks(Set<HealthCheck> healthChecks, Scheduler scheduler, PeriodicalHealthChecksConfiguration configuration) { this.healthChecks = healthChecks; this.scheduler = scheduler; - this.period = config.getPeriod(); + this.configuration = configuration; } public void start() { - disposable = Flux.interval(period, scheduler) + disposable = Flux.interval(configuration.getPeriod(), scheduler) .flatMap(any -> Flux.fromIterable(healthChecks) .flatMap(healthCheck -> Mono.fromCallable(healthCheck::check))) - .flatMap(result -> - Mono.fromRunnable(() -> logResult(result))) + .doOnNext(this::logResult) .onErrorContinue(this::logError) .subscribeOn(Schedulers.elastic()) .subscribe(); } + @PreDestroy + public void stop() { + disposable.dispose(); + } + private void logResult(Result result) { switch (result.getStatus()) { case HEALTHY: @@ -86,11 +95,8 @@ public class PeriodicalHealthChecks implements Startable { if (triggeringValue instanceof Result) { Result result = (Result) triggeringValue; LOGGER.error("HealthCheck error for: {}, Cause: {}", result.getComponentName(), error); + return; } - } - - @PreDestroy - public void stop() { - disposable.dispose(); + LOGGER.error("HealthCheck error. Triggering value: {}, Cause: {}", triggeringValue, error); } } \ No newline at end of file diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java b/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java index dfc241f..315540b 100644 --- a/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java +++ b/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java @@ -59,8 +59,7 @@ public class PeriodicalHealthChecksTest { scheduler = VirtualTimeScheduler.getOrSet(); testee = new PeriodicalHealthChecks(ImmutableSet.of(mockHealthCheck1, mockHealthCheck2), scheduler, - new PeriodicalHealthChecksConfiguration(Duration.ofMillis(PERIOD))); - testee.start(); + new PeriodicalHealthChecksConfiguration(Duration.ofSeconds(PERIOD))); } @AfterEach @@ -70,20 +69,36 @@ public class PeriodicalHealthChecksTest { @Test void startShouldCallHealthCheckAtLeastOnce() { - scheduler.advanceTimeBy(Duration.ofMillis(PERIOD)); + testee.start(); + + scheduler.advanceTimeBy(Duration.ofSeconds(PERIOD)); verify(mockHealthCheck1, atLeast(1)).check(); } @Test void startShouldCallHealthCheckMultipleTimes() { - scheduler.advanceTimeBy(Duration.ofMillis(PERIOD * EXPECTED_INVOKED_TIME)); + testee.start(); + + scheduler.advanceTimeBy(Duration.ofSeconds(PERIOD * EXPECTED_INVOKED_TIME)); verify(mockHealthCheck1, times(EXPECTED_INVOKED_TIME)).check(); } @Test void startShouldCallAllHealthChecks() { - scheduler.advanceTimeBy(Duration.ofMillis(PERIOD * EXPECTED_INVOKED_TIME)); + testee.start(); + + scheduler.advanceTimeBy(Duration.ofSeconds(PERIOD * EXPECTED_INVOKED_TIME)); verify(mockHealthCheck1, times(EXPECTED_INVOKED_TIME)).check(); verify(mockHealthCheck2, times(EXPECTED_INVOKED_TIME)).check(); } + + @Test + void startShouldCallRemainingHealthChecksWhenAHealthCheckThrows() { + when(mockHealthCheck1.check()).thenThrow(new RuntimeException()); + + testee.start(); + + scheduler.advanceTimeBy(Duration.ofSeconds(PERIOD * EXPECTED_INVOKED_TIME)); + verify(mockHealthCheck2, times(EXPECTED_INVOKED_TIME)).check(); + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
