Kafka制作人:如何处理" java.net.ConnectException:连接被拒绝"

时间:2016-11-29 13:04:20

标签: java scala apache-kafka kafka-producer-api

我使用Kafka 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[String, AnyRef]("topic", "hello"), callback)

但是,如果kafka-server关闭,上面的回调无法处理java.net.ConnectException: Connection refused

UPD

ConnectionException在另一个线程中引发(进入Sender类,用于KafkaProducer)。因此,我们无法使用try {} catch。此外,我不需要重试机制,我需要一种方法来处理这种情况(例如,如果Kafka关闭,生产者无法发送消息,那么我将使用另一个Queue API)

有没有办法处理这个例外?

1 个答案:

答案 0 :(得分:0)

您有几个选择。 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
   }

更复杂但更强大的是重试机制:

What's the Scala way to implement a retry-able call like this one?

另请注意,Kafka Producer内置了重试机制, 这也可能有用:

  

设置大于零的值将   导致客户端重新发送任何发送失败的记录   潜在的瞬态错误。请注意,此重试与此无异   如果客户在收到错误后重新发送记录。允许   重试而不将max.in.flight.requests.per.connection设置为1   可能会改变记录的顺序,因为如果有两个批次   被发送到一个分区,第一个失败并重试但是   第二个成功,然后第二批中的记录可能会出现   第一