【问题标题】:Spring WebClient reactor.netty.internal.shaded.reactor.pool.PoolAcquireTimeoutExceptionSpring WebClient reactor.netty.internal.shaded.reactor.pool.PoolAcquireTimeoutException
【发布时间】: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


【解决方案1】:

似乎是最近修复的 reactor-netty 中的一个错误:https://github.com/reactor/reactor-netty/issues/1012

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2022-01-01
    • 2020-04-30
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2018-08-18
    相关资源
    最近更新 更多