我们正尝试使用以下代码实现Spring DSL Kafka的手动提交。我们找不到任何参考。
我们可以将消费者属性添加为“Auto.commit”为“False”,但我们想在成功处理消息后提交消息。有人可以帮忙吗?
@Bean
IntegrationFlow consumer() {
KafkaHighLevelConsumerMessageSourceSpec messageSourceSpec = Kafka
.inboundChannelAdapter(new ZookeeperConnect(this.kafkaConfig.getZookeeperAddress()))
.consumerProperties(
props -> props.put("zookeeper.session.timeout.ms", "500").put("zookeeper.sync.time.ms", "250").
put("key.deserializer", "org.apache.kafka.common.serialization.ByteArrayDeserializer").
put("value.deserializer", "org.apache.kafka.common.serialization.ByteArrayDeserializer").
put("auto.offset.reset", "smallest").
put("auto.commit.interval.ms", "100")
)
.addConsumer(this.kafkaConfig.getConsumerGroup(),
metadata -> metadata.consumerTimeout(100)
.topicStreamMap(m -> m.put(this.kafkaConfig.getTopicRead(), 1)).maxMessages(1));
Consumer<SourcePollingChannelAdapterSpec> endpointConfigurer = e -> e.poller(p -> p.fixedDelay(100));
return IntegrationFlows.from(messageSourceSpec, endpointConfigurer)
.<Map<String, List<byte[]>>> handle((payload, headers) -> {
payload.entrySet().forEach(e -> processMessage((ConcurrentHashMap<Integer, List<byte[]>>) e.getValue()));
return null;
}).get();
}
版本:
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-java-dsl</artifactId>
<version>1.1.0.RELEASE</version>
</dependency>
答案 0 :(得分:0)
参见GH问题https://github.com/spring-projects/spring-kafka/issues/69。
解决方案听起来像是:
仔细观察我会说你必须手动提交补偿:
ConsumerConnector
...
/**
* Commit the offsets of all broker partitions connected by this connector.
*/
public void commitOffsets();
public void commitOffsets(boolean retryOnFailure);
这是Consumer
所基于的Kafka KafkaHighLevelConsumerMessageSource
桥梁。
您可以通过KafkaConsumerContext
bean访问该文件。不幸的是,它注册了一些生成的名称,如org.springframework.integration.kafka.support.KafkaConsumerContext#0
,但是如果你只有一个这样的Kafka Consumer(KafkaHighLevelConsumerMessageSourceSpec messageSourceSpec
),你可以按类型获得该bean(或只是@Autowired
它)。
之后你可以这样:
kafkaConsumerContext.getConsumerConfiguration(this.kafkaConfig.getConsumerGroup())
.getConsumerConnector()
.commitOffsets();