import de.juplo.kafka.chat.backend.domain.ChatHomeService;
import de.juplo.kafka.chat.backend.domain.ChatRoom;
-import de.juplo.kafka.chat.backend.domain.Message;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRebalanceListener;
{
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(
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];
}
}
int partition = tp.partition();
- long unseenOffset = offsets[partition];
+ kafkaChatRoomServiceMaps[partition] = new HashMap<>(); // TODO: reuse! Nicht immer alles neu laden
+ long unseenOffset = 0; // offsets[partition];
- log.info("Reading partition {} from {} -> {}", partition, unseenOffset, currentOffset);
+ 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);
});
}
(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;
}
}
})
.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());
- }
-
-
- class MessageHandler
- {
-
- }
-
- interface MessageHandlingStrategy
- {
- MessageHandlingStrategy handleMessage(Message message);
- }
-
-
- @RequiredArgsConstructor
- class NoOpMessageHandlingStrategy implements MessageHandlingStrategy
- {
- private final TopicPartition tp;
-
- @Override
- public MessageHandlingStrategy handleMessage(Message message)
- {
- log.warn("Not handling message {} for partition {}", message, tp);
- return this;
- }
- }
-
- class ChatRoomLoadingMessageHandlingStrategy implements MessageHandlingStrategy
- {
- private final TopicPartition tp;
- private final long currentOffset;
- private final long unseenOffset;
-
- ChatRoomLoadingMessageHandlingStrategy(TopicPartition tp, long currentOffset, long unseenOffset)
- {
- this.tp = tp;
- this.currentOffset = currentOffset;
- this.unseenOffset = unseenOffset;
-
- consumer.seek(tp, unseenOffset);
- }
-
- @Override
- public MessageHandlingStrategy handleMessage(Message message)
- {
- // todo
- return this;
- }
- }
-
- @RequiredArgsConstructor
- class DefaultMessageHandlingStrategy implements MessageHandlingStrategy
- {
- private final TopicPartition tp;
-
- @Override
- public MessageHandlingStrategy handleMessage(Message message)
- {
- chatrooms[tp.partition()].put()
- return this;
- }
+ return Flux.fromStream(chatRoomMaps[shard].values().stream());
}
}