【问题标题】:How to verify sprng kafka producer has successfully sent message or not?如何验证 sprng kafka producer 是否成功发送消息?
【发布时间】:2020-03-17 15:56:15
【问题描述】:

我正在尝试测试 spring kafka(2.2.5.RELEASE),当生产者使用 kafkatemplate 发送消息时,我想知道该消息是否发送成功。基于此,我想更新该消息 ID 的数据库记录。处理这种情况的最佳做法是什么?

这里是检查成功或失败的示例代码

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

【问题讨论】:

    标签: spring-boot spring-kafka


    【解决方案1】:

    send() 操作返回一个异步完成的ListenableFuture&lt;&gt;

    如果要阻塞调用线程获取结果,使用

    future.get(timeout, TimeUnit.MILLISECONDS);
    

    【讨论】:

    • 我要注意,'ack' 属性应该设置为 '1' 或 'all' 值。如果 'ack' 为 0,则无法保证消息已送达。如果我错了,请纠正我加里
    • 谢谢加里。感谢您的快速反馈。
    • @MaximPopov 我想你的意思是acks - 是的,但它默认为 1,如果你想禁用它,你必须明确地将它设置为 0。 all 是最安全的(但更贵)。
    • @GaryRussell - 当 listenableFuture 调用 onFailure() 方法时如何获得延迟消息?我想知道哪条消息失败了,以便我可以根据消息 id 更新数据库中的正确记录。
    • 您还可以将 Producer max.block.ms 配置从默认的 60000 减少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2013-07-22
    • 2019-02-14
    • 2013-08-19
    相关资源
    最近更新 更多