java - 哪些异常会传播到 Kafka API 中的客户端应用程序代码
问题描述
我正在使用 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 将在内部重试连接,但我想在应用程序代码中收到此类尝试的通知。同样,除了元数据超时,我在消费者代码中看不到任何此类异常。
我怎样才能做到这一点并获得有关任何连接中断、副本不足等的通知?我应该在这里捕获和处理哪些其他异常?
谢谢,阿比
解决方案
首先,永远不要throw e
抓住它。
而是检查if (e instanceof ExceptionClass)
这些都列在 JavaDoc 中
在此处重新格式化以提高可读性。
不可重试异常(致命,永远不会发送消息):
- 无效主题异常
- OffsetMetadataTooLargeException
- RecordBatchTooLargeException
- 记录太大异常
- 未知服务器异常
可重试异常(瞬态,可以通过增加#.retries 来覆盖):
- 损坏记录异常
- 无效元数据异常
- NotEnoughReplicasAfterAppendException
- NotEnoughReplicasException
- OffsetOutOfRangeException
- 超时异常
- 未知主题或分区异常
推荐阅读
- python - 多处理不运行函数
- magenta - 洋红色 MusicVAE/GrooVAE 调节
- django - 我正在尝试在 django 中创建一个登录表单,其中包含用户名和密码作为我在注册时提供的电话号码
- unix - 用单行替换多行
- javascript - MongoDB 配置文件仅设置为 admin 数据库
- reactjs - Formik FieldArray 使用打字稿处理 yup 验证模式
- android - 如何在 sendgrid 电子邮件模板中嵌入应用程序深层链接?
- mysql - 选择不包括其他字段的简单方法
- linux - 仅获取父文件夹的 git 差异
- javascript - 保存来自多个表单的值