BAEL-6953 implemented (#15304)
* BAEL-6953 implemented * BAEL-6953 added live test * Fixed test
This commit is contained in:
		
							parent
							
								
									671957da9b
								
							
						
					
					
						commit
						1f7efeddaf
					
				
							
								
								
									
										
											BIN
										
									
								
								gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										1
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								pom.xml
									
									
									
									
									
								
							| @ -867,6 +867,7 @@ | |||||||
|                 <module>spring-jersey</module> |                 <module>spring-jersey</module> | ||||||
|                 <module>spring-jinq</module> |                 <module>spring-jinq</module> | ||||||
|                 <module>spring-kafka-2</module> |                 <module>spring-kafka-2</module> | ||||||
|  |                 <module>spring-kafka-3</module> | ||||||
|                 <module>spring-kafka</module> |                 <module>spring-kafka</module> | ||||||
|                 <module>spring-katharsis</module> |                 <module>spring-katharsis</module> | ||||||
|                 <module>spring-mobile</module> |                 <module>spring-mobile</module> | ||||||
|  | |||||||
							
								
								
									
										36
									
								
								spring-kafka-3/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								spring-kafka-3/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  |          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|  |     <parent> | ||||||
|  |         <groupId>com.baeldung</groupId> | ||||||
|  |         <artifactId>parent-boot-2</artifactId> | ||||||
|  |         <version>0.0.1-SNAPSHOT</version> | ||||||
|  |         <relativePath>../parent-boot-2</relativePath> | ||||||
|  |     </parent> | ||||||
|  | 
 | ||||||
|  |     <modelVersion>4.0.0</modelVersion> | ||||||
|  | 
 | ||||||
|  |     <artifactId>spring-kafka-3</artifactId> | ||||||
|  |     <packaging>jar</packaging> | ||||||
|  | 
 | ||||||
|  |     <name>spring-kafka-3</name> | ||||||
|  | 
 | ||||||
|  |     <dependencies> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.springframework.kafka</groupId> | ||||||
|  |             <artifactId>spring-kafka</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.fasterxml.jackson.core</groupId> | ||||||
|  |             <artifactId>jackson-databind</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.springframework.kafka</groupId> | ||||||
|  |             <artifactId>spring-kafka-test</artifactId> | ||||||
|  |             <scope>test</scope> | ||||||
|  |         </dependency> | ||||||
|  |     </dependencies> | ||||||
|  | 
 | ||||||
|  |     <properties> | ||||||
|  |         <kafka-version>3.0.12</kafka-version> | ||||||
|  |     </properties> | ||||||
|  | </project> | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | package com.baeldung.spring.kafka; | ||||||
|  | 
 | ||||||
|  | import java.time.Instant; | ||||||
|  | 
 | ||||||
|  | public class SomeData { | ||||||
|  | 
 | ||||||
|  |     private String id; | ||||||
|  |     private String type; | ||||||
|  |     private String status; | ||||||
|  |     private Instant timestamp; | ||||||
|  | 
 | ||||||
|  |     public SomeData() { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public SomeData(String id, String type, String status, Instant timestamp) { | ||||||
|  |         this.id = id; | ||||||
|  |         this.type = type; | ||||||
|  |         this.status = status; | ||||||
|  |         this.timestamp = timestamp; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getId() { | ||||||
|  |         return id; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getType() { | ||||||
|  |         return type; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getStatus() { | ||||||
|  |         return status; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Instant getTimestamp() { | ||||||
|  |         return timestamp; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,42 @@ | |||||||
|  | package com.baeldung.spring.kafka; | ||||||
|  | 
 | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | import org.apache.kafka.clients.consumer.ConsumerConfig; | ||||||
|  | import org.apache.kafka.common.serialization.StringDeserializer; | ||||||
|  | import org.springframework.context.annotation.Bean; | ||||||
|  | import org.springframework.context.annotation.Configuration; | ||||||
|  | import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; | ||||||
|  | import org.springframework.kafka.core.ConsumerFactory; | ||||||
|  | import org.springframework.kafka.core.DefaultKafkaConsumerFactory; | ||||||
|  | import org.springframework.kafka.support.serializer.JsonDeserializer; | ||||||
|  | 
 | ||||||
|  | @Configuration | ||||||
|  | public class ListenerConfiguration { | ||||||
|  | 
 | ||||||
|  |     @Bean("messageListenerContainer") | ||||||
|  |     public ConcurrentKafkaListenerContainerFactory<String, SomeData> messageListenerContainer() { | ||||||
|  |         ConcurrentKafkaListenerContainerFactory<String, SomeData> container = new ConcurrentKafkaListenerContainerFactory<>(); | ||||||
|  |         container.setConsumerFactory(someDataConsumerFactory()); | ||||||
|  |         return container; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public ConsumerFactory<String, SomeData> someDataConsumerFactory() { | ||||||
|  |         JsonDeserializer<SomeData> payloadJsonDeserializer = new JsonDeserializer<>(); | ||||||
|  |         payloadJsonDeserializer.trustedPackages("com.baeldung.spring.kafka"); | ||||||
|  |         return new DefaultKafkaConsumerFactory<>( | ||||||
|  |           consumerConfigs(), | ||||||
|  |           new StringDeserializer(), | ||||||
|  |           payloadJsonDeserializer | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public Map<String, Object> consumerConfigs() { | ||||||
|  |         return Map.of( | ||||||
|  |           ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "PLAINTEXT://localhost:9092", | ||||||
|  |           ConsumerConfig.GROUP_ID_CONFIG, "some-group-id" | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | package com.baeldung.spring.kafka; | ||||||
|  | 
 | ||||||
|  | import org.apache.kafka.clients.producer.ProducerConfig; | ||||||
|  | import org.springframework.context.annotation.Bean; | ||||||
|  | import org.springframework.context.annotation.Configuration; | ||||||
|  | import org.springframework.kafka.core.DefaultKafkaProducerFactory; | ||||||
|  | import org.springframework.kafka.core.KafkaTemplate; | ||||||
|  | import org.springframework.kafka.core.ProducerFactory; | ||||||
|  | import org.springframework.kafka.support.serializer.JsonSerializer; | ||||||
|  | import org.springframework.kafka.support.serializer.StringOrBytesSerializer; | ||||||
|  | 
 | ||||||
|  | import java.time.Instant; | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | @Configuration | ||||||
|  | public class ProducerConfiguration { | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public KafkaTemplate<Object, SomeData> kafkaTemplate() { | ||||||
|  |         return new KafkaTemplate<>(producerFactory()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public ProducerFactory<Object, SomeData> producerFactory() { | ||||||
|  |         JsonSerializer<SomeData> jsonSerializer = new JsonSerializer<>(); | ||||||
|  |         jsonSerializer.setAddTypeInfo(true); | ||||||
|  |         return new DefaultKafkaProducerFactory<>( | ||||||
|  |           producerFactoryConfig(), | ||||||
|  |           new StringOrBytesSerializer(), | ||||||
|  |           jsonSerializer | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public Map<String, Object> producerFactoryConfig() { | ||||||
|  |         return Map.of( | ||||||
|  |           ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "PLAINTEXT://localhost:9092" | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,57 @@ | |||||||
|  | package com.baeldung.spring.kafka; | ||||||
|  | 
 | ||||||
|  | import java.time.Instant; | ||||||
|  | import java.util.concurrent.CountDownLatch; | ||||||
|  | import java.util.concurrent.TimeUnit; | ||||||
|  | 
 | ||||||
|  | import org.apache.kafka.clients.producer.ProducerRecord; | ||||||
|  | import org.junit.jupiter.api.Assertions; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.mockito.Mockito; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.boot.test.mock.mockito.SpyBean; | ||||||
|  | import org.springframework.kafka.annotation.KafkaListener; | ||||||
|  | import org.springframework.kafka.core.KafkaTemplate; | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * This test requires a running instance of kafka to be present | ||||||
|  |  */ | ||||||
|  | @SpringBootTest | ||||||
|  | public class TrustedPackagesLiveTest { | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     private KafkaTemplate<Object, SomeData> kafkaTemplate; | ||||||
|  | 
 | ||||||
|  |     @SpyBean | ||||||
|  |     TestConsumer testConsumer; | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenMessageInTheTopic_whenTypeInfoPackageIsTrusted_thenMessageIsSuccessfullyConsumed() throws InterruptedException { | ||||||
|  |         CountDownLatch latch = new CountDownLatch(1); | ||||||
|  | 
 | ||||||
|  |         Mockito.doAnswer(invocationOnMock -> { | ||||||
|  |             try { | ||||||
|  |                 latch.countDown(); | ||||||
|  |                 return invocationOnMock.callRealMethod(); | ||||||
|  |             } catch (Exception e) { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |         }).when(testConsumer).onMessage(Mockito.any()); | ||||||
|  | 
 | ||||||
|  |         SomeData someData = new SomeData("1", "active", "sent", Instant.now()); | ||||||
|  |         kafkaTemplate.send(new ProducerRecord<>("sourceTopic", null, someData)); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertTrue(latch.await(20L, TimeUnit.SECONDS)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Component | ||||||
|  |     static class TestConsumer { | ||||||
|  | 
 | ||||||
|  |         @KafkaListener(topics = "sourceTopic", containerFactory = "messageListenerContainer") | ||||||
|  |         public void onMessage(SomeData someData) { | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user