我正在使用Kafka Java API v2.1。我想知道什么样的异常将从底层API传播到客户端应用程序代码
这是我为发送呼叫生成的回调代码:
@Override
public void onCompletion(RecordMetadata metadata, Exception e) {
if (e == null) {
if (LOG.isLoggable(Level.FINEST)) {
LOG.finest("Sent message " + mySentRecord
+ " with offset " + metadata.offset()
+ " on topic:partition "
+ metadata.topic() + ":" + metadata.partition());
}
}
else {
try {
throw e;
}
catch (NotEnoughReplicasAfterAppendException |
NotEnoughReplicasException |
TimeoutException exception )
{
StringWriter outError = new StringWriter();
e.printStackTrace(new PrintWriter(outError));
LOG.warning(outError.toString());
}
catch (Exception exception) {
throw new ApplicationDeath(exception);
}
}
}
在这里,我捕获了NotEnoughReplicasAfterAppendException,NotEnoughReplicasException和TimeoutException,但是在ISR中杀死代理时,除了超时异常之外,我什么也看不到。我看不到任何断开连接异常或副本异常不足。
我知道Kafka API将在内部重试连接,但是我想在应用程序代码中收到有关此类尝试的通知。类似地,除了元数据超时,我在消费者代码中看不到任何此类异常。
如何实现此目标并获得有关任何连接中断,副本数量不足等的通知?我应该在这里捕获并处理其他哪些异常情况?
谢谢, 阿比
答案 0 :(得分:1)
首先,切勿throw e
抓住它。
代替检查if (e instanceof ExceptionClass)
这些都已列出in the JavaDoc
此处重新格式化以供阅读。