X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2FTestWriter.java;h=0d2c41e728e8d7dc214149b6c74dd5c97d890842;hb=bce5ce999de007bb43c28f908fceef0646ac513c;hp=267519e1490f3652fcd7afe8ed85ba88ba991239;hpb=d89b86b82b4c57245dcc2042eea168aaad727087;p=demos%2Fkafka%2Fchat diff --git a/src/test/java/de/juplo/kafka/chat/backend/TestWriter.java b/src/test/java/de/juplo/kafka/chat/backend/TestWriter.java index 267519e1..0d2c41e7 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/TestWriter.java +++ b/src/test/java/de/juplo/kafka/chat/backend/TestWriter.java @@ -9,21 +9,23 @@ import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; import reactor.util.retry.Retry; import java.nio.charset.Charset; import java.time.Duration; import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import java.util.concurrent.ThreadLocalRandom; @Slf4j -public class TestWriter implements Runnable +public class TestWriter { - @Override - public void run() + public Mono run() { - Flux + return Flux .fromIterable((Iterable) () -> new Iterator<>() { private int i = 0; @@ -40,15 +42,19 @@ public class TestWriter implements Runnable return i++; } }) + .delayElements(Duration.ofMillis(ThreadLocalRandom.current().nextLong(500, 1500))) .map(i -> "Message #" + i) .flatMap(message -> sendMessage(chatRoom, message) - .delayElement(Duration.ofMillis(ThreadLocalRandom.current().nextLong(500, 1500))) .retryWhen(Retry.fixedDelay(10, Duration.ofSeconds(1)))) - .doOnNext(message -> log.info( - "{} sent a message to {}: {}", - user, - chatRoom, - message)) + .doOnNext(message -> + { + sentMessages.add(message); + log.info( + "{} sent a message to {}: {}", + user, + chatRoom, + message); + }) .doOnError(throwable -> { WebClientResponseException e = (WebClientResponseException)throwable.getCause(); @@ -57,8 +63,12 @@ public class TestWriter implements Runnable user, e.getResponseBodyAsString(Charset.defaultCharset())); }) - .then() - .block(); + .limitRate(1) + .takeUntil(message -> !running) + .doOnComplete(() -> log.info("TestWriter {} is done", user)) + .parallel(1) + .runOn(Schedulers.parallel()) + .then(); } private Mono sendMessage( @@ -91,7 +101,9 @@ public class TestWriter implements Runnable private final WebClient webClient; private final ChatRoomInfoTo chatRoom; - private final User user; + + final User user; + final List sentMessages = new LinkedList<>(); volatile boolean running = true;