Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Scala 卡夫卡制作人在回调时阻塞_Scala_Apache Kafka_Kafka Producer Api - Fatal编程技术网

Scala 卡夫卡制作人在回调时阻塞

Scala 卡夫卡制作人在回调时阻塞,scala,apache-kafka,kafka-producer-api,Scala,Apache Kafka,Kafka Producer Api,我正在测试kafka producer中的asyncsend()。 我要连接到的群集处于脱机状态。 我的假设是,我会快速发送10000个个人请求(listToSend的长度)。 接下来超时(60秒)将开始,60秒后,我会看到回调用logger击中我。错误(s“未能发送记录${x.\u 2}”,e) 然而,该方法似乎要花很长时间才能完成 这就是为什么我添加了logger.debug(“测试:我正在发送数据”)行 它打印出来,然后在60秒内什么也没发生。我看到第一条记录的回调失败。只有到那时,它才会

我正在测试kafka producer中的asyncsend()。 我要连接到的群集处于脱机状态。 我的假设是,我会快速发送10000个个人请求(listToSend的长度)。 接下来超时(60秒)将开始,60秒后,我会看到回调用
logger击中我。错误(s“未能发送记录${x.\u 2}”,e)
然而,该方法似乎要花很长时间才能完成

这就是为什么我添加了
logger.debug(“测试:我正在发送数据”)

它打印出来,然后在60秒内什么也没发生。我看到第一条记录的回调失败。只有到那时,它才会继续前进

这是正常的行为还是我遗漏了一些基本的东西

listToSend.foreach { x =>
        logger.debug("test: am I sending data")
        // note: I added this 'val future =' in an attempt to fix this, to no avail
        val future = producer.send(new ProducerRecord[String, String](topic, x._2), new Callback {
          override def onCompletion(metadata: RecordMetadata, e: Exception) {

            if (e != null) {
              //todo: handle failed sends, timeouts, ...
              logger.error(s"failed to send record ${x._2}", e)
            }
            else { //nice to have: implement logic here, or call another method to process metadata
              logger.debug("~Callback success~")
            }
          }
        }
        )
      }

注意:我不想阻止这段代码,我想让它保持异步。然而,不管怎样,它似乎在send()上阻塞了。

我从未完全理解过并行性

然而,似乎我的主题名(我将其命名为“[projectname here]\u connection”)是问题所在

尽管我不知道在主题名中有任何保留关键字,但突然出现了这种行为

一些进一步的实验还发现,带有尾随空格的主题名也会导致这种行为。制作人将尝试将其发送到此主题,但卡夫卡集群似乎不知道如何处理它,导致这些超时


因此,对于所有遇到此问题的人,请在进行故障排除之前检查/更改主题名称。

您需要了解未来,这不是阻碍吗?为了解决这个问题,我添加了“val future=”,它原来不在
producer.send
返回
未来[RecordMetadata]
(或类似的内容)。您可以调用
val meta=future.get()
来实际执行阻塞,以及
producer.close
但我不想阻塞,这就是问题所在。它现在阻塞了,但我只想快速“清除”我的记录,让逻辑处理任何类型的故障/停机时间/…然后您需要在producer配置中将acks设置为零,而不是使用回调或分配未来