async-http-client-netty

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。[color=red]也就是说如果有netty的代码,即使你声明的是grizzly的config,也只会实例化一个netty的客户端的。[/color]
[b]所以如果需要使用grizzly或者apache的,请把netty的代码去除。[/b]

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方法了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值