X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2FTestWriter.java;h=7d11c1d29134e0e047dbd60c995876fe62fd9241;hb=0e5178b7a3b8c8f3167f99c2d36452a2a68c80fa;hp=929d84f9c4204b3c43bf6f046c35478de6c8a734;hpb=857a6ef855d663c32dc38e2e645b4d7c4d817466;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 929d84f9..7d11c1d2 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/TestWriter.java +++ b/src/test/java/de/juplo/kafka/chat/backend/TestWriter.java @@ -2,51 +2,75 @@ package de.juplo.kafka.chat.backend; import de.juplo.kafka.chat.backend.api.ChatRoomInfoTo; import de.juplo.kafka.chat.backend.api.MessageTo; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; 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() { - for (int i = 0; running; i++) - { - String message = "Message #" + i; - try - { - sendMessage(chatRoom, message) - .retryWhen(Retry.fixedDelay(10, Duration.ofSeconds(1))) - .map(MessageTo::toString) - .onErrorResume(throwable -> - { - WebClientResponseException e = (WebClientResponseException)throwable.getCause(); - return Mono.just(e.getResponseBodyAsString(Charset.defaultCharset())); - }) - .subscribe(result -> log.info( - "{} sent a message to {}: {}", - user, - chatRoom, - result)); + return Flux + .fromIterable((Iterable) () -> new Iterator<>() + { + private int i = 0; - Thread.sleep(ThreadLocalRandom.current().nextLong(700, 1000)); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } + @Override + public boolean hasNext() + { + return running; + } + + @Override + public Integer next() + { + return i++; + } + }) + .delayElements(Duration.ofMillis(ThreadLocalRandom.current().nextLong(500, 1500))) + .map(i -> "Message #" + i) + .flatMap(message -> sendMessage(chatRoom, message) + .retryWhen(Retry.fixedDelay(30, Duration.ofSeconds(1)))) + .doOnNext(message -> + { + numSentMessages++; + sentMessages.add(message); + log.info( + "{} sent a message to {}: {}", + user, + chatRoom, + message); + }) + .doOnError(throwable -> + { + WebClientResponseException e = (WebClientResponseException)throwable.getCause(); + log.error( + "{} failed sending a message: {}", + user, + e.getResponseBodyAsString(Charset.defaultCharset())); + }) + .limitRate(1) + .takeUntil(message -> !running) + .doOnComplete(() -> log.info("TestWriter {} is done", user)) + .parallel(1) + .runOn(Schedulers.parallel()) + .then(); } private Mono sendMessage( @@ -78,10 +102,14 @@ public class TestWriter implements Runnable private final WebClient webClient; - private final ChatRoomInfoTo chatRoom; - private final User user; + + final ChatRoomInfoTo chatRoom; + final User user; + final List sentMessages = new LinkedList<>(); volatile boolean running = true; + @Getter + private volatile int numSentMessages = 0; TestWriter(Integer port, ChatRoomInfoTo chatRoom, String username)