From: Kai Moritz Date: Sun, 20 Aug 2023 08:47:41 +0000 (+0200) Subject: WIP X-Git-Tag: rebase--2023-08-20~15 X-Git-Url: http://juplo.de/gitweb/?a=commitdiff_plain;h=05ce74d14f85d3fd722cfcd8be09c2a25fe3ef50;p=demos%2Fkafka%2Fchat WIP --- diff --git a/src/main/java/de/juplo/kafka/chat/backend/persistence/kafka/KafkaChatHomeService.java b/src/main/java/de/juplo/kafka/chat/backend/persistence/kafka/KafkaChatHomeService.java new file mode 100644 index 00000000..a67d6299 --- /dev/null +++ b/src/main/java/de/juplo/kafka/chat/backend/persistence/kafka/KafkaChatHomeService.java @@ -0,0 +1,80 @@ +package de.juplo.kafka.chat.backend.persistence.kafka; + +import de.juplo.kafka.chat.backend.domain.ChatHomeService; +import de.juplo.kafka.chat.backend.domain.ChatRoom; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.*; +import java.util.stream.IntStream; + + +@Slf4j +public class KafkaChatHomeService implements ChatHomeService +{ + private final Map[] chatrooms; + + + public KafkaChatHomeService( + int numShards, + int[] ownedShards, + Flux chatroomFlux) + { + log.debug("Creating InMemoryChatHomeService"); + this.chatrooms = new Map[numShards]; + Set owned = Arrays + .stream(ownedShards) + .collect( + () -> new HashSet<>(), + (set, i) -> set.add(i), + (a, b) -> a.addAll(b)); + for (int shard = 0; shard < numShards; shard++) + { + chatrooms[shard] = owned.contains(shard) + ? new HashMap<>() + : null; + } + chatroomFlux + .filter(chatRoom -> + { + if (owned.contains(chatRoom.getShard())) + { + return true; + } + else + { + log.info("Ignoring not owned chat-room {}", chatRoom); + return false; + } + }) + .toStream() + .forEach(chatroom -> chatrooms[chatroom.getShard()].put(chatroom.getId(), chatroom)); + } + + public void putChatRoom(ChatRoom chatRoom) + { + chatrooms[chatRoom.getShard()].put(chatRoom.getId(), chatRoom); + } + + @Override + public Mono getChatRoom(int shard, UUID id) + { + return Mono.justOrEmpty(chatrooms[shard].get(id)); + } + + @Override + public int[] getOwnedShards() + { + return IntStream + .range(0, chatrooms.length) + .filter(i -> chatrooms[i] != null) + .toArray(); + } + + @Override + public Flux getChatRooms(int shard) + { + return Flux.fromStream(chatrooms[shard].values().stream()); + } +} diff --git a/src/test/java/de/juplo/kafka/chat/backend/KafkaConfigurationIT.java b/src/test/java/de/juplo/kafka/chat/backend/KafkaConfigurationIT.java index 38c170e7..e56c660d 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/KafkaConfigurationIT.java +++ b/src/test/java/de/juplo/kafka/chat/backend/KafkaConfigurationIT.java @@ -25,7 +25,7 @@ import static de.juplo.kafka.chat.backend.KafkaConfigurationIT.MESSAGES_TOPIC; "chat.backend.kafka.message-channel-topic=" + MESSAGES_TOPIC, "chat.backend.kafka.num-partitions=3" }) @EmbeddedKafka(topics = { CHATROOMS_TOPIC, MESSAGES_TOPIC }, partitions = 3) -class KafkaConfigurationIT extends AbstractConfigurationIT +class KafkaConfigurationIT extends AbstractConfigurationWithShardingIT { final static String CHATROOMS_TOPIC = "TEST_CHATROOM_CHANNEL"; final static String MESSAGES_TOPIC = "TEST_MESSAGE_CHANNEL";