X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2FTestListener.java;h=3f7fb9d8b9c9309e7b35cf41b1f8d0bfe11f3e2a;hb=9bde1226e097e04c09f687a94148c0138a38f5b2;hp=35f65acdaaa73e8357a63408fe5867f421b769d3;hpb=7286776e39b3adcb3d8bff7e43d1b33305919ac2;p=demos%2Fkafka%2Fchat diff --git a/src/test/java/de/juplo/kafka/chat/backend/TestListener.java b/src/test/java/de/juplo/kafka/chat/backend/TestListener.java index 35f65acd..3f7fb9d8 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/TestListener.java +++ b/src/test/java/de/juplo/kafka/chat/backend/TestListener.java @@ -12,8 +12,9 @@ import org.springframework.http.codec.ServerSentEvent; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import reactor.core.scheduler.Schedulers; +import reactor.util.retry.Retry; +import java.time.Duration; import java.util.*; @@ -23,45 +24,41 @@ public class TestListener static final ParameterizedTypeReference> SSE_TYPE = new ParameterizedTypeReference<>() {}; - public Mono run() + public Flux run() { return Flux .fromArray(chatRooms) .flatMap(chatRoom -> { - log.info("Requesting messages from chat-room {}", chatRoom); List list = new LinkedList<>(); receivedMessages.put(chatRoom.getId(), list); - return receiveMessages(chatRoom) - .flatMap(sse -> - { - try - { - return Mono.just(objectMapper.readValue(sse.data(), MessageTo.class)); - } - catch (Exception e) - { - return Mono.error(e); - } - }) - .doOnNext(message -> - { - list.add(message); - log.info( - "Received a message from chat-room {}: {}", - chatRoom.getName(), - message); - }); + return receiveMessages(chatRoom); + }); + } + + Flux receiveMessages(ChatRoomInfoTo chatRoom) + { + log.info("Requesting messages for chat-room {}", chatRoom); + List list = receivedMessages.get(chatRoom.getId()); + return receiveServerSentEvents(chatRoom) + .flatMap(sse -> + { + try + { + return Mono.just(objectMapper.readValue(sse.data(), MessageTo.class)); + } + catch (Exception e) + { + return Mono.error(e); + } }) - .limitRate(10) - .takeUntil(message -> !running) - .doOnComplete(() -> log.info("TestListener is done")) - .parallel(chatRooms.length) - .runOn(Schedulers.parallel()) - .then(); + .doOnNext(message -> list.add(message)) + .doOnComplete(() -> log.info("{} was completed!", chatRoom)) + .doOnError(throwalbe -> log.error("{} failed: {}", chatRoom, throwalbe)) + .thenMany(Flux.defer(() -> receiveMessages(chatRoom))); } - Flux> receiveMessages(ChatRoomInfoTo chatRoom) + Flux> receiveServerSentEvents(ChatRoomInfoTo chatRoom) { return webClient .get() @@ -70,7 +67,8 @@ public class TestListener chatRoom.getId()) .accept(MediaType.TEXT_EVENT_STREAM) .retrieve() - .bodyToFlux(SSE_TYPE); + .bodyToFlux(SSE_TYPE) + .retryWhen(Retry.fixedDelay(15, Duration.ofSeconds(1))); } @@ -80,8 +78,6 @@ public class TestListener final Map> receivedMessages = new HashMap<>(); - volatile boolean running = true; - TestListener(Integer port, ChatRoomInfoTo[] chatRooms) {