using 的问题AsyncHttpClient.close()
是它关闭了提供者使用的线程池执行器,然后没有办法在不重新构建它的情况下重用客户端,因为根据文档,一旦 ts 关闭,执行器实例就不能被重用. 所以,如果你这样做,除了重新构建客户端之外别无他法(除非你实现自己的 ExecutorService ,它会有另一个关闭逻辑,但这是一个很长的路要走,恕我直言)。
但是,通过查看 的实现NettyAsyncHttpProvider
,我可以看到它存储了对给定AsyncHttpClientConfig
实例的引用并调用它getProxyServerSelector()
来获取每个新NettyAsyncHttpProvider.execute(Request...)
调用的代理设置(即每个由 执行的请求AsyncHttpClient
)。
然后,如果我们可以让getProxyServerSelector()
return 成为 的可配置实例ProxyServerSelector
,那就可以了。
不幸的是,AsyncHttpClientConfig
它被设计为只读容器,由AsyncHttpClientConfig.Builder
. 为了克服这个限制,我们必须破解它,比如使用“wrap/delegate”方法:
例子:
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;
}
}
- 现在,在您的示例中,
AsyncHttpClient
使用我们的新包装器包装您的配置实例,并使用它来配置AsyncHttpClient
:
例子:
MyAsyncHttpClientConfig myConfig = new MyAsyncHttpClientConfig(config);
return new AsyncHttpClient(new NettyAsyncHttpProvider(myConfig), myConfig);
- 每当您调用
myConfig.setProxyServerSelector(newSelector)
时,客户端中的实例执行的新请求NettyAsyncHttpProvider
将使用新的代理服务器设置。
一些提示/警告:
这种方法依赖于内部实现NettyAsyncHttpProvider
;因此,请自行判断可维护性、未来 Netty 库版本升级策略等。在升级到新版本之前,您可以随时查看 Netty 源代码。目前,我个人认为不太可能更改太多以使此实现无效。
你可以通过使用来ProxyServerSelector
获得- 这正是它所做的。ProxyServer
com.ning.http.util.ProxyUtils.createProxyServerSelector(proxyServer)
AsyncHttpClientConfig.Builder
给定的示例没有用于访问的同步逻辑proxyServerSelector
;您可能希望根据应用程序逻辑需要添加一些。
也许提交功能请求以便AsyncHttpClient
能够设置“配置工厂”是一个好主意,AsyncHttpProvider
这样所有这些复杂性都会消失:-)