이관 받은 코드에서 reactor-kafka 버전을 1.2.5.RELEASE 버전을 쓰고 있었는데, 버전 업그레이드를 하면서 겪은 이슈는 다음과 같았다.
2023-04-10 18:17:36.601 ERROR 1 --- [ard.processor-1] r.k.r.internals.ConsumerEventLoop : Unexpected exception
java.lang.IllegalStateException: No subscriptions have been created
at reactor.kafka.receiver.ReceiverOptions.subscriber(ReceiverOptions.java:515)
at reactor.kafka.receiver.internals.ConsumerEventLoop$SubscribeEvent.run(ConsumerEventLoop.java:241)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
왜 구독하지 못하는 것일까? 궁금한 부분이었는데, 특정 부분에서 버전에 따라 토픽 정보가 설정 되고, 1.3.2 버전에서는 설정이 안된다.
final ReceiverOptions<String, V> options = ReceiverOptions.create(props);
options.subscription(Collections.singleton(topicName));
위와 같은 코드였는데, 처음에 문제의 원인은 Collections.singletonList
로 바꿔보자 였는데, 동일하게 안됐다.
Reactor의 개념이 불변이라, 설정값 또한 인스턴스가 새로 생성 되기 때문으로 보인다.
Collections.singleton
or Collections.singletonList
를 쓰는 것은 해당 이슈와 무관하다.
추측한 부분과 새로운 버전의 차이를 알고보니 원인은 이렇다.
1.2.7 이하에는 ReceiverOptions 인터페이스를 구현하는 구현체는 총 두개다.
- MutableReceiverOptions
- Configuration properties for Reactive Kafka KafkaReceiver and its underlying KafkaConsumer.
- deprecated in favor of ImmutableReceiverOptions and will be deleted in 3.x version
- ImmutableReceiverOptions
결론적으로 1.3.0 이후부터 MutableReceiverOptions 해당 구현체가 삭제 됐다.
as-is
final ReceiverOptions<String, V> options = ReceiverOptions.create(props);
options.subscription(Collections.singleton(topicName));
to-be
ReceiverOptions<String, V> receiverOptions = ReceiverOptions.create(props);
ReceiverOptions<String, V> options = receiverOptions.subscription(Collections.singleton(topicName));
options.withValueDeserializer(valueDeserializer);
이렇게 코드를 변경 해주면 정상적으로 잘 된다.
반응형
'프로그래밍 > Java' 카테고리의 다른 글
Thymeleaf 상에서 문자열 합치기 (0) | 2022.07.07 |
---|---|
JRebel 대체제인 DCEVM을 적용해보자. (3) | 2019.03.13 |
Class JavaLaunchHelper is implemented in both Error on Mac OS (0) | 2017.05.28 |
Try-with-resources를 사용하자!! (2) | 2017.05.18 |
실전 아카 - 임백준님 (0) | 2016.08.30 |