Skip to content

Commit 5db1ab8

Browse files
committed
Catch errors in CompositeNotifier and resume with next
fixes codecentric#940
1 parent 3ba5cec commit 5db1ab8

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

spring-boot-admin-server/src/main/java/de/codecentric/boot/admin/server/notify/CompositeNotifier.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import reactor.core.publisher.Flux;
2121
import reactor.core.publisher.Mono;
2222

23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
2325
import org.springframework.util.Assert;
2426

2527
/**
@@ -28,6 +30,7 @@
2830
* @author Sebastian Meiser
2931
*/
3032
public class CompositeNotifier implements Notifier {
33+
private static final Logger log = LoggerFactory.getLogger(CompositeNotifier.class);
3134
private final Iterable<Notifier> delegates;
3235

3336
public CompositeNotifier(Iterable<Notifier> delegates) {
@@ -37,6 +40,9 @@ public CompositeNotifier(Iterable<Notifier> delegates) {
3740

3841
@Override
3942
public Mono<Void> notify(InstanceEvent event) {
40-
return Flux.fromIterable(delegates).flatMap(d -> d.notify(event)).then();
43+
return Flux.fromIterable(delegates).flatMap(d -> d.notify(event).onErrorResume(error -> {
44+
log.warn("Unexpected exception while triggering notifications. Notification might not be sent.", error);
45+
return Mono.empty();
46+
})).then();
4147
}
4248
}

spring-boot-admin-server/src/test/java/de/codecentric/boot/admin/server/notify/CompositeNotifierTest.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
2121
import de.codecentric.boot.admin.server.domain.values.InstanceId;
2222
import de.codecentric.boot.admin.server.domain.values.StatusInfo;
23+
import reactor.core.publisher.Mono;
2324
import reactor.test.StepVerifier;
2425

2526
import java.util.Arrays;
@@ -28,16 +29,18 @@
2829
import static org.assertj.core.api.Assertions.assertThat;
2930

3031
public class CompositeNotifierTest {
31-
private static final InstanceEvent APP_DOWN = new InstanceStatusChangedEvent(InstanceId.of("-"), 0L,
32-
StatusInfo.ofDown());
32+
private static final InstanceEvent APP_DOWN = new InstanceStatusChangedEvent(InstanceId.of("-"),
33+
0L,
34+
StatusInfo.ofDown()
35+
);
3336

3437
@Test(expected = IllegalArgumentException.class)
35-
public void test_ctor_assert() {
38+
public void should_throw_for_invariants() {
3639
new CompositeNotifier(null);
3740
}
3841

3942
@Test
40-
public void test_all_notifiers_get_notified() {
43+
public void should_trigger_all_notifiers() {
4144
TestNotifier notifier1 = new TestNotifier();
4245
TestNotifier notifier2 = new TestNotifier();
4346
CompositeNotifier compositeNotifier = new CompositeNotifier(Arrays.asList(notifier1, notifier2));
@@ -47,4 +50,15 @@ public void test_all_notifiers_get_notified() {
4750
assertThat(notifier1.getEvents()).containsOnly(APP_DOWN);
4851
assertThat(notifier2.getEvents()).containsOnly(APP_DOWN);
4952
}
53+
54+
@Test
55+
public void should_continue_on_exception() {
56+
Notifier notifier1 = ev -> Mono.error(new IllegalStateException("Test"));
57+
TestNotifier notifier2 = new TestNotifier();
58+
CompositeNotifier compositeNotifier = new CompositeNotifier(Arrays.asList(notifier1, notifier2));
59+
60+
StepVerifier.create(compositeNotifier.notify(APP_DOWN)).verifyComplete();
61+
62+
assertThat(notifier2.getEvents()).containsOnly(APP_DOWN);
63+
}
5064
}

0 commit comments

Comments
 (0)