泽西岛客户端无阻塞

时间:2014-10-01 20:41:57

标签: java jersey nio grizzly jersey-client

产生大量线程绝不是一个好主意(当你创建太多线程时,无论如何都可能会耗尽内存)。

通常,Jersey需要为每个请求创建一个线程。这似乎是这种情况,我是否使用async() (泽西为我创建线程 - 我在调试器中调查了这个),或者不是(我显然必须自己创建线程

所以,这是一个不够好的具体情况:

我将HTTP发布到远程服务器,速率最高可达500请求/秒。但由于响应可能需要一些时间才能到达(我计算最多30秒),线程总数可以轻松达到数千(此时,JVM进程通常会崩溃)。而且,创造这么多线程真是太疯狂了。对于处理该负载的可用处理器/网络/ OS资源而言,它实际上应该是一块蛋糕。

所以我想做的就是触发请求 - 并在HTTP响应到来时通知操作系统。

  • 如上所述,简单地使用target.request(...).async()....并没有做到这一点(因为那时,泽西岛只会产生自己的线程)。
  • 此外,通过new ClientConfig().property(ClientProperties.ASYNC_THREADPOOL_SIZE, 10)限制线程数量根本没有用,因为这意味着一次最多会发送10个请求,这显然不是我想要的(它只会堆积) - 队列)。

我尝试使用new ClientConfig().connectorProvider(new GrizzlyConnectorProvider())来获得NIO支持 - 但根本没有看到任何行为上的差异。

那么有没有办法发出请求而不必为每个请求创建一个额外的线程?

2 个答案:

答案 0 :(得分:4)

我正在使用CloseableHttpAsyncClient向外部服务发出异步请求。它的工作正常,每秒几百个请求,我没有观察到像你的情况那样的线程数。这是一个外部依赖,您可以通过Maven通过

进行集成
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpasyncclient</artifactId>
  <version>4.0.1</version>
</dependency>

希望这有帮助。

答案 1 :(得分:1)

使用https://github.com/AsyncHttpClient/async-http-client发出请求,它使用netty。它将从请求线程触发它的调用,并回调您的代码,因此它不会占用容器请求线程。