Java 链中发生错误时更新原始Mono

Java 链中发生错误时更新原始Mono,java,project-reactor,reactor,Java,Project Reactor,Reactor,假设我有这样的东西: Mono.just(a) .flatMap(...) // init // set fields on a if error occurs .flatMap(...) // finalize .subscribe(); 在最后一个flatMap中,我根据a中字段的值执行一些最终逻辑。特别是我需要知道在初始化期间是否发生错误 所以我需要一种方法来截获错误并允许操纵原始对象 如果我没有错,那么所有onError*方法都会返回原始对象,而不允许对

假设我有这样的东西:

Mono.just(a)
    .flatMap(...) // init
    // set fields on a if error occurs
    .flatMap(...) // finalize
    .subscribe();
在最后一个
flatMap
中,我根据
a
中字段的值执行一些最终逻辑。特别是我需要知道在初始化期间是否发生错误

所以我需要一种方法来截获错误并允许操纵原始对象

如果我没有错,那么所有
onError*
方法都会返回原始对象,而不允许对其进行更新

而且
doon错误
似乎并不能解决我的问题


有什么方法可以满足我的需要吗?

你忽略了一个事实,即每一个下一个反应式操作符都为我们构建了一个新的
Mono
实例。因此,如果您再添加一个操作符,这对您来说并不重要:

/**
 * Simply emit a captured fallback value when any error is observed on this {@link Mono}.
 *
 * <p>
 * <img class="marble" src="doc-files/marbles/onErrorReturnForMono.svg" alt="">
 *
 * @param fallback the value to emit if an error occurs
 *
 * @return a new falling back {@link Mono}
 */
