我使用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)
有没有办法处理这个例外?
答案 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 可能会改变记录的顺序,因为如果有两个批次 被发送到一个分区,第一个失败并重试但是 第二个成功,然后第二批中的记录可能会出现 第一