X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2Fdomain%2FChatroom.java;h=2261e022e201e4a436ae50e542017c4077da13a2;hb=c04279dc82b8e662f7a8408ff74f7acd9951cf72;hp=966a28eeb13a331196bda881647bb2c170f07c2a;hpb=6c96b0b685b7fece1761f9471d5f0689171956ed;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 966a28ee..2261e022 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 @@ -17,19 +17,21 @@ public class Chatroom private final UUID id; @Getter private final String name; - private final PersistenceStrategy persistence; - private final Sinks.Many sink; + private final ChatroomService chatroomService; + private final int bufferSize; + private Sinks.Many sink; public Chatroom( UUID id, String name, - PersistenceStrategy persistence, + ChatroomService chatroomService, int bufferSize) { this.id = id; this.name = name; - this.persistence = persistence; - this.sink = Sinks.many().multicast().onBackpressureBuffer(bufferSize); + this.chatroomService = chatroomService; + this.bufferSize = bufferSize; + this.sink = createSink(); } @@ -39,20 +41,30 @@ public class Chatroom String user, String text) { - return persistence + return chatroomService .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); + } + }); } public Mono getMessage(String username, Long messageId) { - return persistence.getMessage(Message.MessageKey.of(username, messageId)); + Message.MessageKey key = Message.MessageKey.of(username, messageId); + return chatroomService.getMessage(key); } - public Flux listen() + synchronized public Flux listen() { - return sink.asFlux(); + return sink + .asFlux() + .doOnCancel(() -> sink = createSink()); // Sink hast to be recreated on auto-cancel! } public Flux getMessages() @@ -62,6 +74,14 @@ public class Chatroom public Flux getMessages(long first, long last) { - return persistence.getMessages(first, last); + return chatroomService.getMessages(first, last); + } + + private Sinks.Many createSink() + { + return Sinks + .many() + .multicast() + .onBackpressureBuffer(bufferSize); } }