【发布时间】:2019-12-20 04:23:49
【问题描述】:
我正在使用 Spring WebClient 调用休息服务。 post call的代码如下所述。
Mono<ClientResponse> response = client.post()
.uri(uriBuilder -> uriBuilder.build())
.headers(httpHeaders -> httpHeaders.setAll(getHeaders()))
.body(BodyInserters.fromPublisher(Mono.just(message), String.class))
.exchange();
response.subscribe(clientResponse -> {
System.out.println(clientResponse.statusCode());
});
在连续发布一段时间后(在 5 分钟内发布 2-3 百万个请求后),我收到以下异常。
[ parallel-3] r.c.s.Schedulers : Scheduler worker in group main failed with an uncaught exception
reactor.core.Exceptions$ErrorCallbackNotImplemented: reactor.netty.internal.shaded.reactor.pool.PoolAcquireTimeoutException: Pool#acquire(Duration) has been pending for more than the configured timeout of 45000ms
Caused by: reactor.netty.internal.shaded.reactor.pool.PoolAcquireTimeoutException: Pool#acquire(Duration) has been pending for more than the configured timeout of 45000ms
at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.run(AbstractPool.java:317) ~[reactor-netty-0.9.0.RELEASE.jar!/:0.9.0.RELEASE]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ Request to POST https://myrest-service-c12-1-lb-125370128.us-west-2.elb.amazonaws.com/antenna [DefaultWebClient]
Stack trace:
at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.run(AbstractPool.java:317) ~[reactor-netty-0.9.0.RELEASE.jar!/:0.9.0.RELEASE]
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68) [reactor-core-3.3.0.RELEASE.jar!/:3.3.0.RELEASE]
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28) [reactor-core-3.3.0.RELEASE.jar!/:3.3.0.RELEASE]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:834) [?:?]
看起来池已用尽,我需要限制请求的数量。有人可以帮我解决这个问题。提前致谢。
【问题讨论】:
-
为什么你认为这是因为池已耗尽?从异常消息来看,错误也可能是由服务器端引起的。你检查过服务器端日志吗?
-
服务器日志中没有错误。我认为因为客户端正在推送数百万条消息,所以 Web 客户端的连接不足。
-
当我限制来自客户端的请求数时,此错误停止。
-
我只是在使用.. WebClient.builder().clientConnector(new ReactorClientHttpConnector(getHttpClient())).baseUrl(url).build();我将其更新为... ConnectionProvider elasticPool = ConnectionProvider.elastic("ElasticPool"); HttpClient httpClient = HttpClient.create(fixedPool); WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)).baseUrl(url).build();它在发布 5000 多条消息后就挂了。
-
当我使用具有更多连接数的固定池时,我遇到了同样的问题... ConnectionProvider fixedPool = ConnectionProvider.fixed("fixedPool", 10000);在我将连接数从 10000 更改为 1000 后,它开始发布,但实际问题(PoolAcquireTimeoutException)再次出现。在尝试了不同数量的连接后,我确定了 1000 并请求限制。
标签: webclient reactive spring5