Apache kafka 当Kafka生产者设置为同步时,未调用Kafka使用者

Apache kafka 当Kafka生产者设置为同步时,未调用Kafka使用者,apache-kafka,spring-kafka,Apache Kafka,Spring Kafka,我有一个需求,其中有两个主题需要维护:一个使用同步方法,另一个使用异步方法。 异步方法在调用使用者记录时按预期工作,但是在同步方法中,不会调用使用者代码 下面是配置文件中声明的代码 props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9093"); props.put(ProducerConfig.RETRIES_CONFIG, 3); props.put(ProducerConfig.BATCH_SIZE_CONFI

我有一个需求,其中有两个主题需要维护:一个使用同步方法,另一个使用异步方法。 异步方法在调用使用者记录时按预期工作,但是在同步方法中,不会调用使用者代码

下面是配置文件中声明的代码

 props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9093");
 props.put(ProducerConfig.RETRIES_CONFIG, 3);
 props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
 props.put(ProducerConfig.ACKS_CONFIG, "all");
 props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
 props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
我在这里启用了autoFlush true

 @Bean( name="KafkaPayloadSyncTemplate")
    public KafkaTemplate<String, KafkaPayload> KafkaPayloadSyncTemplate() {
        return new KafkaTemplate<String,KafkaPayload>(producerFactory(),true);
 }
@Bean(name=“KafkaPayloadSyncTemplate”)
公共KafkaTemplate KafkPaylodSyncTemplate(){
返回新的KafkaTemplate(producerFactory(),true);
}
返回recordMetadataResults对象后,控件停止对使用者进行任何调用

  private List<RecordMetadata> sendPayloadToKafkaTopicInSync() throws   InterruptedException, ExecutionException {      
        final List<RecordMetadata> recordMetadataResults = new ArrayList<RecordMetadata>();
        KafkaPayload kafkaPayload = constructKafkaPayload();
        ListenableFuture<SendResult<String,KafkaPayload>> 
future = KafkaPayloadSyncTemplate.send(TestTopic, kafkaPayload);
        SendResult<String, KafkaPayload> results;
        results = future.get();
        recordMetadataResults.add(results.getRecordMetadata());     
        return recordMetadataResults;           
    }
private List sendPayloadToKafkaTopicInSync()引发InterruptedException,ExecutionException{
最终列表recordMetadataResults=new ArrayList();
KafkaPayload KafkaPayload=构造KafkaPayload();
可听未来
future=KafkaPayloadSyncTemplate.send(TestTopic,kafkaPayload);
发送结果;
结果=future.get();
添加(results.getRecordMetadata());
返回recordMetadataResults;
}
消费者代码

public class KafkaTestListener {    
    @Autowired
    TestServiceImpl TestServiceImpl;    
    public final CountDownLatch countDownLatch = new CountDownLatch(1); 
    @KafkaListener(id="POC", topics = "TestTopic", group = "TestGroup")
    public void listen(ConsumerRecord<String,KafkaPayload> record, Acknowledgment acknowledgment) {
        countDownLatch.countDown();     
        TestServiceImpl.consumeKafkaMessage(record);        
        System.out.println("Acknowledgment : " + acknowledgment);
        acknowledgment.acknowledge();       
    }
}
公共类KafkaTestListener{
@自动连线
TestServiceImpl TestServiceImpl;
公共最终倒计时锁存器倒计时锁存器=新倒计时锁存器(1);
@KafkaListener(id=“POC”,topics=“TestTopic”,group=“TestGroup”)
公共无效侦听(消费者记录记录、确认){
countdownlock.countDown();
TestServiceImpl.ConsumerKafka消息(记录);
System.out.println(“确认:+确认”);
确认。确认();
}
}
基于这个问题,我有两个问题

  • 当Listener类是同步生产者时,我们是否应该在其内部手动调用Listener()。如果是,怎么做
  • 如果侦听器(
    @KafkaListener
    )被自动调用,我需要添加哪些其他设置/配置才能使其正常工作
  • 提前感谢您的投入


    -Srikant

    您应该确保使用
    ConsumerOps.put(ConsumerConfig.AUTO\u OFFSET\u RESET\u CONFIG,“最早”)用于消费者属性


    我不知道你说的同步/异步是什么意思,但生产和消费是完全不同的操作。你们不能从生产者的角度影响消费者。因为中间有卡夫卡经纪人。

    此属性已添加到ConsumerOps中。在我的例子中,消息没有被消费。您的意思是,无论我已声明我的生产者类型是在同步模式下还是在异步模式下工作,使用者操作都应该工作吗?同步模式:我需要ack,因此我已将设置了自动刷新的KafkaTemplate声明为true。异步模式:我调用future的回调方法。当然,如果主题的另一端有消费者,这并不重要。制作人只是向主题发送消息。在本例中,Sync/async表示等待确认消息存储在主题中的方式。这里绝对没有关于消费者的内容。不知道发生了什么事。也许你可以分享一些简单的Spring Boot应用程序,我们会看看它是否有缺陷。我不知道最初出了什么问题,但它现在起作用了,可能是其他一些依赖性问题。谢谢你的回复,现在可以了。太好了!所以,是时候接受我的答案了: