- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个 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);
}
这在启动时被调用一次,然后返回值被传递并在不同的地方使用。 makeProxyServer()
是我自己的函数,用于获取我的代理设置并返回一个 ProxyServer
对象。我需要做的是能够更改代理服务器设置,然后重新创建 AsyncHttpClient
对象。但是,我不知道如何彻底关闭它。一些搜索让我相信 close()
并不优雅。每次代理设置更改时,我都担心启动一个全新的执行程序和一组线程。这不会经常发生,但我的应用程序运行时间很长。
我知道我可以为每个请求使用 RequestBuilder.setProxyServer()
,但我想将它设置在一个位置,以便我的 asyncHttpClient
的所有调用者实例遵守系统范围的代理设置,而无需每个开发人员记住这样做。
重新配置或拆卸和重建基于 Netty
的 AsyncHttpClient
的正确方法是什么?
最佳答案
使用AsyncHttpClient.close()
的问题在于它关闭了提供者使用的线程池执行器,那么如果不重新构建它就无法重新使用客户端,因为根据 documentation ,一旦 ts 关闭,执行器实例就不能被重用。因此,如果您这样做,除了重新构建客户端外别无他法(除非您实现自己的 ExecutorService 会有另一个关闭逻辑,但这还有很长的路要走,恕我直言)。
但是,通过查看 NettyAsyncHttpProvider
的实现,我可以看到它存储了对给定 AsyncHttpClientConfig
实例的引用并调用它的 getProxyServerSelector()
为每个新的 NettyAsyncHttpProvider.execute(Request...)
调用获取代理设置(即对于 AsyncHttpClient
执行的每个请求)。
然后,如果我们可以让 getProxyServerSelector()
返回 ProxyServerSelector
的可配置实例,就可以做到这一点。
不幸的是,AsyncHttpClientConfig
被设计为只读容器,由 AsyncHttpClientConfig.Builder
实例化。为了克服这个限制,我们必须破解它,例如使用“包装/委托(delegate)”方法:
创建一个派生自 AsyncHttpClientConfig
的新类。该类应包装给定的单独 AsyncHttpClientConfig
实例并实现 AsyncHttpClientConfig
getter 对该实例的委托(delegate)。
为了能够在任何给定时间点返回我们想要的代理选择器,我们在 this 包装器类中使此设置可变,并为其公开 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;
}
}
AsyncHttpClient
配置实例,并使用它来配置 AsyncHttpClient
:例子:
MyAsyncHttpClientConfig myConfig = new MyAsyncHttpClientConfig(config);
return new AsyncHttpClient(new NettyAsyncHttpProvider(myConfig), myConfig);
myConfig.setProxyServerSelector(newSelector)
时,由客户端中的 NettyAsyncHttpProvider
实例执行的新请求将使用新的代理服务器设置。 一些提示/警告:
这种方法依赖于NettyAsyncHttpProvider
的内部实现;因此对可维护性、 future Netty 库版本升级策略等做出自己的判断。在升级到新版本之前,您可以随时查看 Netty 源代码。目前,我个人认为不太可能更改太多以使此实现无效。
您可以使用 com.ning.http.util.ProxyUtils.createProxyServerSelector(proxyServer)
为 ProxyServer
获取 ProxyServerSelector
-这正是 AsyncHttpClientConfig.Builder
所做的。
给定的示例没有用于访问proxyServerSelector
的同步逻辑;您可能希望根据应用程序逻辑需要添加一些。
也许为 AsyncHttpClient
提交一个功能请求是个好主意,以便能够为 AsyncHttpProvider
设置一个“配置工厂”,所以所有这些复杂情况会消失:-)
关于java - 如何关闭并重新配置使用 NettyAsyncHttpProvider 的 AsyncHttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965527/
我只是不喜欢 Logback 的 XML 或 Groovy 配置,而更喜欢用 Java 进行配置(这也是因为我将在初始化后的不同时间在运行时更改配置)。 似乎对 Logback 进行 Java 配置的
我的 sphinx 配置是: ================================ config/sphinx.yml development: bin_path: "/usr/loc
我们计划在生产服务器中部署我们的系统。我有兴趣了解更多有关优化网站性能的信息。 Sitecore 有哪些优化建议? (缓存,网络配置中的其他设置) 我们可以在 IIS 中做哪些优化? 找不到关于这些主
我有一个 Django 应用程序,可以处理网站的两个(或更多)部分,例如网站的“admin”和“api”部分。我还为网站的其余部分提供了普通的 html 页面,其中不需要 Django。 例如,我希望
我刚刚开始研究Docker。我有一个 Node 应用程序,可以调整大小和图像,然后在完成后向 aws 发送 SQS 消息。我已成功创建应用程序的 docker 镜像,并从本地计算机复制它,但遇到了无法
如何配置 checkstyle(在 Ant nt Maven 中)任务?我尝试了一点,但没有正确收到报告。这是我的 Ant 脚本。
我正在使用 Quartz 和 Spring 框架重写一个遗留项目。原始配置是 XML 格式,现在我将其转换为 Java Config。 xml 配置使用 jobDetail 设置触发器 bean 的作
tl;rd: 使用主键对数据库进行分区 索引大小问题。 数据库大小每天增长约 1-3 GB 突袭设置。 您有使用 Hypertable 的经验吗? 长版: 我刚刚建立/购买了一个家庭服务器: 至强 E
在安装 gcp 应用程序后,我们尝试使用 GCP 的图形 api 配置 Azure Active Directory saml 配置。我们正在遵循相同的 AWS graph api saml 设置 U
我刚刚了解了 spring security 并想使用 java hibernate 配置连接到数据库,但我发现的示例或教程很少。我通过使用 xml 配置找到了更多。我在这里使用 Spring 4.0
我们最近切换到 Java 8 以使用 java.time API(LocalDate、LocalDateTime,...)。因此,我们将 Hibernate 依赖项更新到版本 4.3.10。我们编写了
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus实战》系列的第六篇,咱
我是 NGINX 的新手,我正在尝试对我们的 ERP 网络服务器进行负载平衡。我有 3 个网络服务器在由 websphere 提供支持的端口 80 上运行,这对我来说是一个黑盒子: * web01.e
我们想使用 gerrit 进行代码审查,但我们在 webview 中缺少一些设置。 是否可以禁止提交者审查/验证他们自己的 提交? 是否有可能两个审稿人给 +1 一个累积它 到+2,以便可以提交? 谢
配置根据运行模式应用于 AEM 实例。在多个运行模式和多个配置的情况下,AEM 如何确定要选择的配置文件?假设以下配置在 AEM 项目中可用, /apps /myproject - con
我正在使用 Neo4j 服务器。我遇到了负载相对较低的问题。但是,响应时间相当长。我认为为请求提供服务的线程数太少了。有没有办法调整为 HTTP 请求提供服务的线程池的大小。那可能吗? 最佳答案 线程
我在/etc/default/celeryd 中有以下配置 CELERYD_NODES = "worker1 worker2 worker3" CELERYD_CHDIR = "path to pro
Plone 在其页面中显示来 self 的母语(巴西葡萄牙语)的特殊字符。但是,当我使用我创建的 spt 页面时,它会显示转义序列,例如: Educa\xc3\xa7\xc3\xa3o 代替 Educ
我正在尝试开始使用 Emacs/Clojure。安装 emacs 扩展的正确方法是什么。我正在尝试安装以下插件: https://bitbucket.org/kotarak/vimclojure 我已
我有一个简单的 C 项目结构: proj/ src/ docs/ build/ tests/ lib/ 尝试编写合适的 CMake 文件。 到目前为止我的尝试:http://pas
我是一名优秀的程序员,十分优秀!