You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/04/17 00:32:09 UTC

[james-project] 17/39: JAMES-3117 Add PeriodicalHealthChecks/Test

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 <kh...@gmail.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org