該文檔的狀態告訴我簡單的示例代碼:
加入這種流動到另一個流程,通過交叉連接輸入和輸出,創造了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
,但你可以看到從HttpResponse
的IncomingConnection.flow
流至HttpRequest
。換言之,用戶有責任從請求中創建響應,Akka Http負責發送該響應併產生另一個請求。當它涉及另一個Flow時,確實會形成一個閉環,因此join
方法會創建一個RunnableGraph
。
要了解連接的處理方式,您應該多學習一些關於BidiFlow
的信息。 BidiFlow#join
的結果是另一個流程,因爲BidiFlow有兩個輸入和兩個輸出。這裏有一個帶有例子的link to an excellent explanation。
非常感謝您的回覆!你的回答對我很有幫助,因爲我想更多地瞭解'IncommingConnection.handlerWith'。我沒有注意到'IncommingConnection.flow'的類型是Flow [HttpResponse,HttpRequest]:我誤解它是Flow [HttpRequest,HttpResponse]。 我去了鏈接,閱讀並發現了關於Akka Streams的新發現。我學到了更多,謝謝。我試圖運行示例日誌記錄代碼。但不幸的是,它不起作用。它可以無誤地編譯,但沒有輸出。我嘗試了很多我知道的方式,但我做不到。 – redstone
沒問題。也許你可以問另一個問題,說明爲什麼你編譯的日誌記錄示例看起來不起作用。如果你能接受我的答案,同時我會很感激。 –