Java 使用spring cloud stream在kafka中自动提交

Java 使用spring cloud stream在kafka中自动提交,java,spring-boot,apache-kafka,spring-cloud,spring-cloud-stream,Java,Spring Boot,Apache Kafka,Spring Cloud,Spring Cloud Stream,我有一个应用程序,我想在其中手动执行卡夫卡消息中的(n)确认。根据spring云文档,应该使用autocommitofset 然而,在我的应用程序中,即使定义了这样的属性,headerKafkaHeaders.Acknowledgement仍然是空的 下面是我的配置 spring.cloud.stream.kafka.binder.brokers=${KAFKA_BROKER_LIST} spring.cloud.stream.default.contentType=application/js

我有一个应用程序,我想在其中手动执行卡夫卡消息中的(n)确认。根据spring云文档,应该使用
autocommitofset

然而,在我的应用程序中,即使定义了这样的属性,header
KafkaHeaders.Acknowledgement
仍然是空的

下面是我的配置

spring.cloud.stream.kafka.binder.brokers=${KAFKA_BROKER_LIST}
spring.cloud.stream.default.contentType=application/json
spring.cloud.stream.bindings.mytopic.destination=MyInputTopic
spring.cloud.stream.bindings.mytopic.group=myConsumerGroup
spring.cloud.stream.kafka.bindings.mytopic.consumer.autoCommitOffset=false
我的消费者:

@StreamListener("myTopic")
public void consume(@NotNull @Valid Message<MyTopic> message) {
    MyTopic payload = message.getPayload();
    Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class); // always null
}
@StreamListener(“myTopic”)
公共无效使用(@NotNull@Valid Message){
MyTopic负载=message.getPayload();
Acknowledgement Acknowledgement=message.getHeaders().get(KafkaHeaders.Acknowledgement,Acknowledgement.class);//始终为null
}
我在SpringBoot2.2.5.RELEASE和SpringCloudHoxton.SR1中使用Java13


非常感谢您的帮助。

我刚刚复制了您的属性,它对我来说很好

GenericMessage[payload=foo,标头={kafka_offset=0,kafka_consumer=org.apache.kafka.clients.consumer。KafkaConsumer@55d4844d,deliverytrunt=1,kafka_timestamp=CREATE_TIME,kafka_receivedMessageKey=null,kafka_receivedPartitionId=0,kafka_receivedTopic=MyInputTopic,kafka_receivedTimestamp=158948868691039,卡夫卡回执=消费者回执记录(topic=MyInputTopic,partition=0,leaderEpoch=0,offset=0,CreateTime=1589488691039,序列化键大小=-1,序列化值大小=3,头文件=RecordHeaders(头文件=[],isReadOnly=false),键文件=null,值=[B@572887c3),contentType=application/json,kafka_groupId=myConsumerGroup}]

@springboot应用程序
@EnableBinding(Sink.class)
公共类应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(Application.class,args);
}
@StreamListener(Sink.INPUT)
公共无效侦听(消息输入){
系统输出打印项次(输入);
}
@豆子
公共应用程序运行程序(KafkaTemplate模板){
返回参数->{
发送(“MyInputTopic”,“foo.getBytes());
};
}
}

我发现了我的消费者没有按预期工作的原因:

在我的配置中,我有一些类似于
spring.cloud.stream.bindings.mytopic.destination=MyInputTopic
,但是,流绑定是这样完成的:

@StreamListener(“Mytopic”)


显然,前缀为
spring.cloud.stream.bindings
的配置不区分大小写(因为所有配置都按预期工作),但前缀为
spring.cloud.stream.kafka.bindings的绑定是区分大小写的,这导致了我的问题。

使用Java8、Java14;Boot 2.2.7/Hoxton.SR4;Boot 2.2.5/HoxtonSR1进行了测试,一切正常。
spring.cloud.stream.default.contentType=application/json
spring.cloud.stream.bindings.input.destination=MyInputTopic
spring.cloud.stream.bindings.input.group=myConsumerGroup
spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOffset=false