async-http-client-netty
3871 ワード
https://github.com/AsyncHttpClient/async-http-client/tree/master/providers
最近プロジェクトの需要のため、nettyを研究して、自分でnettyを利用して非同期httpclientをパッケージしたいと思っていましたが、残念ながら設計能力は限られていました.gitでこのオープンソースの工事を発見して、研究して、設計はとても良いです.
簡単な記録:
1.主に以下の工程を含む:
async-http-client-apiこれはすべてのベースクラスインタフェースです
async-http-client-netty-provider nettyベースでカプセル化された非同期httpclient
async-http-client-grizzly-provider grizzlyベースでカプセル化された非同期httpclient
async-http-client-apache-provider apacheのhttpclientに基づいてカプセル化された非同期httpclient
2.nettyをパッケージ化する以上、async-http-client-apiとasync-http-client-netty-providerが必要です.
3.APIの使用上、プロセスを初期化するには、まずconfigクラスを構成する必要があります.nettyはNettyAsyncHttpProviderConfigに対応しています.
ベースクラスのAsyncHttpClientConfigは、NettyAsyncHttpProviderConfigによってconfigを生成します.
クライアントを初期化すると、
注意AsyncHttpClientはベースクラスで定義されています.Nettyに対応するクライアントクラスはNettyAsyncHttpProvider
AsyncHttpClientでは、次の点に注意してください.
静的変数を定義します.
AsyncHttpClientのコンストラクション関数ではこのDEFAULT_が使用されていますPROVIDERS
コードを深く掘り下げ続けると、JVMの現在のスレッドのクラス名をロードすることでロードされ、comを順次探していることがわかります.ning.http.client.providers.netty.NettyAsyncHttpProviderなどのパッケージ名は、見つかったら返されるので、コードに複数(netty,grizzlyが存在する)が存在してもnettyがロードされるだけです.
(ps:AsyncHttpProviderのコメントには次のように書かれています.
)
したがって、全体的なプロセスは、configを構成してからAsyncHttpClientがjvmにロードされたパケット名に基づいて特定のhttpclient(nettyまたはgrizzlyまたはapache)を実現することである.
なお、初期化されたconfigがnettyのconfigではなく別のタイプであれば、NettyAsyncHttpProviderで判断し、そうでなければconfigを再生成する.
つまり、nettyのコードがあれば、grizzlyのconfigを宣言しても、nettyのクライアントはインスタンス化されます.
だからgrizzlyやapacheを使う必要がある場合は、nettyのコードを除去してください.
4.nettyクライアントクラスNettyAsyncHttpProviderがSimpleChannelUpstreamHandlerを継承
非常に巧みな実装で、メインメソッドではmessageReceivedメソッドを実装することができます.
最近プロジェクトの需要のため、nettyを研究して、自分でnettyを利用して非同期httpclientをパッケージしたいと思っていましたが、残念ながら設計能力は限られていました.gitでこのオープンソースの工事を発見して、研究して、設計はとても良いです.
簡単な記録:
1.主に以下の工程を含む:
async-http-client-apiこれはすべてのベースクラスインタフェースです
async-http-client-netty-provider nettyベースでカプセル化された非同期httpclient
async-http-client-grizzly-provider grizzlyベースでカプセル化された非同期httpclient
async-http-client-apache-provider apacheのhttpclientに基づいてカプセル化された非同期httpclient
2.nettyをパッケージ化する以上、async-http-client-apiとasync-http-client-netty-providerが必要です.
3.APIの使用上、プロセスを初期化するには、まずconfigクラスを構成する必要があります.nettyはNettyAsyncHttpProviderConfigに対応しています.
ベースクラスのAsyncHttpClientConfigは、NettyAsyncHttpProviderConfigによってconfigを生成します.
クライアントを初期化すると、
if (config == null) {
return new AsyncHttpClient();
} else {
return new AsyncHttpClient(config);
}
注意AsyncHttpClientはベースクラスで定義されています.Nettyに対応するクライアントクラスはNettyAsyncHttpProvider
AsyncHttpClientでは、次の点に注意してください.
静的変数を定義します.
private static final String[] DEFAULT_PROVIDERS = {
"com.ning.http.client.providers.netty.NettyAsyncHttpProvider",
"com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider",
"com.ning.http.client.providers.apache.ApacheAsyncHttpProvider",
"com.ning.http.client.providers.jdk.JDKAsyncHttpProvider"
};
AsyncHttpClientのコンストラクション関数ではこのDEFAULT_が使用されていますPROVIDERS
public AsyncHttpClient(AsyncHttpClientConfig config) {
this(loadDefaultProvider(DEFAULT_PROVIDERS, config), config);
}
private static AsyncHttpProvider loadDefaultProvider(String[] providerClassNames,
AsyncHttpClientConfig config) {
AsyncHttpProvider provider;
for (final String className : providerClassNames) {
provider = loadProvider(className, config);
if (provider != null) {
return provider;
}
}
throw new IllegalStateException("No providers found on the classpath");
}
コードを深く掘り下げ続けると、JVMの現在のスレッドのクラス名をロードすることでロードされ、comを順次探していることがわかります.ning.http.client.providers.netty.NettyAsyncHttpProviderなどのパッケージ名は、見つかったら返されるので、コードに複数(netty,grizzlyが存在する)が存在してもnettyがロードされるだけです.
(ps:AsyncHttpProviderのコメントには次のように書かれています.
/**
* Interface to be used when implementing custom asynchronous I/O HTTP client.
* By default, the {@link com.ning.http.client.providers.netty.NettyAsyncHttpProvider} is used.
*/
)
したがって、全体的なプロセスは、configを構成してからAsyncHttpClientがjvmにロードされたパケット名に基づいて特定のhttpclient(nettyまたはgrizzlyまたはapache)を実現することである.
なお、初期化されたconfigがnettyのconfigではなく別のタイプであれば、NettyAsyncHttpProviderで判断し、そうでなければconfigを再生成する.
つまり、nettyのコードがあれば、grizzlyのconfigを宣言しても、nettyのクライアントはインスタンス化されます.
だからgrizzlyやapacheを使う必要がある場合は、nettyのコードを除去してください.
if (config.getAsyncHttpProviderConfig() != null
&& NettyAsyncHttpProviderConfig.class.isAssignableFrom(config.getAsyncHttpProviderConfig().getClass())) {
asyncHttpProviderConfig = NettyAsyncHttpProviderConfig.class.cast(config.getAsyncHttpProviderConfig());
} else {
asyncHttpProviderConfig = new NettyAsyncHttpProviderConfig();
}
4.nettyクライアントクラスNettyAsyncHttpProviderがSimpleChannelUpstreamHandlerを継承
非常に巧みな実装で、メインメソッドではmessageReceivedメソッドを実装することができます.