X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2Fpersistence%2Fkafka%2FChatRoomChannel.java;h=97ee9885725b28761a60d1c2656e196458b56f3d;hb=0b917f243af8103df47a1ef76e8db59d2b90ae34;hp=0c553e69fce5847cb0e95e70b288004b40b82b0d;hpb=13c51b4630177e7f6649500a3d4b876a12509af6;p=demos%2Fkafka%2Fchat diff --git a/src/main/java/de/juplo/kafka/chat/backend/persistence/kafka/ChatRoomChannel.java b/src/main/java/de/juplo/kafka/chat/backend/persistence/kafka/ChatRoomChannel.java index 0c553e69..97ee9885 100644 --- a/src/main/java/de/juplo/kafka/chat/backend/persistence/kafka/ChatRoomChannel.java +++ b/src/main/java/de/juplo/kafka/chat/backend/persistence/kafka/ChatRoomChannel.java @@ -1,90 +1,43 @@ package de.juplo.kafka.chat.backend.persistence.kafka; import de.juplo.kafka.chat.backend.domain.*; -import de.juplo.kafka.chat.backend.persistence.KafkaLikeShardingStrategy; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.consumer.ConsumerRebalanceListener; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.TopicPartition; -import org.apache.kafka.common.errors.RecordDeserializationException; import org.apache.kafka.common.errors.WakeupException; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.*; -import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.UUID; -import java.util.stream.IntStream; +@RequiredArgsConstructor @Slf4j public class ChatRoomChannel implements Runnable { private final String topic; - private final Consumer consumer; private final Producer producer; + private final Consumer consumer; private final ShardingStrategy shardingStrategy; private final ChatMessageChannel chatMessageChannel; + private final Clock clock; + private final int bufferSize; private boolean running; - public ChatRoomChannel( - String topic, - Consumer consumer, - Producer producer, - int numShards, - ChatMessageChannel chatMessageChannel) - { - log.debug( - "Creating ChatRoomChannel for topic {} with sharding for {} partitions", - topic, - numShards); - this.topic = topic; - this.consumer = consumer; - this.producer = producer; - this.shardingStrategy = new KafkaLikeShardingStrategy(numShards); - this.chatMessageChannel = chatMessageChannel; - } - - - @Override - public void run() - { - consumer.assign(List.of(new TopicPartition(topic, 0))); - - running = true; - - while (running) - { - try - { - ConsumerRecords records = consumer.poll(Duration.ofMinutes(5)); - log.info("Fetched {} messages", records.count()); - - } - catch (WakeupException e) - { - } - catch (RecordDeserializationException e) - { - } - } - } - - Mono sendCreateChatRoomRequest( UUID chatRoomId, String name) { int shard = this.shardingStrategy.selectShard(chatRoomId); - ChatRoomTo chatRoomTo = ChatRoomTo.of(chatRoomId, name, shard); + ChatRoomTo chatRoomTo = ChatRoomTo.of(chatRoomId.toString(), name, shard); return Mono.create(sink -> { ProducerRecord record = @@ -97,22 +50,61 @@ public class ChatRoomChannel implements Runnable { if (metadata != null) { - log.info("Successfully send chreate-request {}", chatRoomTo); + log.info("Successfully send chreate-request for chat room: {}", chatRoomTo); sink.success(chatRoomTo.toChatRoomInfo()); } else { // On send-failure log.error( - "Could not create-request for chat-room={}, key={}, timestamp={}, text={}: {}", + "Could not send create-request for chat room (id={}, name={}): {}", chatRoomId, - key, - timestamp, - text, + name, exception); sink.error(exception); } })); }); } + + @Override + public void run() + { + consumer.assign(List.of(new TopicPartition(topic, 0))); + + running = true; + + while (running) + { + try + { + ConsumerRecords records = consumer.poll(Duration.ofMinutes(5)); + log.info("Fetched {} messages", records.count()); + + for (ConsumerRecord record : records) + { + createChatRoom(record.value().toChatRoomInfo()); + } + } + catch (WakeupException e) + { + log.info("Received WakeupException, exiting!"); + running = false; + } + } + + log.info("Exiting normally"); + } + + + void createChatRoom(ChatRoomInfo chatRoomInfo) + { + UUID id = chatRoomInfo.getId(); + String name = chatRoomInfo.getName(); + int shard = chatRoomInfo.getShard(); + log.info("Creating ChatRoom {} with buffer-size {}", id, bufferSize); + KafkaChatRoomService service = new KafkaChatRoomService(chatMessageChannel, id); + ChatRoom chatRoom = new ChatRoom(id, name, shard, clock, service, bufferSize); + chatMessageChannel.putChatRoom(chatRoom); + } }