Spring Integration Kafka手册确认

时间:2015-09-16 14:13:00

标签: spring-integration apache-kafka

我在使用KafkaTopicOffsetManager手动确认时遇到问题。调用acknowledge()时,主题开始反复发送垃圾邮件。 Kafka将log.cleaner.enable设置为true,主题使用cleanup.policy = compact。谢谢你的帮助。

配置:

Woocommerce -> Settings -> Products -> Display

监听器:

@Bean
public ZookeeperConfiguration zookeeperConfiguration() {
    ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(kafkaConfig.getZookeeperAddress());
    zookeeperConfiguration.setClientId("clientId");
    return zookeeperConfiguration;
}

@Bean
public ConnectionFactory connectionFactory() {
    return new DefaultConnectionFactory(zookeeperConfiguration());
}

@Bean
public TestMessageHandler messageListener() {
    return new TestMessageHandler();
}

@Bean
public OffsetManager offsetManager() {
    ZookeeperConnect zookeeperConnect = new ZookeeperConnect(kafkaConfig.getZookeeperAddress());
    OffsetManager offsetManager = new KafkaTopicOffsetManager(zookeeperConnect, kafkaConfig.getTopic() + "_OFFSET");

    return offsetManager;
}

@Bean
public KafkaMessageListenerContainer kafkaMessageListenerContainer() {
    KafkaMessageListenerContainer kafkaMessageListenerContainer = new KafkaMessageListenerContainer(connectionFactory(), kafkaConfig.getTopic());
    kafkaMessageListenerContainer.setMessageListener(messageListener());
    kafkaMessageListenerContainer.setOffsetManager(offsetManager());
    return kafkaMessageListenerContainer;
}

2 个答案:

答案 0 :(得分:1)

KafkaTopicOffsetManager需要自己的主题来维护正在使用的实际主题的偏移量。

答案 1 :(得分:1)

如果您不想自己解决消息有效负载(在我看来很痛苦),请从抽象类AbstractDecodingAcknowledgingMessageListener扩展监听器,并提供org.springframework.integration.kafka.serializer.common.StringDecoder作为解码器。

public class TestMessageHandlerDecoding extends AbstractDecodingAcknowledgingMessageListener {

public TestMessageHandlerDecoding(Decoder keyDecoder, Decoder payloadDecoder) {
    super(keyDecoder, payloadDecoder);
}

@Override
public void doOnMessage(Object key, Object payload, KafkaMessageMetadata metadata, Acknowledgment acknowledgment) {
    LOGGER.info("payload={}",payload);

}