当kafka Producer设置为Sync时,不会调用Kafka Consumer

时间:2017-02-21 17:20:43

标签: apache-kafka spring-kafka

我有一个要求,即使用同步方法维护2个主题,使用异步方法维护其他主题。 异步按预期方式调用消费者记录,但在同步方法中,不会调用消费者代码。

以下是配置文件

中声明的代码
 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

 @Bean( name="KafkaPayloadSyncTemplate")
    public KafkaTemplate<String, KafkaPayload> KafkaPayloadSyncTemplate() {
        return new KafkaTemplate<String,KafkaPayload>(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;           
    }

消费者代码

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();       
    }
}

基于这个问题,我有两个问题

  1. 我们是否应该在Sync Producer中手动调用Listener类中的listen()。如果是的话,怎么做?
  2. 如果自动调用侦听器(@KafkaListener),我需要添加哪些其他设置/配置才能使其正常工作。
  3. 感谢提前输入

    -Srikant

1 个答案:

答案 0 :(得分:1)

您应该确保将consumerProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");用于消费者属性。

不确定您对同步/异步的含义,但生产和消费是完全可区分的操作。而且你不能影响生产者方面的消费者。因为介于两者之间的是卡夫卡经纪人。