public final Mono<T> onErrorReturn(final T fallback) {

Mono.just(a)
    .flatMap(...)
    .onErrorReturn(fallbackValue)
    .flatMap(...)
    .subscribe();
/**
*当在这个{@link Mono}上观察到任何错误时,只需发出一个捕获的回退值。
*
*
* 
*
*@param回退发生错误时要发出的值
*
*@return一个新的后退{@link Mono}
*/
公开最终报告(最终T回退){
单声道
.flatMap(…)
.onErrorReturn(fallbackValue)
.flatMap(…)
.subscribe();

您完全可以调查所有其他的
onError*
以查找任何可能的错误处理变体。

您忽略了一个事实,即每个下一个反应式操作符都为我们构建了一个新的
Mono
实例。因此,如果您再添加一个操作符,对您来说并不重要:

/**
 * Simply emit a captured fallback value when any error is observed on this {@link Mono}.
 *
 * <p>
 * <img class="marble" src="doc-files/marbles/onErrorReturnForMono.svg" alt="">
 *
 * @param fallback the value to emit if an error occurs
 *
 * @return a new falling back {@link Mono}
 */
public final Mono<T> onErrorReturn(final T fallback) {

Mono.just(a)
    .flatMap(...)
    .onErrorReturn(fallbackValue)
    .flatMap(...)
    .subscribe();
/**
*当在这个{@link Mono}上观察到任何错误时,只需发出一个捕获的回退值。
*
*
* 
*
*@param回退发生错误时要发出的值
*
*@return一个新的后退{@link Mono}
*/
公开最终报告(最终T回退){
单声道
.flatMap(…)
.onErrorReturn(fallbackValue)
.flatMap(…)
.subscribe();

您完全可以调查所有其他的
onError*
,以查找任何可能的错误处理变体。

请记住,这是一个离散和(潜在)的链异步步骤。一旦您输入了一个步骤,您得到的唯一上下文就是前一个步骤的输出,其形式为
onNext
onComplete
onError
信号,以及java核心语言可以向您公开的任何功能。例如,如果您在
平面图中组装内部
通量
lambda,java允许您访问该lambda的输入参数

后者可能是您所需要的解决方案:您可以在其中获得原始值的范围

因此,第一个
flatMap
可以充当封闭范围并处理标称和错误情况。类似于:

Mono<B> processed = Mono.just(a)
    .flatMap(a -> init(a)
        .onErrorResume(fallback(a))
    )
    .flatMap(...); // finalize
processed.subscribe();

//for illustration purposes, what process and fallback may typically look like:
Mono<B> init(A a) {
    return Mono.zip(
        asyncServiceStuff.process(a.stuff),
        asyncServiceOtherStuff.process(a.otherStuff),
        (bPart1, bPart2) -> new B(bPart1, bPart2)
    );
}

Mono<B> fallback(A original) {
    return Mono.just(new FallbackB(a.otherStuff));
}
Mono processed=Mono.just(a)
.flatMap(a->init(a)
.1恢复(后备(a))
)
.flatMap(…);//完成
已处理。订阅();
//出于说明目的,流程和回退通常是什么样子的:
单声道初始化(A){
返回Mono.zip(
asyncServiceStuff.process(a.stuff),
asyncServiceOtherStuff.process(a.otherStuff),
(bPart1,bPart2)->新B(bPart1,bPart2)
);
}
单声道回退(原版){
返回Mono.just(新的FallbackB(a.otherStuff));
}

这就是说,您似乎希望从
a
创建回退,该回退在方法的范围内已经可以访问(理想情况下作为
最终的
输入参数或变量)。

请记住,这是一个离散的和(潜在的)变量链异步步骤。一旦您输入了一个步骤,您得到的唯一上下文就是前一个步骤的输出,其形式为
onNext
onComplete
onError
信号,以及java核心语言可以向您公开的任何功能。例如,如果您在
平面图中组装内部
通量
lambda,java允许您访问该lambda的输入参数

后者可能是您所需要的解决方案:您可以在其中获得原始值的范围

因此,第一个
flatMap
可以充当封闭范围并处理标称和错误情况。类似于:

Mono<B> processed = Mono.just(a)
    .flatMap(a -> init(a)
        .onErrorResume(fallback(a))
    )
    .flatMap(...); // finalize
processed.subscribe();

//for illustration purposes, what process and fallback may typically look like:
Mono<B> init(A a) {
    return Mono.zip(
        asyncServiceStuff.process(a.stuff),
        asyncServiceOtherStuff.process(a.otherStuff),
        (bPart1, bPart2) -> new B(bPart1, bPart2)
    );
}

Mono<B> fallback(A original) {
    return Mono.just(new FallbackB(a.otherStuff));
}
Mono processed=Mono.just(a)
.flatMap(a->init(a)
.1恢复(后备(a))
)
.flatMap(…);//完成
已处理。订阅();
//出于说明目的,流程和回退通常是什么样子的:
单声道初始化(A){
返回Mono.zip(
asyncServiceStuff.process(a.stuff),
asyncServiceOtherStuff.process(a.otherStuff),
(bPart1,bPart2)->新B(bPart1,bPart2)
);
}
单声道回退(原版){
返回Mono.just(新的FallbackB(a.otherStuff));
}
这就是说,您似乎希望从
a
创建回退,该回退在方法的范围内已经可以访问(理想情况下作为
最终的
输入参数或变量)

private Mono getFallbackMono(ClassA){
返回Mono.just(getMutatedA(a));
}
.onErrorResume
将返回一个要回退的流。在这里,您可以创建一个新的流,其变异值为
a

.doError()
是一个副作用运算符。我将使用它记录错误

private Mono getFallbackMono(ClassA){
返回Mono.just(getMutatedA(a));
}
.onErrorResume
将返回一个要回退的流。在这里,您可以创建一个新的流,其变异值为
a


.doError()
是一个副作用运算符。我将使用它记录错误。

我不确定是否理解您的答案。在我的情况下,
回退值应根据从原始a对象中检索到的信息以及从
OneError
(?)截获的可丢弃值创建方法。所以基本上我需要一个类似于
onErrorDoSomething(Throwable t,Mono Mono)
的Mono方法,并返回一个MonoOK。然后
onErrorResume()
可以帮助您。顺便说一句
flatMap()<