Skip to content

Commit 6bd482c

Browse files
feat : use customizer to configure deadletter config
1 parent a695350 commit 6bd482c

File tree

5 files changed

+25
-41
lines changed

5 files changed

+25
-41
lines changed

order-service/src/main/java/com/example/orderservice/config/kafka/KafkaStreamsConfig.java

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ Licensed under MIT License Copyright (c) 2023 Raja Kolli.
1313
import com.example.common.dtos.OrderDto;
1414
import com.example.orderservice.services.OrderManageService;
1515
import java.time.Duration;
16-
import java.util.Map;
17-
import org.apache.kafka.clients.consumer.ConsumerConfig;
16+
import java.util.Properties;
1817
import org.apache.kafka.common.TopicPartition;
1918
import org.apache.kafka.common.serialization.Serde;
2019
import org.apache.kafka.common.serialization.Serdes;
@@ -31,19 +30,16 @@ Licensed under MIT License Copyright (c) 2023 Raja Kolli.
3130
import org.apache.kafka.streams.state.Stores;
3231
import org.slf4j.Logger;
3332
import org.slf4j.LoggerFactory;
34-
import org.springframework.boot.autoconfigure.kafka.KafkaConnectionDetails;
35-
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
3633
import org.springframework.context.annotation.Bean;
3734
import org.springframework.context.annotation.Configuration;
3835
import org.springframework.kafka.annotation.EnableKafkaStreams;
39-
import org.springframework.kafka.annotation.KafkaStreamsDefaultConfiguration;
40-
import org.springframework.kafka.config.KafkaStreamsConfiguration;
4136
import org.springframework.kafka.config.StreamsBuilderFactoryBeanConfigurer;
4237
import org.springframework.kafka.core.KafkaTemplate;
4338
import org.springframework.kafka.core.ProducerFactory;
4439
import org.springframework.kafka.listener.DeadLetterPublishingRecoverer;
4540
import org.springframework.kafka.streams.RecoveringDeserializationExceptionHandler;
4641
import org.springframework.kafka.support.serializer.JsonSerde;
42+
import org.springframework.util.Assert;
4743

4844
@Configuration(proxyBeanMethods = false)
4945
@EnableKafkaStreams
@@ -58,32 +54,23 @@ class KafkaStreamsConfig {
5854
}
5955

