X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2Fpersistence%2Fkafka%2FChatRoomChannel.java;h=9ea23b13126afa753fc4290e54e7aa6ef7fc40aa;hb=5c338c58065988f7841c4ab9ee1b193e754da9b9;hp=b08a50d2a6c78a3309e3bb347005af065ec9ff7e;hpb=716ffa6a7665496e614ce6a1671c8e49c562a4c2;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 b08a50d2..9ea23b13 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 @@ -9,67 +9,31 @@ 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.Mono; import java.time.*; import java.util.List; +import java.util.Optional; import java.util.UUID; +import java.util.concurrent.Callable; @RequiredArgsConstructor @Slf4j -public class ChatRoomChannel implements Runnable +public class ChatRoomChannel implements Callable> { 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; - @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) - { - UUID id = record.value().getId(); - String name = record.value().getName(); - chatRoomFactory.createChatRoom(id, name); - } - } - catch (WakeupException e) - { - } - catch (RecordDeserializationException e) - { - } - } - } - - void createChatRoom() - { - log.info("Creating ChatRoom with buffer-size {}", bufferSize); - KafkaChatRoomService service = new KafkaChatRoomService(chatMessageChannel, id); - int shard = shardingStrategy.selectShard(id); - ChatRoom chatRoom = new ChatRoom(id, name, shard, clock, service, bufferSize); - chatMessageChannel.putChatRoom(chatRoom); - } - Mono sendCreateChatRoomRequest( UUID chatRoomId, String name) @@ -104,4 +68,51 @@ public class ChatRoomChannel implements Runnable })); }); } + + @Override + public Optional call() + { + 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; + } + catch (Exception e) + { + log.error("Exiting abnormally!"); + return Optional.of(e); + } + } + + log.info("Exiting normally"); + return Optional.empty(); + } + + + 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); + } }