Scala 您将如何更改此Akka Streams示例以获得物化值Future[ServerBinding]?

Scala 您将如何更改此Akka Streams示例以获得物化值Future[ServerBinding]?,scala,akka,akka-stream,Scala,Akka,Akka Stream,第二个例子如下。我添加了主机和端口的定义 val host = "localhost" val port = 4444 val connections: Source[IncomingConnection, Future[ServerBinding]] = Tcp().bind(host, port) connections runForeach { (connection: IncomingConnection) => println(s"New con

第二个例子如下。我添加了
主机
端口
的定义

  val host = "localhost"
  val port = 4444
  val connections: Source[IncomingConnection, Future[ServerBinding]] =
    Tcp().bind(host, port)

  connections runForeach { (connection: IncomingConnection) =>
    println(s"New connection from: ${connection.remoteAddress}")

    val echo = Flow[ByteString]
      .via(Framing.delimiter(
        ByteString("\n"),
        maximumFrameLength = 256,
        allowTruncation = true))
      .map(_.utf8String)
      .map(_ + "!!!\n")
      .map(ByteString(_))

    connection.handleWith(echo)
  }

您将如何更改该示例,以便还可以掌握
未来的[ServerBinding]
,以便记录成功的绑定并处理绑定错误,例如,端口已在使用中?

您应该能够通过远离
runForeach
的便利性来实现这一点,它隐藏了所涉及的
Sink
的详细信息,而使用显式
Sink
。大概是这样的:

  val host = "localhost"
  val port = 4444
  val connections: Source[IncomingConnection, Future[ServerBinding]] =
    Tcp().bind(host, port)


  val sink = Sink.foreach[IncomingConnection]{ connection =>
    println(s"New connection from: ${connection.remoteAddress}")

    val echo = Flow[ByteString]
      .via(Framing.delimiter(
        ByteString("\n"),
        maximumFrameLength = 256,
        allowTruncation = true))
      .map(_.utf8String)
      .map(_ + "!!!\n")
      .map(ByteString(_))

    connection.handleWith(echo)    
  }

  val serverBinding:Future[ServerBinding] = connections.to(sink).run