卡夫卡制作人:如何处理;java.net.ConnectException:连接被拒绝;
我使用卡夫卡0.10.1.0 这是我的制作人:卡夫卡制作人:如何处理;java.net.ConnectException:连接被拒绝;,java,scala,apache-kafka,kafka-producer-api,Java,Scala,Apache Kafka,Kafka Producer Api,我使用卡夫卡0.10.1.0 这是我的制作人: val props: Properties = ... val producer = new KafkaProducer[String, AnyRef](props) val callback = new Callback { override def onCompletion(md: RecordMetadata, e: Exception): Unit = ... } producer.send(new ProducerRecord[St
val props: Properties = ...
val producer = new KafkaProducer[String, AnyRef](props)
val callback = new Callback {
override def onCompletion(md: RecordMetadata, e: Exception): Unit = ...
}
producer.send(new ProducerRecord[String, AnyRef]("topic", "hello"), callback)
但是上面的回调无法处理java.net.ConnectException:连接被拒绝
,以防kafka服务器关闭
UPD
ConnectionException
在另一个线程中引发(进入Sender
类,该类用于KafkaProducer
)。因此,我们不能使用try{}catch
来实现它。另外,我不需要重试机制,我需要一种处理这种情况的方法(例如,如果Kafka关闭,并且生产者无法发送消息,那么我将使用另一个队列API)
是否有处理此异常的方法?您有几个选项。Scala提供了一种捕获异常的方法,其形式如下:
try {
// ...
}
catch {
case ioe: IOException => ... // more specific cases first !
case e: Exception => ...
}
因此,最简单的方法是:
try {
producer.send(new ProducerRecord[String, AnyRef]("topic", "hello"), callback)
}
catch {
case ce: ConnectionException => // handle exception
}
更复杂但更健壮的是重试机制:
还请注意,卡夫卡制作者内置了重试机制,
这也可能有帮助:
设置大于零的值将
使客户端重新发送其发送失败的任何记录
潜在的瞬时误差。请注意,此重试与
如果客户端在收到错误后重新发送记录。允许
重试,但不将max.in.flight.requests.per.connection设置为1
将可能更改记录的顺序,因为如果
发送到单个分区,第一个分区失败并重试,但
第二个成功,则第二批中的记录可能会出现
首先
你有几个选择。Scala提供了一种捕获异常的方法,其形式如下:
try {
// ...
}
catch {
case ioe: IOException => ... // more specific cases first !
case e: Exception => ...
}
因此,最简单的方法是:
try {
producer.send(new ProducerRecord[String, AnyRef]("topic", "hello"), callback)
}
catch {
case ce: ConnectionException => // handle exception
}
更复杂但更健壮的是重试机制:
还请注意,卡夫卡制作者内置了重试机制,
这也可能有帮助:
设置大于零的值将
使客户端重新发送其发送失败的任何记录
潜在的瞬时误差。请注意,此重试与
如果客户端在收到错误后重新发送记录。允许
重试,但不将max.in.flight.requests.per.connection设置为1
将可能更改记录的顺序,因为如果
发送到单个分区,第一个分区失败并重试,但
第二个成功,则第二批中的记录可能会出现
首先
你好@crypto,谢谢你的回答。但是这种方法不起作用,因为
ConnectionException
是在另一个线程中引发的(进入Sender
类,该类用于KafkaProducer
)。因此,我们不能对其使用try{}catch
。是的,这是一个单独的线程,在producer.send
方法中创建。因此,在调用回调之前会引发异常?当异常引发时,不会调用回调。此异常仅出现在日志中。我们不能抓住它,我不能重现错误。metadata.fetch.timeout.ms=60000发生在我获取ConnectionException之前。我尝试了无效的主机:端口组合,元数据提取在我看到任何ConnectionExceptionHi@crypto之前超时,谢谢您的回答。但是这种方法不起作用,因为ConnectionException
是在另一个线程中引发的(进入Sender
类,该类用于KafkaProducer
)。因此,我们不能对其使用try{}catch
。是的,这是一个单独的线程,在producer.send
方法中创建。因此,在调用回调之前会引发异常?当异常引发时,不会调用回调。此异常仅出现在日志中。我们不能抓住它,我不能重现错误。metadata.fetch.timeout.ms=60000发生在我获取ConnectionException之前。我尝试了无效的主机:端口组合,元数据提取在我看到任何ConnectionException之前超时