@Log4j
class ChatRoomActiveMessageHandlingStrategy implements MessageHandlingStrategy
{
+ private final KafkaChatRoomService kafkaChatRoomService;
private final Producer<String, MessageTo> producer;
private final TopicPartition tp;
private final UUID chatRoomId;
// On successful send
{
// Emit new message
- message = new Message(key, metadata.offset(), timestamp, text);
- messages.put(message.getKey(), message);
+ Message message = new Message(key, metadata.offset(), timestamp, text);
+ kafkaChatRoomService.addMessage(message);
}
sink.success();
import de.juplo.kafka.chat.backend.domain.MessageMutationException;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.producer.Producer;
-import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.TopicPartition;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
private final LinkedHashMap<Message.MessageKey, Message> messages = new LinkedHashMap<>();
- private MessageHandlingStrategy strategy;
+ private volatile MessageHandlingStrategy strategy;
public KafkaChatRoomService(
@Override
- public Mono<Message> persistMessage(
+ synchronized public Mono<Message> persistMessage(
Message.MessageKey key,
LocalDateTime timestamp,
String text)
return strategy.persistMessage(key, timestamp, text);
}
- synchronized protected void addMessage(Message message) throws MessageMutationException
+ protected void addMessage(Message message) throws MessageMutationException
{
Message existingMessage = messages.get(message.getKey());
+ // TODO: Ist der Test nötig, oder wird das durch den Kontrollierten Wechsel
+ // der Strategie ggf. schon abgefangen? Weil: Wenn es nur um die Sorge geht,
+ // das eine Nachricht schon "durch den Nutzer" anders geschrieben wurde,
+ // fängt dies bereits der ChatRoom ab.
+ // Die Überprüfung hier war vor dem Hintergrund der Sorge hinzugefügt worden,
+ // dass die Nachricht wegen Verschluckern in Kafka / beim Strategiewechsel / ??
+ // doppelt aufschlägt...
if (existingMessage == null)
{
- messages.put(existingMessage.getKey(), existingMessage);
+ messages.put(message.getKey(), message);
}
else
{
@Override
synchronized public Mono<Message> getMessage(Message.MessageKey key)
{
+ // TODO: Aufrufe, auf eine Nachricht (einge gewisse Zeit) warten lassen
+ // und dann bedienen, wenn der der Callback vom Producer aufgerufen wird?
return Mono.fromSupplier(() -> messages.get(key));
}