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