Jersey Client non-blocking(Jersey客户端非阻塞)
问题描述
派生大量线程从来都不是一个好主意(当您创建太多线程时,无论如何都可能会耗尽内存)。
通常,Jersey需要为每个请求创建一个线程。无论我使用async()
(Jersey为我创建线程-我已经在调试器中研究过这一点),还是不使用(显然我必须自己创建线程),情况似乎都是如此。
所以这里有一个具体的情况,这是不够好的:
我正在以高达500个请求/秒的速度向远程服务器发送HTTP。但是,由于响应可能需要一些时间才能到达(我计算最多30秒),线程总数很容易达到数千(此时,JVM进程通常会崩溃)。此外,创建这么多线程简直是疯了。对于处理该负载的可用处理器/网络/操作系统资源来说,这实际上应该是小菜一碟。
因此,我想要做的就是发出请求,并在HTTP响应到达时得到操作系统的通知。
- 如上所述,简单地使用
target.request(...).async()....
并不能达到目的(因为这样一来,Jersey只会产生自己的线程)。 - 此外,通过
new ClientConfig().property(ClientProperties.ASYNC_THREADPOOL_SIZE, 10)
限制线程数也没有任何帮助,因为这意味着一次最多只能发送10个请求,这显然不是我想要的(这只会堆积队列)。
我尝试了new ClientConfig().connectorProvider(new GrizzlyConnectorProvider())
以获得NIO支持-但在行为上根本看不到任何差异。
那么,有什么方法可以在不为每个请求创建一个额外线程的情况下启动请求吗?
推荐答案
我正在使用CloseableHttpAsyncClient向外部服务发出异步请求。它在每秒几百个请求的情况下工作得很好,我还没有观察到像您这样的线程数量。它是一个外部依赖项,您可以通过
通过Maven进行集成<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.0.1</version>
</dependency>
希望这能有所帮助。
这篇关于Jersey客户端非阻塞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Jersey客户端非阻塞
基础教程推荐
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01