消费消息时如何正确处理错误?

时间:2016-10-03 15:54:06

标签: spring-integration apache-kafka

我正在使用spring-integration-kafka消费消息,使用message-driven-channel-adapter

<int-kafka:message-driven-channel-adapter  
    id="kafkaListener"
    listener-container="container1"
    channel="outputFromKafka"
    error-channel="errorChannel"/>

容器使用JsonDeserializer将传入的JSON反序列化为对象:

<beans:bean id="container1" class="org.springframework.kafka.listener.KafkaMessageListenerContainer">
    <beans:constructor-arg>
        <beans:bean class="org.springframework.kafka.core.DefaultKafkaConsumerFactory">
            <beans:constructor-arg>
                <beans:map>
                    <beans:entry key="bootstrap.servers" value="localhost:9092" />
                    <beans:entry key="key.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer" />
                    <beans:entry key="group.id" value="mygroup" />
                </beans:map>
            </beans:constructor-arg>
           <beans:property name="valueDeserializer">
                <beans:bean class="org.springframework.kafka.support.serializer.JsonDeserializer">
                    <beans:constructor-arg value="com.foo.MyType"/>
                </beans:bean>
            </beans:property>
        </beans:bean>
    </beans:constructor-arg>
    <beans:constructor-arg>
        <beans:bean class="org.springframework.kafka.listener.config.ContainerProperties">
            <beans:constructor-arg name="topics" value="foo" />
        </beans:bean>
    </beans:constructor-arg>
</beans:bean>

如果无法成功解析消息(例如,因为消费者意外使用了错误的类型),则会抛出异常:

ERROR org.apache.kafka.clients.NetworkClient - Uncaught error in request completion: org.apache.kafka.common.errors.SerializationException: Can't deserialize data ...

在此之后,适配器再次收到相同的消息(可能是因为最后一个没有提交?),并且以完全相同的方式失败,导致无休止的异常流。

看起来未使用配置的error-channel

有哪些选项可以处理这样的错误,以及如何在XML中配置?

1 个答案:

答案 0 :(得分:0)

  

看起来没有使用配置的错误通道。

是什么让你相信?

我刚刚运行了一个测试,错误通道设置为errorChannel(默认情况下,使用日志记录适配器)......

12:06:08.366 [container-kafka-consumer-1] ERROR o.s.i.handler.LoggingHandler - ...

您是否可以为显示失败的org.springframework.integration提供调试日志片段?

修改

哦,对不起......

ERROR org.apache.kafka.clients.NetworkClient - Uncaught error in request completion: org.apache.kafka.common.errors.SerializationException: Can't deserialize data ...

在Spring Integration收到消息之前,堆栈中的内容要低得多。