일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- spring-batch
- Elasticsearch
- statestore
- kafkastreams
- springboot
- coursera
- 플레이 프레임워크
- kafkastream
- spring-cloud-stream
- Slick
- gradle
- Logstash
- kafka interactive query
- schema registry
- kafka streams
- Elk
- reactive
- avo
- Kafka
- enablekafkastreams
- scala 2.10
- play framework
- RabbitMQ
- Spring
- aws
- 한빛미디어
- spring-kafka
- 카프카
- scala
- confluent
- Today
- Total
b
spring-kafka의 KafkaListener 본문
KafkaListener annotation
토픽의 메시지를 소비할 메소드에 붙이는 어노테이션이다. 이 어노테이션을 붙인다면, KafkaListenerContainerFactory에 의해서 MessageListenerContainer가 기동된다. 현재로서는 ConcurrentKafkaListenerContainerFactory 클래스만 존재 하니까, 기본적으로 KafkaListener을 붙인다는 것은 ConcurrentMessageListenerContainer 리스너 컨테이너를 사용한다는 의미이다.
그리고 @ConditionalOnClass(EnableKafka.class) 에 의해서 KafkaAnnotationDrivenConfiguration 설정 클래스가 로드 되는대, 여기서 "kafkaListenerContainerFactory" 이라는 bean을 가지는ConcurrentKafkaListenerContainerFactory 가 생성이 된다. (즉 spring-kafka만 디펜던시에 추가된다면, 이 클래스가 발생된다)
@KafkaListener 에 'containerFactory'를 지정 할 수 없지만, 기본적으로 위에서 언급한 'kafkaListenerContainerFactory' 이름을 가지는 컨테이너 팩토리를 사용한다. 이 메소드의 인자로는 @Payload, @Header, @Headers, MessageHeaders등등을 사용하여 메시지를 수신할 수 있다.
메소드에 정의된다면 각 메소드별로 '리스너컨테이너'가 만들어진다. - (컨테이너 팩토리가 아니다!) 만약 1개의 컨테이너 팩토리에서 2개의 @KafkaListener을 사용한다면 각각의 beanName은 org.springframework.kafka.KafkaListenerEndpointContainer#1, #2 이다. 만약 동일한 팩토리와 topic을 쓴다면 setConcurrency=2 의 효과만 가질 것이다.
클래스에 정의된다면 하나의 메시지 컨테이너가! @KafkaHandler가 있는 모든 메소드에 적용한다. 모두 실행 한다는 의미가 아닌, payload타입에 따라 적절하게 메소드를 실행해준다는 뜻이다. @KafkaHandler가 붙은 메소드는 InvocableHandlerMethod 클래스에 감싸지고, DelegatingInvocableHandler 에 List 형으로 들어가서 DelegatingInvocableHandler.findHandlerForPayload 의해서 실행되어 진다. payload 매칭이 2개 이상이 된다면 'Ambiguous methods...' throw를 발생시킨다.