X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2Fdomain%2FChatroom.java;h=60f7274e813398bd8050d1af55d27552fdfd81cb;hb=985e677499e8a3a6efcfbf3b3a4c90181194ff27;hp=c05fda0abf137df3e6ba5079c15b0cfbec392e29;hpb=0daa9d1a4d6f6b95ffdb42fcf1350ff26a9166e0;p=demos%2Fkafka%2Fchat diff --git a/src/main/java/de/juplo/kafka/chat/backend/domain/Chatroom.java b/src/main/java/de/juplo/kafka/chat/backend/domain/Chatroom.java index c05fda0a..60f7274e 100644 --- a/src/main/java/de/juplo/kafka/chat/backend/domain/Chatroom.java +++ b/src/main/java/de/juplo/kafka/chat/backend/domain/Chatroom.java @@ -1,7 +1,6 @@ package de.juplo.kafka.chat.backend.domain; import lombok.Getter; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -11,7 +10,6 @@ import java.time.LocalDateTime; import java.util.*; -@RequiredArgsConstructor @Slf4j public class Chatroom { @@ -20,7 +18,22 @@ public class Chatroom @Getter private final String name; private final PersistenceStrategy persistence; - private final Sinks.Many sink = Sinks.many().multicast().onBackpressureBuffer(); + private final int bufferSize; + private Sinks.Many sink; + + public Chatroom( + UUID id, + String name, + PersistenceStrategy persistence, + int bufferSize) + { + this.id = id; + this.name = name; + this.persistence = persistence; + this.bufferSize = bufferSize; + this.sink = createSink(); + } + synchronized public Mono addMessage( Long id, @@ -30,7 +43,14 @@ public class Chatroom { return persistence .persistMessage(Message.MessageKey.of(user, id), timestamp, text) - .doOnNext(message -> sink.tryEmitNext(message).orThrow()); + .doOnNext(message -> + { + Sinks.EmitResult result = sink.tryEmitNext(message); + if (result.isFailure()) + { + log.warn("Emitting of message failed with {} for {}", result.name(), message); + } + }); } @@ -39,13 +59,28 @@ public class Chatroom return persistence.getMessage(Message.MessageKey.of(username, messageId)); } - public Flux listen() + synchronized public Flux listen() + { + return sink + .asFlux() + .doOnCancel(() -> sink = createSink()); // Sink hast to be recreated on auto-cancel! + } + + public Flux getMessages() { - return sink.asFlux(); + return getMessages(0, Long.MAX_VALUE); } public Flux getMessages(long first, long last) { return persistence.getMessages(first, last); } + + private Sinks.Many createSink() + { + return Sinks + .many() + .multicast() + .onBackpressureBuffer(bufferSize); + } }