1 package de.juplo.kafka.chat.backend.persistence.kafka;
3 import de.juplo.kafka.chat.backend.ChatBackendProperties;
4 import de.juplo.kafka.chat.backend.domain.ChatHome;
5 import de.juplo.kafka.chat.backend.domain.Message;
6 import de.juplo.kafka.chat.backend.domain.ShardingStrategy;
7 import de.juplo.kafka.chat.backend.persistence.KafkaLikeShardingStrategy;
8 import org.apache.kafka.clients.consumer.Consumer;
9 import org.apache.kafka.clients.consumer.ConsumerConfig;
10 import org.apache.kafka.clients.consumer.KafkaConsumer;
11 import org.apache.kafka.clients.producer.KafkaProducer;
12 import org.apache.kafka.clients.producer.Producer;
13 import org.apache.kafka.clients.producer.ProducerConfig;
14 import org.apache.kafka.common.serialization.IntegerDeserializer;
15 import org.apache.kafka.common.serialization.IntegerSerializer;
16 import org.apache.kafka.common.serialization.StringDeserializer;
17 import org.apache.kafka.common.serialization.StringSerializer;
18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 import org.springframework.context.annotation.Bean;
20 import org.springframework.context.annotation.Configuration;
21 import org.springframework.kafka.support.serializer.JsonDeserializer;
22 import org.springframework.kafka.support.serializer.JsonSerializer;
24 import java.time.Clock;
25 import java.time.ZoneId;
26 import java.util.HashMap;
28 import java.util.Properties;
31 @ConditionalOnProperty(
32 prefix = "chat.backend",
34 havingValue = "kafka")
36 public class KafkaServicesConfiguration
39 ChatHome kafkaChatHome(
40 ShardingStrategy shardingStrategy,
41 ChatMessageChannel chatMessageChannel)
43 return new KafkaChatHome(shardingStrategy, chatMessageChannel);
47 KafkaChatRoomFactory chatRoomFactory(ChatRoomChannel chatRoomChannel)
49 return new KafkaChatRoomFactory(chatRoomChannel);
53 ChatRoomChannel chatRoomChannel(
54 ChatBackendProperties properties,
55 Producer<Integer, ChatRoomTo> chatRoomChannelProducer,
56 Consumer<Integer, ChatRoomTo> chatRoomChannelConsumer,
57 ShardingStrategy shardingStrategy,
58 ChatMessageChannel chatMessageChannel,
61 return new ChatRoomChannel(
62 properties.getKafka().getTopic(),
63 chatRoomChannelProducer,
64 chatRoomChannelConsumer,
68 properties.getChatroomBufferSize());
72 Producer<Integer, ChatRoomTo> chatRoomChannelProducer(
73 Properties defaultProducerProperties,
74 IntegerSerializer integerSerializer,
75 JsonSerializer<ChatRoomTo> chatRoomSerializer)
77 return new KafkaProducer<>(
78 defaultProducerProperties,
84 IntegerSerializer integerSerializer()
86 return new IntegerSerializer();
90 JsonSerializer<ChatRoomTo> chatRoomSerializer()
92 JsonSerializer<ChatRoomTo> serializer = new JsonSerializer<>();
94 Map.of(JsonSerializer.ADD_TYPE_INFO_HEADERS, false),
100 Consumer<Integer, ChatRoomTo> chatRoomChannelConsumer(
101 Properties defaultConsumerProperties,
102 IntegerDeserializer integerDeserializer,
103 JsonDeserializer<ChatRoomTo> chatRoomDeserializer)
105 Map<String, Object> properties = new HashMap<>();
106 defaultConsumerProperties.forEach((key, value) -> properties.put(key.toString(), value));
108 ConsumerConfig.GROUP_ID_CONFIG,
109 "chat_room_channel");
110 return new KafkaConsumer<>(
113 chatRoomDeserializer);
117 IntegerDeserializer integerDeserializer()
119 return new IntegerDeserializer();
123 JsonDeserializer<ChatRoomTo> chatRoomDeserializer()
125 JsonDeserializer<ChatRoomTo> deserializer = new JsonDeserializer<>();
126 deserializer.configure(
128 JsonDeserializer.USE_TYPE_INFO_HEADERS, false,
129 JsonDeserializer.VALUE_DEFAULT_TYPE, ChatRoomTo.class,
130 JsonDeserializer.TRUSTED_PACKAGES, getClass().getPackageName()),
136 ShardingStrategy shardingStrategy(ChatBackendProperties properties)
138 return new KafkaLikeShardingStrategy(properties.getKafka().getNumPartitions());
142 ChatMessageChannel chatMessageChannel(
143 ChatBackendProperties properties,
144 Producer<String, MessageTo> chatMessageChannelProducer,
145 Consumer<String, MessageTo> chatMessageChannelConsumer,
148 return new ChatMessageChannel(
149 properties.getKafka().getTopic(),
150 chatMessageChannelProducer,
151 chatMessageChannelConsumer,
153 properties.getKafka().getNumPartitions());
157 Producer<String, MessageTo> chatMessageChannelProducer(
158 Properties defaultProducerProperties,
159 StringSerializer stringSerializer,
160 JsonSerializer<MessageTo> messageSerializer)
162 return new KafkaProducer<>(
163 defaultProducerProperties,
169 StringSerializer stringSerializer()
171 return new StringSerializer();
175 JsonSerializer<MessageTo> chatMessageSerializer()
177 JsonSerializer<MessageTo> serializer = new JsonSerializer<>();
178 serializer.configure(
179 Map.of(JsonSerializer.ADD_TYPE_INFO_HEADERS, false),
185 Consumer<String, MessageTo> chatMessageChannelConsumer(
186 Properties defaultConsumerProperties,
187 StringDeserializer stringDeserializer,
188 JsonDeserializer<MessageTo> messageDeserializer)
190 Map<String, Object> properties = new HashMap<>();
191 defaultConsumerProperties.forEach((key, value) -> properties.put(key.toString(), value));
193 ConsumerConfig.GROUP_ID_CONFIG,
194 "chat_message_channel");
195 return new KafkaConsumer<>(
198 messageDeserializer);
202 StringDeserializer stringDeserializer()
204 return new StringDeserializer();
208 JsonDeserializer<MessageTo> chatMessageDeserializer()
210 JsonDeserializer<MessageTo> deserializer = new JsonDeserializer<>();
211 deserializer.configure(
213 JsonDeserializer.USE_TYPE_INFO_HEADERS, false,
214 JsonDeserializer.VALUE_DEFAULT_TYPE, MessageTo.class,
215 JsonDeserializer.TRUSTED_PACKAGES, getClass().getPackageName()),
221 Properties defaultProducerProperties(ChatBackendProperties chatBackendProperties)
223 Properties properties = new Properties();
224 properties.setProperty(
225 ProducerConfig.CLIENT_ID_CONFIG,
226 chatBackendProperties.getKafka().getClientId());
227 properties.setProperty(
228 ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
229 chatBackendProperties.getKafka().getBootstrapServers());
234 Properties defaultConsumerProperties(ChatBackendProperties chatBackendProperties)
236 Properties properties = new Properties();
237 properties.setProperty(
238 ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
239 chatBackendProperties.getKafka().getBootstrapServers());
240 properties.setProperty(
241 ConsumerConfig.CLIENT_ID_CONFIG,
242 chatBackendProperties.getKafka().getClientId());
243 properties.setProperty(
244 ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,
246 properties.setProperty(
247 ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,
255 return ZoneId.systemDefault();