我在我的应用程序中使用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块。当发生其他一些错误时,它可以正常工作。 任何想法如何处理这个? 谢谢。
答案 0 :(得分:2)
您的send
方法会返回ListenableFuture<SendResult>
。
如果你想在发送失败的情况下在发送线程上获得异常,你可以等待这个未来完成(通过调用它上面的get()
)并检查结果。
如果没有希望发送线程等待,则callback
非常有用。它让你有机会让其他线程稍后获取结果。