web-dev-qa-db-ja.com

Acknowledgement.acknowledge()が春に例外をスローします-kafka @KafkaListener

Enable.auto.commitをfalseに設定し、アノテーションベースのspring-kafka @KafkaListenerを使用して手動でオフセットをコミットしようとすると、org.springframework.kafka.listener.ListenerExecutionFailedException:リスナーメソッドを呼び出すことができませんでした着信メッセージ

私は次のような非常に単純なコードを持っています:

@KafkaListener(id = "someid", topics = "${demo.topic}", containerFactory = "someContainerFactory")
public void listenFooGroup(String message, Acknowledgement ack) {
    System.out.println("Received Messasge in group 'foo': " + message);

    // TODO: Do something with the message
}

また、プロデューサーからメッセージを送信すると、次の例外が発生します。

org.springframework.kafka.listener.ListenerExecutionFailedException:着信メッセージでリスナーメソッドを呼び出すことができませんでした。

エンドポイントハンドラの詳細:

メソッド[publicvoidcom。****。*****。*******。KafkaMessageListener.listenFooGroup(Java.lang.String、org.springframework.kafka.support.Acknowledgment)]

Bean [com。****。*****。*******。KafkaMessageListener @ 5856dbe4];ネストされた例外はorg.springframework.messaging.converter.MessageConversionExceptionです:メッセージを処理できません。ネストされた例外はorg.springframework.messaging.converter.MessageConversionExceptionです:GenericMessage [payload = test、headers = {kafka_offset = 57、kafka_receivedMessageKey]の[Java.lang.String]から[org.springframework.kafka.support.Acknowledgment]に変換できません= null、kafka_receivedPartitionId = 0、kafka_receivedTopic = demotopic}]、failedMessage = GenericMessage [payload = test、headers = {kafka_offset = 57、kafka_receivedMessageKey = null、kafka_receivedPartitionId = 0、kafka_receivedTopic = demotopic}]

助けてください。 TIA。

6
Aravind Kv

containerPropertiesオブジェクトを取得するには、コンテナファクトリのMANUALackModeをAcknowledgmentまたはMANUAL_IMMEDIATEに設定する必要があります。

他のackモードでは、コンテナはオフセットをコミットする責任があります。

factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE)

または、Spring Bootを使用している場合は、....ackModeプロパティを設定します

12
Gary Russell