什么是Flow#join in Akka Streams

时间:2016-03-05 03:45:19

标签: scala akka akka-stream

我是斯卡拉的Akka Streams的学习者。当我在IncomingConnection阅读时,我找到Flow#join。然后,我在Flow#join的评论中找到了以下图片。

+------+        +-------+
|      | ~Out~> |       |
| this |        | other |
|      | <~In~  |       |
+------+        +-------+

但是,我想知道它的结构是什么。我认为&#34;加入&#34;做一个循环。

所以我希望你解释一下结构&#34;加入&#34;制作,并使用Flow#join

告诉我简单的示例代码

1 个答案:

答案 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

要了解如何处理连接,您应该多了解RunnableGraphBidiFlow的结果是另一个流程,因为BidiFlow有两个输入和两个输出。这是一个带有示例的link to an excellent explanation