feat: Introduced a kafka-like `ShardingStrategy` for `inmemory`
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / ChatBackendConfiguration.java
1 package de.juplo.kafka.chat.backend;
2
3 import de.juplo.kafka.chat.backend.domain.ChatHome;
4 import de.juplo.kafka.chat.backend.domain.ChatHomeFactory;
5 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
6 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
7 import org.springframework.boot.context.properties.EnableConfigurationProperties;
8 import org.springframework.context.annotation.Bean;
9 import org.springframework.context.annotation.Configuration;
10
11 import java.time.Clock;
12
13
14 @Configuration
15 @EnableConfigurationProperties(ChatBackendProperties.class)
16 public class ChatBackendConfiguration
17 {
18   @Bean
19   ChatHome[] chatHomes(
20       ChatHomeFactory factory,
21       ChatBackendProperties properties,
22       StorageStrategy storageStrategy)
23   {
24     ChatHome[] chatHomes = new ChatHome[properties.getInmemory().getNumShards()];
25     storageStrategy
26         .read()
27         .subscribe(chatRoom ->
28         {
29           int shard = chatRoom.getShard();
30           if (chatHomes[shard] == null)
31             chatHomes[shard] = factory.createChatHome(shard);
32         });
33     return chatHomes;
34   }
35
36   @Bean
37   Clock clock()
38   {
39     return Clock.systemDefaultZone();
40   }
41 }