Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
卡夫卡制作人:如何处理;java.net.ConnectException:连接被拒绝;_Java_Scala_Apache Kafka_Kafka Producer Api - Fatal编程技术网

卡夫卡制作人:如何处理;java.net.ConnectException:连接被拒绝;

卡夫卡制作人:如何处理;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

我使用卡夫卡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)
但是上面的回调无法处理
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之前超时