我是斯卡拉的Akka Streams的学习者。当我在IncomingConnection
阅读时,我找到Flow#join
。然后,我在Flow#join
的评论中找到了以下图片。
+------+ +-------+
| | ~Out~> | |
| this | | other |
| | <~In~ | |
+------+ +-------+
但是,我想知道它的结构是什么。我认为&#34;加入&#34;做一个循环。
所以我希望你解释一下结构&#34;加入&#34;制作,并使用Flow#join
答案 0 :(得分:4)
文档声明:
通过交叉连接输入和输出将此Flow加入另一个Flow,创建 RunnableGraph
以下是来自akka.http.scaladsl
的一个很好的例子,可以帮助解释为什么这很有用:
/**
* Represents one accepted incoming HTTP connection.
*/
final case class IncomingConnection(
localAddress: InetSocketAddress,
remoteAddress: InetSocketAddress,
flow: Flow[HttpResponse, HttpRequest, NotUsed]) {
/**
* Handles the connection with the given flow, which is materialized exactly once
* and the respective materialization result returned.
*/
def handleWith[Mat](handler: Flow[HttpRequest, HttpResponse, Mat])(implicit fm: Materializer): Mat =
flow.joinMat(handler)(Keep.right).run()
您可能知道Akka http流的handler
始终从HttpRequest
流向HttpResponse
,但正如您可以看到来自IncomingConnection.flow
的{{1}}流量到HttpResponse
。换句话说,用户有责任根据请求创建响应,并且Akka Http有责任发送该响应并生成另一个请求。当它涉及另一个Flow时确实会产生一个闭环,因此HttpRequest
方法会创建一个join
。
要了解如何处理连接,您应该多了解RunnableGraph
。 BidiFlow
的结果是另一个流程,因为BidiFlow有两个输入和两个输出。这是一个带有示例的link to an excellent explanation。