我有一个要求,即使用同步方法维护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();
}
}
基于这个问题,我有两个问题
@KafkaListener
),我需要添加哪些其他设置/配置才能使其正常工作。感谢提前输入
-Srikant
答案 0 :(得分:1)
您应该确保将consumerProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
用于消费者属性。
不确定您对同步/异步的含义,但生产和消费是完全可区分的操作。而且你不能影响生产者方面的消费者。因为介于两者之间的是卡夫卡经纪人。