2016-03-05 94 views
1

我是Scala的Akka Streams的學習者。當我在IncomingConnection閱讀時,我發現Flow#join。然後,我在Flow#join的評論中找到了下面的圖片。什麼是Flow#加入Akka Streams

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

但是,我想知道它的結構是什麼。我認爲「加入」會形成一個循環。

所以我想請你解釋什麼結構「加盟」使,用Flow#join

回答

3

該文檔的狀態告訴我簡單的示例代碼:

加入這種流動到另一個流程,通過交叉連接輸入和輸出,創造了RunnableGraph

這裏是從一個很好的例子,可以幫助解釋爲什麼這是有用的:

/** 
    * 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() 

正如你可能知道的阿卡HTTP流量總是從HttpRequest流向HttpResponse一個handler,但你可以看到從HttpResponseIncomingConnection.flow流至HttpRequest。換言之,用戶有責任從請求中創建響應,Akka Http負責發送該響應併產生另一個請求。當它涉及另一個Flow時,確實會形成一個閉環,因此join方法會創建一個RunnableGraph

要了解連接的處理方式,您應該多學習一些關於BidiFlow的信息。 BidiFlow#join的結果是另一個流程,因爲BidiFlow有兩個輸入和兩個輸出。這裏有一個帶有例子的link to an excellent explanation

+0

非常感謝您的回覆!你的回答對我很有幫助,因爲我想更多地瞭解'IncommingConnection.handlerWith'。我沒有注意到'IncommingConnection.flow'的類型是Flow [HttpResponse,HttpRequest]:我誤解它是Flow [HttpRequest,HttpResponse]。 我去了鏈接,閱讀並發現了關於Akka Streams的新發現。我學到了更多,謝謝。我試圖運行示例日誌記錄代碼。但不幸的是,它不起作用。它可以無誤地編譯,但沒有輸出。我嘗試了很多我知道的方式,但我做不到。 – redstone

+0

沒問題。也許你可以問另一個問題,說明爲什麼你編譯的日誌記錄示例看起來不起作用。如果你能接受我的答案,同時我會很感激。 –

相關問題