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.util.retry.Retry;
import java.nio.charset.Charset;
import java.time.Duration;
+import java.util.Iterator;
import java.util.concurrent.ThreadLocalRandom;
@Slf4j
-public class TestClient implements Runnable
+public class TestWriter implements Runnable
{
@Override
public void run()
{
- for (int i = 0; running; i++)
- {
- String message = "Message #" + i;
- for (ChatRoomInfoTo chatRoom : chatRooms)
- {
- 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));
- }
- try
- {
- Thread.sleep(ThreadLocalRandom.current().nextLong(700, 1000));
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
+ Flux
+ .fromIterable((Iterable<Integer>) () -> new Iterator<>()
+ {
+ private int i = 0;
+
+ @Override
+ public boolean hasNext()
+ {
+ return running;
+ }
+
+ @Override
+ public Integer next()
+ {
+ return i++;
+ }
+ })
+ .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))
+ .doOnError(throwable ->
+ {
+ WebClientResponseException e = (WebClientResponseException)throwable.getCause();
+ log.error(
+ "{} failed sending a message: {}",
+ user,
+ e.getResponseBodyAsString(Charset.defaultCharset()));
+ })
+ .then()
+ .block();
}
private Mono<MessageTo> sendMessage(
private final WebClient webClient;
- private final ChatRoomInfoTo[] chatRooms;
+ private final ChatRoomInfoTo chatRoom;
private final User user;
volatile boolean running = true;
- TestClient(Integer port, ChatRoomInfoTo[] chatRooms, String username)
+ TestWriter(Integer port, ChatRoomInfoTo chatRoom, String username)
{
webClient = WebClient.create("http://localhost:" + port);
- this.chatRooms = chatRooms;
+ this.chatRoom = chatRoom;
user = new User(username);
}
}