6056
@Bean
61-
StreamsBuilderFactoryBeanConfigurer configurer() {
57+
StreamsBuilderFactoryBeanConfigurer configurer(
58+
DeadLetterPublishingRecoverer deadLetterPublishingRecoverer) {
6259
return factoryBean -> {
6360
factoryBean.setStateListener(
6461
(newState, oldState) ->
6562
log.info("State transition from {} to {} ", oldState, newState));
63+
Properties streamsConfiguration = factoryBean.getStreamsConfiguration();
64+
Assert.notNull(streamsConfiguration, "streamsConfiguration must not be null");
65+
streamsConfiguration.put(
66+
StreamsConfig.DEFAULT_DESERIALIZATION_EXCEPTION_HANDLER_CLASS_CONFIG,
67+
RecoveringDeserializationExceptionHandler.class);
68+
streamsConfiguration.put(
69+
RecoveringDeserializationExceptionHandler.KSTREAM_DESERIALIZATION_RECOVERER,
70+
deadLetterPublishingRecoverer);
6671
};
6772
}
6873

69-
@Bean(KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_CONFIG_BEAN_NAME)
70-
KafkaStreamsConfiguration defaultKafkaStreamsConfig(
71-
KafkaConnectionDetails connectionDetails,
72-
KafkaProperties kafkaProperties,
73-
DeadLetterPublishingRecoverer deadLetterPublishingRecoverer) {
74-
Map<String, Object> properties = kafkaProperties.buildStreamsProperties(null);
75-
properties.put(
76-
ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
77-
connectionDetails.getStreamsBootstrapServers());
78-
properties.put(
79-
StreamsConfig.DEFAULT_DESERIALIZATION_EXCEPTION_HANDLER_CLASS_CONFIG,
80-
RecoveringDeserializationExceptionHandler.class);
81-
properties.put(
82-
RecoveringDeserializationExceptionHandler.KSTREAM_DESERIALIZATION_RECOVERER,
83-
deadLetterPublishingRecoverer);
84-
return new KafkaStreamsConfiguration(properties);
85-
}
86-
8774
@Bean
8875
DeadLetterPublishingRecoverer deadLetterPublishingRecoverer(
8976
ProducerFactory<byte[], byte[]> producerFactory) {

order-service/src/test/java/com/example/orderservice/TestOrderServiceApplication.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@ Licensed under MIT License Copyright (c) 2023-2024 Raja Kolli.
1010
import com.example.orderservice.common.PostGreSQLContainer;
1111
import com.example.orderservice.utils.AppConstants;
1212
import org.springframework.boot.SpringApplication;
13-
import org.springframework.boot.testcontainers.context.ImportTestcontainers;
1413

15-
@ImportTestcontainers(PostGreSQLContainer.class)
1614
public class TestOrderServiceApplication {
1715

1816
public static void main(String[] args) {
1917
SpringApplication.from(OrderServiceApplication::main)
20-
.with(ContainersConfig.class)
18+
.with(ContainersConfig.class, PostGreSQLContainer.class)
2119
.withAdditionalProfiles(AppConstants.PROFILE_LOCAL)
2220
.run(args);
2321
}

order-service/src/test/java/com/example/orderservice/common/AbstractIntegrationTest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ Licensed under MIT License Copyright (c) 2021-2023 Raja Kolli.
1515
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
1616
import org.springframework.boot.test.context.SpringBootTest;
1717
import org.springframework.boot.test.context.TestConfiguration;
18-
import org.springframework.boot.testcontainers.context.ImportTestcontainers;
1918
import org.springframework.context.annotation.Bean;
2019
import org.springframework.test.context.ActiveProfiles;
2120
import org.springframework.test.web.servlet.MockMvc;
@@ -24,8 +23,7 @@ Licensed under MIT License Copyright (c) 2021-2023 Raja Kolli.
2423
@SpringBootTest(
2524
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
2625
properties = {"spring.cloud.config.enabled=false"},
27-
classes = ContainersConfig.class)
28-
@ImportTestcontainers(PostGreSQLContainer.class)
26+
classes = {ContainersConfig.class, PostGreSQLContainer.class})
2927
@AutoConfigureMockMvc
3028
@AutoConfigureObservability
3129
public abstract class AbstractIntegrationTest extends ContainerInitializer {

order-service/src/test/java/com/example/orderservice/common/PostGreSQLContainer.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@ Licensed under MIT License Copyright (c) 2023 Raja Kolli.
66

77
package com.example.orderservice.common;
88

9-
import java.util.Collections;
9+
import org.springframework.boot.test.context.TestConfiguration;
1010
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
11+
import org.springframework.context.annotation.Bean;
1112
import org.testcontainers.containers.PostgreSQLContainer;
1213
import org.testcontainers.utility.DockerImageName;
1314

14-
public interface PostGreSQLContainer {
15+
@TestConfiguration(proxyBeanMethods = false)
16+
public class PostGreSQLContainer {
1517

1618
@ServiceConnection
17-
PostgreSQLContainer<?> postgreSQLContainer =
18-
new PostgreSQLContainer<>(DockerImageName.parse("postgres").withTag("17-alpine"))
19-
.withReuse(true)
20-
.withTmpFs(Collections.singletonMap("/var/lib/postgresql/data", "rw"));
19+
@Bean
20+
PostgreSQLContainer<?> postgreSQLContainer() {
21+
return new PostgreSQLContainer<>(DockerImageName.parse("postgres").withTag("17-alpine"))
22+
.withReuse(true);
23+
}
2124
}

order-service/src/test/java/com/example/orderservice/repositories/OrderRepositoryTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,17 @@ Licensed under MIT License Copyright (c) 2023-2024 Raja Kolli.
1717
import org.junit.jupiter.api.BeforeEach;
1818
import org.junit.jupiter.api.Test;
1919
import org.springframework.beans.factory.annotation.Autowired;
20-
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
2120
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
22-
import org.springframework.boot.testcontainers.context.ImportTestcontainers;
21+
import org.springframework.context.annotation.Import;
2322
import org.springframework.data.domain.Page;
2423
import org.springframework.data.domain.PageRequest;
2524
import org.springframework.data.domain.Pageable;
2625
import org.springframework.data.domain.Sort;
2726
import org.springframework.test.context.ActiveProfiles;
2827

2928
@ActiveProfiles({PROFILE_TEST})
30-
@ImportTestcontainers(PostGreSQLContainer.class)
29+
@Import(PostGreSQLContainer.class)
3130
@DataJpaTest(properties = {"spring.jpa.hibernate.ddl-auto=validate"})
32-
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
3331
class OrderRepositoryTest {
3432

3533
@Autowired private OrderRepository orderRepository;

0 commit comments

Comments
 (0)