Spring boot 如何验证sprng卡夫卡制作人是否已成功发送消息?
我正在尝试测试SpringKafka(2.2.5.RELEASE),当生产者使用kafkatemplate发送消息时,我想知道消息是否成功发送。基于此,我想更新该消息id的db记录。处理此场景的最佳实践是什么 下面是检查成功或失败的示例代码Spring boot 如何验证sprng卡夫卡制作人是否已成功发送消息?,spring-boot,spring-kafka,Spring Boot,Spring Kafka,我正在尝试测试SpringKafka(2.2.5.RELEASE),当生产者使用kafkatemplate发送消息时,我想知道消息是否成功发送。基于此,我想更新该消息id的db记录。处理此场景的最佳实践是什么 下面是检查成功或失败的示例代码 ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send("test_topic", key, userMsg); SendResult&
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send("test_topic", key, userMsg);
SendResult<String, String> result = null;
try {
result = future.get(10000, TimeUnit.MILLISECONDS);
LOGGER.info("Send Result : {}", result);
LOGGER.info("Saving entry in db");
messageRepo.save(result.getProducerRecord().key().toString(),result.getProducerRecord().value().toString());
} catch (Exception e) {
LOGGER.error("Error publishing message ", e);
messageRepo.save(result.getProducerRecord().key().toString(),result.getProducerRecord().value().toString());
}
ListenableFuture=kafkaTemplate.send(“test_topic”,key,userMsg);
SendResult结果=null;
试一试{
结果=future.get(10000,时间单位为毫秒);
info(“发送结果:{}”,结果);
LOGGER.info(“在数据库中保存条目”);
messageRepo.save(result.getProducerRecord().key().toString(),result.getProducerRecord().value().toString());
}捕获(例外e){
LOGGER.error(“错误发布消息”,e);
messageRepo.save(result.getProducerRecord().key().toString(),result.getProducerRecord().value().toString());
}
send()操作返回一个异步完成的ListenableFuture
如果要阻止调用线程以获得结果,请使用
future.get(timeout, TimeUnit.MILLISECONDS);
我想指出的是,“ack”属性应该设置在“1”或“all”值中。如果“ack”为0,则无法保证消息已传递。如果我错了,请纠正我,谢谢你,加里。感谢您的快速反馈。@MaximPopov我想您的意思是
acks
-是的,但它默认为1,如果要禁用它,您必须显式地将其设置为0all
是最安全的(但更昂贵)。@GaryRussell-当listenableFuture调用onFailure()方法时,如何获取延迟消息?我想知道哪条消息失败了,这样我就可以根据消息id更新数据库中的正确记录。您还可以将Producermax.block.ms
config从默认值60000减少。