kby*_*yrd 6 java netty asynchttpclient
我正在构建AsyncHttpClient这样的:
public AsyncHttpClient getAsyncHttpClient() {
AsyncHttpClientConfig config = new AsyncHttpClientConfig.Builder()
.setProxyServer(makeProxyServer())
.setRequestTimeoutInMs((int) Duration.create(ASYNC_HTTP_REQUEST_TIMEOUT_MIN, TimeUnit.MINUTES).toMillis())
.build();
return new AsyncHttpClient(new NettyAsyncHttpProvider(config), config);
}
Run Code Online (Sandbox Code Playgroud)
这在启动时被调用一次,然后返回值传递并在各个地方使用.makeProxyServer()是我自己的函数,让我的代理设置返回一个ProxyServer对象.我需要做的是能够更改代理服务器设置,然后重新创建AsyncHttpClient对象.但是,我不知道如何干净地关闭它.一点点搜索让我相信这close()不是优雅的.我担心每次代理设置更改时都会启动一个新的执行程序和一组线程.这不会经常发生,但我的应用程序运行时很长.
我知道我可以RequestBuilder.setProxyServer()用于每个请求,但是我希望将它设置在一个位置,以便我的asyncHttpClient实例的所有调用者都遵循系统范围的代理设置,而不需要每个开发人员都记住这样做.
什么是重新配置或拆卸和重建Netty基于什么的正确方法AsyncHttpClient?
使用的问题AsyncHttpClient.close()是它关闭了提供程序使用的线程池执行程序,然后没有重新使用客户端而无需重新构建它,因为根据文档,一旦ts关闭,执行程序实例就无法重用.所以,如果你采用这种方式,就没有办法重新构建客户端(除非你实现自己的ExecutorService,它将有另一个关闭逻辑,但它还有很长的路要走,恕我直言).
但是,通过查看实现NettyAsyncHttpProvider,我可以看到它存储对给定AsyncHttpClientConfig实例的引用并调用它getProxyServerSelector()来获取每个新NettyAsyncHttpProvider.execute(Request...)调用的代理设置(即对于每个执行的请求AsyncHttpClient).
然后,如果我们可以getProxyServerSelector()返回可配置的实例ProxyServerSelector,那就可以了.
不幸的是,它AsyncHttpClientConfig被设计成一个只读容器,由实例化AsyncHttpClientConfig.Builder.为了克服这个限制,我们必须使用"换行/委托"方法来破解它:
创建一个派生自的新类AsyncHttpClientConfig.该类应该包装给定的单独AsyncHttpClientConfig实例,并实现将AsyncHttpClientConfiggetter 委托给该实例.
为了能够在任何给定的时间点返回我们想要的代理选择器,我们在这个包装类中使这个设置变得可变,并为它公开setter.
例:
public class MyAsyncHttpClientConfig extends AsyncHttpClientConfig
{
private final AsyncHttpClientConfig config;
private ProxyServerSelector proxyServerSelector;
public MyAsyncHttpClientConfig(AsyncHttpClientConfig config)
{
this.config = config;
}
@Override
public int getMaxTotalConnections() { return config.maxTotalConnections; }
@Override
public int getMaxConnectionPerHost() { return config.maxConnectionPerHost; }
// delegate the others but getProxyServerSelector()
...
@Override
public ProxyServerSelector getProxyServerSelector()
{
return proxyServerSelector == null
? config.getProxyServerSelector()
: proxyServerSelector;
}
public void setProxyServerSelector(ProxyServerSelector proxyServerSelector)
{
this.proxyServerSelector = proxyServerSelector;
}
}
Run Code Online (Sandbox Code Playgroud)
AsyncHttpClient使用我们的新包装器包装您的配置实例并使用它来配置AsyncHttpClient:例:
MyAsyncHttpClientConfig myConfig = new MyAsyncHttpClientConfig(config);
return new AsyncHttpClient(new NettyAsyncHttpProvider(myConfig), myConfig);
Run Code Online (Sandbox Code Playgroud)
myConfig.setProxyServerSelector(newSelector),NettyAsyncHttpProvider客户端中实例执行的新请求都将使用新的代理服务器设置.一些提示/警告:
这种方法依赖于内部实施NettyAsyncHttpProvider; 因此,在可维护性,未来的Netty库版本升级策略等方面做出自己的判断.在升级到新版本之前,您可以随时查看Netty源代码.目前,我个人认为不太可能改变这个实现无效.
你可以得到ProxyServerSelector的ProxyServer使用com.ning.http.util.ProxyUtils.createProxyServerSelector(proxyServer)-这正是AsyncHttpClientConfig.Builder做.
给定的示例没有用于访问的同步逻辑proxyServerSelector; 您可能希望根据应用程序逻辑需要添加一些.
也许提交一个功能请求是一个好主意,AsyncHttpClient以便能够设置一个"配置工厂",AsyncHttpProvider所以所有这些复杂性将消失:-)
| 归档时间: |
|
| 查看次数: |
3047 次 |
| 最近记录: |