![](/img/trans.png)
[英]How to perform an action only if the Mono is empty and throw an error if not empty
[英]How to throw an Error explicitly while processing Mono
我需要知道如何在执行 Mono 时显式抛出异常。我无法订阅,阻止 Mono,因为它有结束(下游)订阅者。 只需要验证数据并显式抛出异常来执行重试。
public Mono<Response> handleResponse() {
return userService.getUser()
.doOnNext(response -> validate(response.getData()))
.onErrorResume(ex -> {
// not working
throw Exceptions.propagete(ex);
});
}
private void validate() {
.....
throw new RuntimeException();
}
@Retyable(value = {RuntimeException.class})
如果没有异常,它将返回 Mono 到下一级。 我可以使用 Mono 重试,但需要知道有什么办法可以解决这个问题。
要产生错误,您可以使用Mono.error(throwable)
。
但是代码中的另一个问题是您在doOnNext
中进行验证,这不应该改变流程。 最好使用flatMap
。
你可以这样做:
userService.getUser()
.flatMap(response -> {
try {
validate(response.getData());
return Mono.just(response);
} catch (Throwable t) {
return Mono.error(t);
}
})
最简单的方法如下:
getUser()
.map(response -> {
validate(response);
return response;
})
如果您可以更改validate
方法,我建议您按以下方式进行:
getUser()
.handle((response, sink) -> {
if (isValid(response)) {
sink.next(response);
} else {
sink.error(new RuntimeException("..."));
}
})
// where
public boolean isValid(User user) {
//...
}
如果你尝试这样的事情怎么办:
public Mono<Response> handleResponse() {
return Mono.fromFuture(userService.getUser()
.doOnNext(response -> validate(response.getData()))
.handle((response, throwable) -> {
if (throwable == null) {
return response;
} else {
throw new RuntimeException();
}
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.