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()<