首页 > 解决方案 > 为什么它不能识别 asScala 方法?

问题描述

我有以下代码,无法编译:

import akka.NotUsed
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
import akka.pattern.FutureRef
import akka.stream.scaladsl._
import akka.stream.typed.scaladsl.ActorMaterializer
import org.apache.kafka.clients.admin._
import scala.jdk.FutureConverters._


import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration

object KafkaDetectorActor {

  val create: Behavior[NotUsed] = Behaviors.setup { context =>
    implicit val system = context.system
    implicit val materializer = ActorMaterializer()
    implicit val dispatcher = context.system.dispatchers


    Behaviors.same
  }

  private def health(server: String)(implicit executor: ExecutionContext): Future[Boolean] = {
    val props = new Properties
    props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, server)
    props.put(AdminClientConfig.CONNECTIONS_MAX_IDLE_MS_CONFIG, "10000")
    props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, "5000")

        AdminClient
          .create(props)
          .listTopics()
          .names()
          .asScala

  }

哪里names返回KafkaFuture[java.util.Set[String]]

它不识别asScala方法。库scala.jdk.FutureConverters._已导入。我究竟做错了什么?

标签: scalaakkascala-java-interop

解决方案


scala.jdk.FutureConverters 操作所以CompletableFuture先尝试转换 KafkaFuture成这样CompletableFuture

  implicit class KafkaFutureToCompletableFuture[T](kafkaFuture: KafkaFuture[T]) {
    def toCompletableFuture: CompletableFuture[T] = {
      val wrappingFuture = new CompletableFuture[T]
      kafkaFuture.whenComplete((value, throwable) => {
        if (throwable != null) {
          wrappingFuture.completeExceptionally(throwable)
        }
        else {
          wrappingFuture.complete(value)
        }
      })
      wrappingFuture
    }
  }

现在我们可以调用toCompletableFuture.asScala. 例如,

import scala.jdk.FutureConverters._
KafkaFuture.completedFuture(42).toCompletableFuture.asScala.foreach(println)

输出42。在你的情况下,试试

AdminClient
  .create(props)
  .listTopics()
  .names()
  .toCompletableFuture
  .asScala

推荐阅读