泽西岛客户端无阻塞

Chr*_*her 8 java nio jersey 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支持 - 但根本没有看到任何行为上的差异.

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

小智 5

我正在使用CloseableHttpAsyncClient向外部服务发出异步请求。它每秒可以处理几百个请求,效果很好,我还没有观察到像您这样的线程数量。这是一个外部依赖关系,您可以通过以下方式通过Maven进行集成

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpasyncclient</artifactId>
  <version>4.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。