处理Kafka超时异常Java

时间:2017-09-07 08:26:51

标签: java apache-kafka spring-kafka

我在我的应用程序中使用Kafka,我想在kafka发送消息期间处理超时异常。我试着做下一个:在回调时抛出Runtime异常并在方法调用中捕获它。

这是卡夫卡电话:

public final class ManualKafkaBetsProducer implements IKafkaBetsProducer
{
    @Autowired
    private KafkaTemplate<ReportsBetKey, IReportsBet> template;

    public void send(IReportsBet bet)
    {
        template.send(MessageBuilder.withPayload(bet).setHeader(KafkaHeaders.TOPIC, kafkaBetsTopicName)
                .setHeader(KafkaHeaders.MESSAGE_KEY, new ReportsBetKey(bet)).build())
                .addCallback(res -> logger.debug("Message {} send OK"), ex -> {
                    throw new RuntimeException(ex);
                });
    }
}

这是方法调用:

try
{
    manualKafkaBetsProducer.send(bet);
}
catch (Exception ex)
{
     return TransactionResultType.GENERAL_ERROR.name();
}

问题是:当超时发生时,它不会进入catch块。当发生其他一些错误时,它可以正常工作。 任何想法如何处理这个? 谢谢。

1 个答案:

答案 0 :(得分:2)

您的send方法会返回ListenableFuture<SendResult>

如果你想在发送失败的情况下在发送线程上获得异常,你可以等待这个未来完成(通过调用它上面的get())并检查结果。

如果没有希望发送线程等待,则callback非常有用。它让你有机会让其他线程稍后获取结果。