test: Fixed `AbstractConfigurationIT#testPutMessageInNewChatRoom()`
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / TestWriter.java
index 559cd36..7d11c1d 100644 (file)
@@ -2,6 +2,7 @@ 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;
@@ -9,6 +10,7 @@ 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;
@@ -20,12 +22,11 @@ import java.util.concurrent.ThreadLocalRandom;
 
 
 @Slf4j
-public class TestWriter implements Runnable
+public class TestWriter
 {
-  @Override
-  public void run()
+  public Mono<Void> run()
   {
-    Flux
+    return Flux
         .fromIterable((Iterable<Integer>) () -> new Iterator<>()
         {
           private int i = 0;
@@ -42,12 +43,13 @@ 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))))
+            .retryWhen(Retry.fixedDelay(30, Duration.ofSeconds(1))))
         .doOnNext(message ->
         {
+          numSentMessages++;
           sentMessages.add(message);
           log.info(
               "{} sent a message to {}: {}",
@@ -63,8 +65,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<MessageTo> sendMessage(
@@ -96,12 +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<MessageTo> sentMessages = new LinkedList<>();
 
   volatile boolean running = true;
+  @Getter
+  private volatile int numSentMessages = 0;
 
 
   TestWriter(Integer port, ChatRoomInfoTo chatRoom, String username)