X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2Fpersistence%2Finmemory%2FInMemoryChatHomeService.java;h=25a9bcf60ae07143cdd2b18e7485993463eb0f2a;hb=e1ad66ecb1dc386bb357e364a05b071ec45920e1;hp=0beb7f362a872b80bacb9e007d3b51804f4ab1cf;hpb=7dc64266c5675ead8214edb36173b80363e08b1f;p=demos%2Fkafka%2Fchat diff --git a/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java b/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java index 0beb7f36..25a9bcf6 100644 --- a/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java +++ b/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java @@ -1,8 +1,6 @@ package de.juplo.kafka.chat.backend.persistence.inmemory; -import de.juplo.kafka.chat.backend.domain.ChatRoom; -import de.juplo.kafka.chat.backend.domain.ChatHomeService; -import de.juplo.kafka.chat.backend.domain.ShardingStrategy; +import de.juplo.kafka.chat.backend.domain.*; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -11,38 +9,42 @@ import java.util.*; @Slf4j -public class InMemoryChatHomeService implements ChatHomeService +public class InMemoryChatHomeService implements ChatHomeService { - private final ShardingStrategy shardingStrategy; private final Map[] chatrooms; + private final Set ownedShards; + private final ShardingStrategy shardingStrategy; public InMemoryChatHomeService( - ShardingStrategy shardingStrategy, int numShards, int[] ownedShards, + ShardingStrategy shardingStrategy, Flux chatroomFlux) { log.debug("Creating InMemoryChatHomeService"); - this.shardingStrategy = shardingStrategy; + this.chatrooms = new Map[numShards]; - Set owned = Arrays + + this.ownedShards = Arrays .stream(ownedShards) .collect( () -> new HashSet<>(), (set, i) -> set.add(i), (a, b) -> a.addAll(b)); + + this.shardingStrategy = shardingStrategy; + for (int shard = 0; shard < numShards; shard++) { - chatrooms[shard] = owned.contains(shard) + chatrooms[shard] = this.ownedShards.contains(shard) ? new HashMap<>() : null; } chatroomFlux .filter(chatRoom -> { - int shard = shardingStrategy.selectShard(chatRoom.getId()); - if (owned.contains(shard)) + if (this.ownedShards.contains(chatRoom.getShard())) { return true; } @@ -53,35 +55,46 @@ public class InMemoryChatHomeService implements ChatHomeService - { - getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom); - }); + .forEach(chatroom -> chatrooms[chatroom.getShard()].put(chatroom.getId(), chatroom)); } - @Override - public Mono putChatRoom(ChatRoom chatRoom) + void putChatRoom(ChatRoom chatRoom) { - getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom); - return Mono.just(chatRoom); + UUID id = chatRoom.getId(); + int shard = shardingStrategy.selectShard(id); + if (!ownedShards.contains(shard)) + throw new ShardNotOwnedException(this, chatRoom, shard, ownedShards); + chatrooms[shard].put(id, chatRoom); } @Override - public Mono getChatRoom(int shard, UUID id) + public Mono getChatRoom(UUID id) { - return Mono.justOrEmpty(chatrooms[shard].get(id)); + int shard = shardingStrategy.selectShard(id); + if (ownedShards.contains(shard)) + { + return Mono.justOrEmpty(chatrooms[shard].get(id)); + } + else + { + int[] ownedShards = new int[this.ownedShards.size()]; + Iterator iterator = this.ownedShards.iterator(); + for (int i = 0; iterator.hasNext(); i++) + { + ownedShards[i] = iterator.next(); + } + return Mono.error(new UnknownChatroomException( + id, + shard, + ownedShards)); + } } @Override - public Flux getChatRooms(int shard) - { - return Flux.fromStream(chatrooms[shard].values().stream()); - } - - - private Map getChatRoomMapFor(ChatRoom chatRoom) + public Flux getChatRooms() { - int shard = shardingStrategy.selectShard(chatRoom.getId()); - return chatrooms[shard]; + return Flux + .fromIterable(ownedShards) + .flatMap(shard -> Flux.fromIterable(chatrooms[shard].values())); } }