WIP
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / persistence / kafka / KafkaChatHomeService.java
index 70a96bc..e171bc5 100644 (file)
@@ -17,9 +17,9 @@ public class KafkaChatHomeService implements ChatHomeService, ConsumerRebalanceL
 {
   private final Consumer<String, MessageTo> consumer;
   private final String topic;
-  private final long[] offsets;
-  private final MessageHandler[] handlers;
-  private final Map<UUID, ChatRoom>[] chatrooms;
+  // private final long[] offsets; Erst mal immer alles neu einlesen
+  private final Map<UUID, KafkaChatRoomService>[] kafkaChatRoomServiceMaps;
+  private final Map<UUID, ChatRoom>[] chatRoomMaps;
 
 
   public KafkaChatHomeService(
@@ -30,14 +30,13 @@ public class KafkaChatHomeService implements ChatHomeService, ConsumerRebalanceL
     log.debug("Creating KafkaChatHomeService");
     this.consumer = consumer;
     this.topic = topic;
-    this.offsets = new long[numShards];
-    this.handlers = new MessageHandler[numShards];
-    for (int i=0; i< numShards; i++)
-    {
-      this.offsets[i] = 0l;
-      this.handlers[i] = new MessageHandler(new TopicPartition(topic, i));
-    }
-    this.chatrooms = new Map[numShards];
+    // this.offsets = new long[numShards];
+    // for (int i=0; i< numShards; i++)
+    // {
+    //   this.offsets[i] = 0l;
+    // }
+    this.kafkaChatRoomServiceMaps = new Map[numShards];
+    this.chatRoomMaps = new Map[numShards];
   }
 
 
@@ -53,9 +52,19 @@ public class KafkaChatHomeService implements ChatHomeService, ConsumerRebalanceL
       }
 
       int partition = tp.partition();
-      long unseenOffset = offsets[partition];
-
-      log.info("Reading partition {} from {} -> {}", partition, unseenOffset, currentOffset);
+      kafkaChatRoomServiceMaps[partition] = new HashMap<>(); // TODO: reuse! Nicht immer alles neu laden
+      long unseenOffset = 0; // offsets[partition];
+
+      log.info(
+          "Loading messages from partition {}: start-offset={} -> current-offset={}",
+          partition,
+          unseenOffset,
+          currentOffset);
+
+      consumer.seek(tp, unseenOffset);
+      chatRoomMaps[partition]
+          .values()
+          .stream()
       handlers[partition] = new ChatRoomLoadingMessageHandlingStrategy(tp, currentOffset, unseenOffset);
     });
   }
@@ -95,7 +104,7 @@ public class KafkaChatHomeService implements ChatHomeService, ConsumerRebalanceL
         (a, b) -> a.addAll(b));
     for (int shard = 0; shard < numShards; shard++)
     {
-      chatrooms[shard] = owned.contains(shard)
+      chatRoomMaps[shard] = owned.contains(shard)
         ? new HashMap<>()
         : null;
     }
@@ -113,25 +122,25 @@ public class KafkaChatHomeService implements ChatHomeService, ConsumerRebalanceL
         }
       })
       .toStream()
-      .forEach(chatroom -> chatrooms[chatroom.getShard()].put(chatroom.getId(), chatroom));
+      .forEach(chatroom -> chatRoomMaps[chatroom.getShard()].put(chatroom.getId(), chatroom));
   }
 
   @Override
   public Mono<ChatRoom> putChatRoom(ChatRoom chatRoom)
   {
-    chatrooms[chatRoom.getShard()].put(chatRoom.getId(), chatRoom);
+    chatRoomMaps[chatRoom.getShard()].put(chatRoom.getId(), chatRoom);
     return Mono.just(chatRoom);
   }
 
   @Override
   public Mono<ChatRoom> getChatRoom(int shard, UUID id)
   {
-    return Mono.justOrEmpty(chatrooms[shard].get(id));
+    return Mono.justOrEmpty(chatRoomMaps[shard].get(id));
   }
 
   @Override
   public Flux<ChatRoom> getChatRooms(int shard)
   {
-    return Flux.fromStream(chatrooms[shard].values().stream());
+    return Flux.fromStream(chatRoomMaps[shard].values().stream());
   }
 }