使用WebClient发送请求时重试“阻止”其他订阅者

时间:2019-03-05 13:24:18

标签: java spring-webflux project-reactor

我在Reactor-core github上打开了这个问题,但是也许这不是他们的责任,所以没人在那里帮助我。

https://github.com/reactor/reactor-core/issues/1551 一般流程介绍:

  1. 从控制器收到请求时,将创建一个Flux并发布一系列消息。
  2. 多个订阅者订阅了该Flux。
  3. onNext,每个订阅者将Api请求发送到特定的服务器。
  4. 添加了请求,(实际上是响应)中间重试操作。

Scheduler requestsScheduler = Schedulers.single();
Scheduler retryingScheduler = Schedulers.newSingle("retrying_thread");

protected void hookOnNext(Message message) {
    getWebClient()
        .buildRequest(message)
        .publishOn(requestsScheduler)
        .retryWhen(c -> retryByPolicy(c))
        .publishOn(requestsScheduler )
        .subscribe(new ResponseSubscriber(this)); 
}

private Flux<Long> retryByPolicy(Flux<Throwable> companionErrors) {
    int firstRetryIndex = 1;
    return companionErrors.publishOn(retryingScheduler)
        .zipWith(Flux.range(firstRetryIndex,this.maxRetries),(err, retryIndex) -> {
            if (retryIndex >= maxRetries )
                throw Exceptions.propagate(new ReachedMaxRetriesException());
            else
                return retryIndex;
        })
        .flatMap(retryIndex -> Mono.delay(this.retryDelay(retryIndex), retryingScheduler))
        .publishOn(requestsScheduler );
}
  1. 对于该请求,“ ResponseSubscriber”处理传入的响应并调用“ MessageSubscriber” .subscription.request(1)。

预期行为

所有重试处理都是异步的,并且与其他MessageSubscriber处理并行

实际行为

重试时,所有其他MessageSubscriber都在等待对“重试”中的特定MessageSubscriber的完整响应处理。

示例1-仅当MessageSubscriberB发送请求失败时,MessageSubscriberA才开始发送

03-03 14:25:56   [reactor-http-nio-3]   INFO   ControlelrRequest "1551615956502" changed its status from 'PENDING' to 'IN_PROGRESS'
03-03 14:25:56   [reactor-http-nio-3]   INFO   messageSubscriberA  Request: POST http://localhost:8080/REST/Command/1551615956412 of Message #1
03-03 14:25:56   [reactor-http-nio-3]   INFO   messageSubscriberB Request: POST http://172.29.50.248:8080/REST/Command/1551615956412 of Message #1
03-03 14:25:56   [single-1]   INFO   responseSubscriberA Handling Web response of Message #1 
03-03 14:25:57   [retrying_thread-2]   WARN   In retrying policy of messageSubscriberB : trying to send the Message #1 to 'SerberB' had failed - trying #1
03-03 14:26:18   [retrying_thread-2]    WARN   In retrying policy of messageSubscriberB : trying to send the Message #1 to 'SerberB' had failed - trying #2
03-03 14:26:39   [retrying_thread-2]     WARN   In retrying policy of messageSubscriberB : trying to send the Message #1 to 'SerberB' had failed - trying #3
03-03 14:26:39   [single-1]  ERROR   Failed to send requests (Message #1) to the server 'ServerB'. got failed after reached max retries code
03-03 14:26:39   [single-1]   INFO  messageSubscriberA  Request: POST http://localhost:8080/REST/Command/1551615956412 of Message #2
03-03 14:26:40   [single-1]   INFO   responseSubscriberA Handling Web response of Message #228 
03-03 14:26:40   [single-1]   INFO  messageSubscriberA  Request: POST http://localhost:8080/REST/Command/1551615956412 of Message #3
03-03 14:26:40   [single-1]   INFO   responseSubscriberA Handling Web response of Message #3
03-03 14:26:40   [single-1]   INFO  messageSubscriberA  Request: POST http://localhost:8080/REST/Command/1551615956412 of Message #4
03-03 14:26:41   [single-1]   INFO   responseSubscriberA Handling Web response of Message #4
03-03 14:26:41   [single-1]   WARN   ControlelrRequest "1551615956502" changed its status from 'IN_PROGRESS' to 'DONE' with failures.

反应堆核心版本 反应堆堆芯.3.2.3。发布

JVM版本(例如java -version) java版本“ 11.0.1” 2018-10-16 LTS Java(TM)SE运行时环境18.9(内部版本11.0.1 + 13-LTS) Java HotSpot(TM)64位服务器VM 18.9(内部版本11.0.1 + 13-LTS,混合模式)

0 个答案:

没有答案