yamlエラーからSpring bootのBeanを浅く勉強しました。
下記は遡りながら、勉強していたStackTraceみたいな記録です・・・。
Spring boot3でkafkaの特定サービスのConsumerが認識されず、困りました。(^_^;)
WARN o.apache.kafka.clients.NetworkClient - [Producer clientId=producer-1]
Error while fetching metadata with correlation id 1 :
{test-test-succ-event=UNKNOWN_TOPIC_OR_PARTITION}
-> こういうエラーメッセージがいっぱい出ておりましたがtopicは生成済みの状態で。
(つまり、Publishまでは問題なし)
私が書いていたkafkaの設定です
spring:
kafka:
bootstrap-servers: kafka:9092
consumer:
group-id: order-consumer-group
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
ack-mode: record
missing-topics-fatal: false
...
これと下記のlistenerです。
@KafkaListener(topics = "test-test-succ-evetnt")
public void handleTestSuccess(String message) { ... }
...
ここで、問題はなんだと思いますか?
結論から言うと問題はDeserializerの設定を間違えていたことでした。
なぜかというとSpring Bootが自動でStringDeserializerを使うはずだったのに、
私が
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
というコードを入れてしまったので、Springが自動設定→手動設定に切り替えるんだ〜と認識してJsonDeserializerのBean登録を無効化してしまったから、私が書いた@KafkaListenerのPayLoadタイプ(Jsonでした)が失敗し、リスナーのコンテナーは実行されるが、メッセージがマッチングできず、callback自体ができませんでした。
もし、私がしたように、手動設定を入れたい場合には少し面倒ですが、直接Beanの設定クラスなどを登録する必要があります。(@Configurationなど・・)
つまり、Spring Bootについてよく知らなかったが原因でした(^_^)ということで、面白い〜と思いました![]()
*結論*
DI : @Bean
YAML: 設定値渡し