doc: 阅读project reactor文档

This commit is contained in:
asahi
2025-04-07 20:41:24 +08:00
parent e5b3cfead4
commit 3928ac7dc6

View File

@@ -58,6 +58,9 @@
- [Using resources and the finally block](#using-resources-and-the-finally-block)
- [doFinally](#dofinally)
- [using](#using)
- [retry](#retry)
- [retry原理](#retry原理)
- [retryWhen](#retrywhen)
# Reactor
## Reactive Programming
@@ -909,6 +912,54 @@ Flux.using(
- `Disposable::dispose`: resource cleanup
#### retry
`retry`允许对产生错误的sequence进行重试。
```java
Flux.interval(Duration.ofMillis(250))
.map(input -> {
if (input < 3) return "tick " + input;
throw new RuntimeException("boom");
})
.retry(1)
.elapsed()
.subscribe(System.out::println, System.err::println);
Thread.sleep(2100);
```
在上述示例中,`retry(1)`会对错误执行一次重试(`upstream重新开始生成`)。其产生结果如下所示:
```java
259,tick 0
249,tick 1
251,tick 2
506,tick 0
248,tick 1
253,tick 2
java.lang.RuntimeException: boom
```
##### retry原理
下游在上游调用`onError`会判断重试次数是否为0如果不为0会对重试次数进行减1并且重新对上游调用`subscribe`,这会令上游`重新从头开始生成序列`
直到重试次数为0之后`FluxRetry`才会将onError传递给下游。
#### retryWhen
`retryWhen`会使用`companion flux`来判断错误时是否应该回滚。`companion flux`由operator创建但是用户会通过装饰`companion flux`来自定义重试条件。
`companion flux`是一个`Flux<RetrySignal>`类型的值,该值将会被传递给`Retry`方法/策略(`retryWhen`只接受一个`Retry`类型的参数)。
使用者可以对`retry方法`进行指定,`retry方法`会返回一个`Publisher<?>`类型的值。
> Retry是一个抽象类但是提供了`Retry#from`方法通过该方法可以将lambda转换为Retry对象。
Retry周期如下所示
- 每当error发生时都会将`RetrySignal`发送到companion flux中此时`companion flux`已经被`retry方法`装饰过了
- `Flux<RetrySignal>`将会包含至今所有的重试尝试信息并且可以通过其访问error和error关联的元数据
- 如果`companion flux`发送了一个值,那么会触发重试
- 如果`companion flux`complete将会对error执行swallow操作retry cycle将会停止并且也会导致sequence complete
- 如果`companion flux`产生了一个error,retry cycle将会终止并且导致sequence按异常终止