mike-neckのブログ

Java or Groovy or Swift or Golang

reactor-netty コールドリーディング(3)

HttpRequest の組み立て

  1. HttpClient#get などのメソッドから HttpClient#request メソッドを呼び出し
  2. HttpClient#request にて Mono<HttpClientResponse> を返すが、実体は MonoHttpClientResponse
  3. 2.の際に HttpClient#handler というメソッドが呼び出され、 Function<HttpClientRequest,Publisher<Void>>MonoHttpClientResponse に渡される
  4. 3.はユーザーのハンドリングにて Mono<SomeRequestBaseModel> が生成されることを予期している
  5. MonoHttpClientResponse#subscribe が呼び出されると、 Mono#defer にて Mono<NettyContext> が生成されて、 HttpClientResponse にキャストされたものが subscribe される
  6. 5.の defer の中では HttpClient#newHandler が呼び出される
  7. 6.の HttpClient#newHandlerMono<NettyContext> を返すメソッド
  8. 6.の HttpClient#newHandler に渡す HttpClientHandlerBiFunction<NettyInbound,NettyOutbound,Publisher<Void>> を実装するクラスで、ここの apply メソッドにて NettyInbound (= HttpClientOperations)をもとに リクエストを組み立てる
  9. HttpClient#newHandler は実際には TcpBridgeClient#newHandler に委譲していて、更に TcpClient#newHandler に委譲している
  10. TcpClient#newHandler では Bootstrap の取得が行われる
  11. TcpClient#newHandler の最中に呼び出される TcpClient#doHandler メソッドの戻り値 ContextHandler<SocketChannel>ChannelInitializer<SocketChannel> を継承したクラス
  12. ContextHandler<SocketChannel> は抽象クラスで実装クラスは PooledClientContextHandler(ChannelPool が利用可能な場合) または ClientContextHandler
  13. ContextHandlerinitChanneldoPipeline(Channel) を読んで各サブクラスで ハンドラーを登録したあとに ChannelOperationsHandler を登録する