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_Apache Kafka Streams - Fatal编程技术网

Scala 如何在卡夫卡流中使用未来

Scala 如何在卡夫卡流中使用未来,scala,apache-kafka,apache-kafka-streams,Scala,Apache Kafka,Apache Kafka Streams,在Scala中使用org.apache.kafka.streams.KafkaStreams库时,我一直在尝试读取inputStream,将该信息传递给一个方法:validateAll(infoToValidate),该方法返回一个未来,解析该未来,然后发送到一个输出流 例如: builder.stream[String, Object](REQUEST_TOPIC) .mapValues(v => ValidateFormat.from(v.asInstanceOf[Gene

在Scala中使用
org.apache.kafka.streams.KafkaStreams
库时,我一直在尝试读取inputStream,将该信息传递给一个方法:
validateAll(infoToValidate)
,该方法返回一个未来,解析该未来,然后发送到一个输出流

例如:

builder.stream[String, Object](REQUEST_TOPIC)
      .mapValues(v => ValidateFormat.from(v.asInstanceOf[GenericRecord]))
      .mapValues(infoToValidate => {
        SuccessFailFormat.to(validateAll(infoToValidate))
      })

是否有执行此操作的文档?我已经研究了filter()和transform(),但仍然不确定如何处理KStreams中的未来

答案取决于您是否需要保留消息的原始顺序。如果是,那么您将不得不以某种方式阻止。例如:

val duration = 10 seconds // whatever your timeout should be or Duration.Inf
sourceStream
  .mapValues(x => Await.result(validate(x), duration))
  .to(outputTopic)
但是,如果订单不重要,您可以简单地使用卡夫卡制作人:

sourceStream
  .mapValues(x => validate(x)) // now you have KStream[.., Future[...]]
  .foreach { future =>
    future.foreach { item =>
      val record = new ProducerRecord(outputTopic, key, item)
      producer.send(record) // provided you have the implicit serializer
    }
  }

答案取决于您是否需要保留消息的原始顺序。如果是,那么您将不得不以某种方式阻止。例如:

val duration = 10 seconds // whatever your timeout should be or Duration.Inf
sourceStream
  .mapValues(x => Await.result(validate(x), duration))
  .to(outputTopic)
但是,如果订单不重要,您可以简单地使用卡夫卡制作人:

sourceStream
  .mapValues(x => validate(x)) // now you have KStream[.., Future[...]]
  .foreach { future =>
    future.foreach { item =>
      val record = new ProducerRecord(outputTopic, key, item)
      producer.send(record) // provided you have the implicit serializer
    }
  }

为什么不
.get()
未来?@cricket\u 007你不能
.get()
scala的未来。您必须在其上执行映射或等待,因为我不是专家,但KStreams接口似乎本质上是同步的。这可能意味着您需要在代码中跨越sync/async边界-使用
Await.result
+根据需要处理错误/超时+管理未来执行上下文的线程池。我认为这不是一个短视,而是一个设计决策——它确保消息不会被重新排序。基本上,我同意约翰的观点。顺便说一句,如果您使用模式注册表,它将自己验证消息的“格式”
ValidateFormat.from
SuccessFailFormat.to
validateAll
?为什么不
。get()
未来?@cricket\u 007您不能
在scala中获得未来。您必须在其上执行映射或等待,因为我不是专家,但KStreams接口似乎本质上是同步的。这可能意味着您需要在代码中跨越sync/async边界-使用
Await.result
+根据需要处理错误/超时+管理未来执行上下文的线程池。我认为这不是一个短视,而是一个设计决策——它确保消息不会被重新排序。基本上,我同意约翰的观点。顺便说一下,如果您使用模式注册表,它将自己验证消息的“格式”
ValidateFormat.from
SuccessFailFormat.to
validateAll
的签名是什么?