什么异常会传播到Kafka API中的客户端应用程序代码

时间:2019-02-06 12:54:21

标签: java apache-kafka kafka-consumer-api kafka-producer-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将在内部重试连接,但是我想在应用程序代码中收到有关此类尝试的通知。类似地,除了元数据超时,我在消费者代码中看不到任何此类异常。

如何实现此目标并获得有关任何连接中断,副本数量不足等的通知?我应该在这里捕获并处理其他哪些异常情况?

谢谢, 阿比

1 个答案:

答案 0 :(得分:1)

首先,切勿throw e抓住它。

代替检查if (e instanceof ExceptionClass)


这些都已列出in the JavaDoc

此处重新格式化以供阅读。

不可恢复的异常(致命,永远不会发送消息):

  • InvalidTopicException
  • OffsetMetadataTooLargeException
  • RecordBatchTooLargeException
  • RecordTooLargeException
  • UnknownServerException

可恢复的异常(瞬态,可以通过增加#.retries来覆盖):

  • CorruptRecordException
  • InvalidMetadataException
  • NotEnoughReplicasAfterAppendException
  • NotEnoughReplicasException
  • OffsetOutOfRangeException
  • TimeoutException
  • UnknownTopicOrPartitionException