kagamihogeの日記

kagamihogeの日記です。

JEP 321: HTTP Client (Standard)をテキトーに訳した

http://openjdk.java.net/jeps/321 を読んだ。

JEP 321: HTTP Client (Standard)

Owner    Chris Hegarty
Created 2017/06/08 11:46
Updated 2018/01/31 16:29
Type    Feature
Status  Candidate
Component   core-libs/java.net
Scope   SE
Discussion  net dash dev at openjdk dot java dot net
Effort  M
Duration    M
Priority    2
Reviewed by Alan Bateman, Brian Goetz
Endorsed by Brian Goetz
Issue   8181784

Summary

JDK 9とJDK 10のupdatedで導入されたincubatedのHTTP Client APIを標準化します。これはJEP 110由来のものです。

Goals

JEP 110のGoalsに加え、このJEPでは以下を行います。

  • incubated APIに寄せられたフォードバックの取り込み
  • incubated APIをベースにjava.net.httpパッケージで標準APIを提供
  • incubated APIの削除

Motivation

このJEPのMotivationはJEP 110のMotivationから変更はありません。

Description

このJEPの提案内容は、JDK 9とJDK 10のupdatedでincubating APIとして導入されたHTTP Clientの標準化です。このincubating APIには重要な改善に繋がった多数のフィードバックが寄せられましたが、大筋はそのままです。このAPIにはノンブロッキングリクエストとCompletableFuturesに基づくレスポンスセマンティクスが含まれ、依存アクションをトリガするチェーン処理ができます。リクエストとレスポンスボディのBack-pressureとflow-controlはjava.util.concurrent.Flow APIreactive-streamsを介して提供されます。

JDK 9とJDK 10ではincubatingなので、その実装をほぼ完全に書き直します。現在の実装は完全に非同期です(以前のHTTP/1.1実装はブロッキング)。RX Flowの概念を実装にプッシュダウンしており、HTTP/2をサポートするのに必要だった元々の概念の多くを削除しました。データフローのトレース、ユーザレベルのリクエストパブリッシャとレスポンスサブスクライバから基底のソケットまで、が簡単になります。これらにより、各種の概念とコードの複雑さを大きく削減し、HTTP/1.1とHTTP/2の再利用の可能性(possibility of reuse)を最大化しました。

提案した標準のモジュール名はjava.net.httpで、標準パッケージ名はjava.net.httpです。

APIの詳細についてはJEP 110を参照してください。

Testing

incubated APIに対する既存のテストを修正して新しい標準APIで使えるようにする必要があります。すべてのシナリオをカバーするテストを追加する必要があり、特にHTTP/1.1とHTTP/2間のアップグレード・ダウングレードが挙げられます。

Risks and Assumptions

incubated HTTP Client APIに依存するコードは、パッケージインポートを少々、修正の必要があります。その他のincubatedの機能に差異はありません。incubatingモジュールに依存するコードは既にコンパイル・実行時に適切な警告を出しています。