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を生成します.
クライアントを初期化すると、
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メソッドを実装することができます.