如何将错误记录到数据库并在项目反应器中恢复执行?

How to log error to DB and resume execution in project reactor?

我想将错误记录到 mongo 数据库集合并继续在管道中传播错误。我怎样才能在项目反应器中做到这一点?

当前代码使用提取器(Mono.block()),据我所知,不建议使用它。这是当前代码的样子:

        testMono.doOnError(throwable -> {
            var errorObject = ErrorObject.builder()
                    .message(throwable.getLocalizedMessage())
                    .className(throwable.getClass().getSimpleName())
                    .build();
            errorMessageRepository.save(errorObject).block();
        })

这是正确的方法还是我应该在这里使用 Mono.subscribe()

您应该避免使用 block()

如果您需要 即发即弃 调用,您可以使用 subscribe():

 testMono.doOnError(throwable -> {
            var errorObject = ErrorObject.builder()
                    .message(throwable.getLocalizedMessage())
                    .className(throwable.getClass().getSimpleName())
                    .build();
            errorMessageRepository.save(errorObject).subscribe();
        })

请注意,在这种情况下,您将失去背压支持。

或者,您可以像这样使用 onErrorResume 运算符:

testMono.onErrorResume(throwable -> {
    var errorObject = ErrorObject.builder()
            .message(throwable.getLocalizedMessage())
            .className(throwable.getClass().getSimpleName())
            .build();
    return errorMessageRepository.save(errorObject).then(Mono.error(throwable)));
});

这样,then 操作员会按原样重播错误。