Spring boot Spring云流:标题kafka_确认值为空

Spring boot Spring云流:标题kafka_确认值为空,spring-boot,spring-integration,spring-cloud-stream,spring-kafka,Spring Boot,Spring Integration,Spring Cloud Stream,Spring Kafka,我正试图根据应用程序中消息的处理状态控制kafka主题上的偏移提交。若消息成功,则可以提交偏移量。为此,我尝试在我的方法if中获取标题,以便可以手动确认消息 spring: cloud: stream: default: contentType: application/json default-binder: binder1-kafka bindings: myChannel: binde

我正试图根据应用程序中消息的处理状态控制kafka主题上的偏移提交。若消息成功,则可以提交偏移量。为此,我尝试在我的方法if中获取标题,以便可以手动确认消息

  spring:
   cloud:
    stream:
      default:
        contentType: application/json
      default-binder: binder1-kafka
      bindings:
        myChannel:
          binder: binder1-kafka
          destination: my_topic
          content-type: text/plain
          consumer:
            autoCommitOffset: false

        outChannel:
          binder: binder2-kafka
          destination: my_topic
          content-type: text/plain
          consumer:
            autoCommitOffset: false    


      binders:
        #Connection config to different clusters
        binder1-kafka:
          type: kafka
          defaultCandidate: true
          environment:
            spring:
              cloud:
                stream:
                  kafka:
                    binder:
                      brokers: some-url1:9092
        binder2-kafka:
          type: kafka
          defaultCandidate: false
          environment:
            spring:
              cloud:
                stream:
                  kafka:
                    binder:
                      brokers: some-url2:9092 
但是当使用侦听器作为

@StreamListener(target = IBrokerChannel.myChannel )
public void handlePayload(@Payload MyPayload payload, @Headers Map<String, Object> headers) {
  Acknowledgment acknowledgment= (Acknowledgment) headers.get("kafka_acknowledgment"); // acknowledgment object is always null.
  acknowledgment.acknowledge();
}
@StreamListener(target=IBrokerChannel.myChannel)
public void handlePayload(@Payload MyPayload Payload,@Headers Map Headers){
Acknowledgement=(Acknowledgement)headers.get(“kafka_Acknowledgement”);//Acknowledgement对象始终为空。
确认。确认();
}

确认
始终为
null
。我正在使用kafka producer cli向主题发送消息
spring boot
版本为
1.5.10。发布版

您的配置属性定义中缺少
kafka
分支。一定是这样的:

spring:
   cloud:
    stream:
      default-binder: kafka
      kafka:
         bindings:
           myChannel:
             consumer:
               autoCommitOffset: false 

您的配置属性定义中缺少
kafka
分支。一定是这样的:

spring:
   cloud:
    stream:
      default-binder: kafka
      kafka:
         bindings:
           myChannel:
             consumer:
               autoCommitOffset: false 
对我来说很好

@SpringBootApplication
@EnableBinding(Sink.class)
public class So51159949Application {

    public static void main(String[] args) {
        SpringApplication.run(So51159949Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(KafkaTemplate<byte[], byte[]> template) {
        return args -> {
            template.send("so51159949", "foo".getBytes());
        };
    }

    @StreamListener(Sink.INPUT)
    public void in(String in, @Headers MessageHeaders headers) {
        System.out.println(in);
        System.out.println(headers);
        Acknowledgment ack = headers.get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
        ack.acknowledge();
    }

}

对我来说很好

@SpringBootApplication
@EnableBinding(Sink.class)
public class So51159949Application {

    public static void main(String[] args) {
        SpringApplication.run(So51159949Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(KafkaTemplate<byte[], byte[]> template) {
        return args -> {
            template.send("so51159949", "foo".getBytes());
        };
    }

    @StreamListener(Sink.INPUT)
    public void in(String in, @Headers MessageHeaders headers) {
        System.out.println(in);
        System.out.println(headers);
        Acknowledgment ack = headers.get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
        ack.acknowledge();
    }

}



应用它。现在侦听器没有接收到消息:(.在我的应用程序中,我也有多个集群的绑定器。我只向您展示了如何修复这个特殊的
autocommitofset
属性-其余的一切都必须保持不变。尽管您可能需要重新检查文档,看看您的所有属性是否都在正确的分支中。我刚刚测试了它,没有任何问题-请参阅我的答案。@Artem:我编辑了我应用程序中的配置详细信息。您仍然缺少
autocommitofset
属性的
Kafka
分支…应用了它。现在侦听器没有接收到消息:(.在我的应用程序中,我也有多个集群的绑定器。我只向您展示了如何修复这个特殊的
autocommitofset
属性-其余的一切都必须保持不变。尽管您可能需要重新检查文档,看看您的所有属性是否都在正确的分支中。我刚刚测试了它,没有任何问题-请参阅我的答案。@Artem:我编辑了我应用程序中的配置详细信息。你仍然缺少
autocommitofset
属性的
Kafka
分支…我编辑了这个问题。我使用了你建议的配置,仍然不走运。再看看这个问题。正如Artem所说,你仍然缺少
autoC路径中的
Kafka:
ommitOffset
property。这是一个卡夫卡特定的设置,而不是一般的消费者设置。我在eclipse中作为一个未知属性获取此设置。请您帮助不要在注释中提出新问题。提出一个显示代码和配置的新问题。我编辑了该问题。我放置了您建议的配置,仍然没有运气。请再次查看该任务ion。正如Artem所说,在
autocommitofset
属性的路径中,您仍然缺少
kafka:
。这是一个特定于kafka的设置,而不是一般的使用者设置。我在eclipse中将其作为未知属性获取。请您帮忙不要在注释中提出新问题。提出一个显示代码和配置的新问题。有任何解决方案吗“这件事怎么办?”Pradeep KrKaushal@beginner_coder.是的,看答案。这个问题有什么解决办法吗?@Pradeep KrKaushal@beginner_coder.是的,看答案。