Spring Integration - Kafka Outbound Adapter确认问题

时间:2017-07-10 18:02:12

标签: apache-kafka spring-integration activemq

在我发布我的问题之前,我要感谢Gary和Artem帮助我解决我的问题和bcoz,我能够成功地将消息从JMS发布到Kafka并进行交易。

现在,我正面临另一个问题,并测试当我的卡夫卡失败时会发生什么。 当kafka在最初的几次重试时关闭时,kafka outbound adapter会抛出异常并将消息返回给JMS并一次又一次地重试。

然而,经过几次重试后,即使kafka关闭,消息也会从JMS中出队,我得到以下异常:

2017-07-10 23:27:51.117 ERROR 16116 --- [enerContainer-1] o.s.k.support.LoggingProducerListener    : Exception thrown when sending a message with key='null' and payload='Test JPMC' to topic test:

org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.

我的集成xml是:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jms="http://www.springframework.org/schema/integration/jms"
    xmlns:integration="http://www.springframework.org/schema/integration"
    xmlns:int-kafka="http://www.springframework.org/schema/integration/kafka"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/integration/jms 
    http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
    http://www.springframework.org/schema/integration/kafka 
    http://www.springframework.org/schema/integration/kafka/spring-integration-kafka.xsd">

    <jms:message-driven-channel-adapter
        id="helloJMSAdapater" container="requestListenerContainer" 
        channel="helloChannel" extract-payload="true" error-channel="errorChannel"/>


    <integration:recipient-list-router
        input-channel="errorChannel">
        <integration:recipient channel="errorOutputChannel" />
        <integration:recipient channel="rethrowChannel" />
    </integration:recipient-list-router>

    <jms:outbound-channel-adapter id="errorQueueChannelAdapter"
        channel="errorOutputChannel" destination="errorQueue" connection-factory="jmsConnectionfactory"
        delivery-persistent="true" explicit-qos-enabled="true" />


    <int-kafka:outbound-channel-adapter
        id="kafkaOutboundChannelAdapter" kafka-template="kafkaTemplate"
        auto-startup="true" sync="true" channel="inputToKafka" topic="test">
    </int-kafka:outbound-channel-adapter>


</beans>

我不想承认JMS消息,除非它们已成功发布到kafka。

是否因为kafka正在设置一些默认参数?

我的kafka配置如下:

@Configuration
@Component
public class KafkaConfig {

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");//this.brokerAddress);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        // set more properties
        return new DefaultKafkaProducerFactory<>(props);
    }
}

1 个答案:

答案 0 :(得分:0)

这不是卡夫卡的问题。如果您说您的消息是“从JMS中出队”,请确保队列中的重新传递策略配置为无限。

例如,ActiveMQ故事在这里:http://activemq.apache.org/redelivery-policy.html

  

maximumRedeliveries 6设置消息在被视为中毒药丸之前重新交付的最大次数,并返回给经纪人,以便它可以转到死信队列。   设置为-1表示无限次重新发送。