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