Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何验证sprng卡夫卡制作人是否已成功发送消息?_Spring Boot_Spring Kafka - Fatal编程技术网

Spring boot 如何验证sprng卡夫卡制作人是否已成功发送消息?

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&

我正在尝试测试SpringKafka(2.2.5.RELEASE),当生产者使用kafkatemplate发送消息时,我想知道消息是否成功发送。基于此,我想更新该消息id的db记录。处理此场景的最佳实践是什么

下面是检查成功或失败的示例代码

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,如果要禁用它,您必须显式地将其设置为0
all
是最安全的(但更昂贵)。@GaryRussell-当listenableFuture调用onFailure()方法时,如何获取延迟消息?我想知道哪条消息失败了,这样我就可以根据消息id更新数据库中的正确记录。您还可以将Producer
max.block.ms
config从默认值60000减少。