我在Reactor-core github上打开了这个问题,但是也许这不是他们的责任,所以没人在那里帮助我。
https://github.com/reactor/reactor-core/issues/1551 一般流程介绍:
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 );
}
所有重试处理都是异步的,并且与其他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,混合模式)