Spring boot 在doOnError中找不到订阅服务器上下文
我想知道是否有人能看到下面的代码片段,并告诉我为什么doon错误中的SubscriberContext没有触发Spring boot 在doOnError中找不到订阅服务器上下文,spring-boot,project-reactor,Spring Boot,Project Reactor,我想知道是否有人能看到下面的代码片段,并告诉我为什么doon错误中的SubscriberContext没有触发 公共Mono handlePlatformAuthenticationResponse(最终服务器请求服务器请求){ Mono-formData=serverRequest.body(BodyExtractors.toFormData()); 返回表单数据 .flatMap(this::provisionUserAndClass) .flatMap(元组->Mono.subscribe
公共Mono handlePlatformAuthenticationResponse(最终服务器请求服务器请求){
Mono-formData=serverRequest.body(BodyExtractors.toFormData());
返回表单数据
.flatMap(this::provisionUserAndClass)
.flatMap(元组->Mono.subscriberContext()
.map(上下文->{
//如果provisionUserAndClass成功完成,将调用此函数
遥测数据遥测数据=上下文.get(遥测数据);
LTILaunchRequest launchRequest=tuple.getT2();
此.addLaunchDetailsToTelemetryContext(launchRequest,telemetryData);
返回元组;
}))
.doError(错误->Mono.subscriberContext()
.map(上下文->{
//如果provisionUserAndClass返回Mono.error,则永远不会调用此函数
遥测数据遥测数据=上下文.get(遥测数据);
//日志遥测数据+错误消息
}))
.subscriberContext(context->context.put(遥测数据,新遥测数据());
}
专用Mono provisionUserAndClass(
LTILaunchRequest(LTILaunchRequest){
//返回Mono.error只是为了在错误发生时查看Mono.subscriberContext()的行为。实际代码将调用服务方法
返回Mono.error(新的ProvisioningException(“假”));
}
若要在发生错误时访问上下文,可以使用运算符:
.doOnEach(信号->{
if(signal.isOnError())
{
遥测数据遥测数据=signal.getContext().get(遥测数据);
Throwable error=signal.getThrowable();
// ...
}
})
Mono.subscriberContext()
只能在必须返回Mono的操作符(如flatMap、concatMap等)中有意义地使用,但不能在没有订阅Mono
的副作用操作符中使用
您忘记订阅
Mono.subscriberContext()。
尝试返回Mono.error而不是抛出异常我让provisionUserAndClass()返回Mono.error而不是RuntimeException,但它仍然没有进入Mono.subscriberContext()的映射在Doonerror中向我们展示codeI注释掉了处理程序方法“provisionUserAndClass”对服务的调用,并让它返回Mono.error,只是为了看看这是否有效。请用代码更新您的问题,不要在注释中发布,这是无法理解的谢谢您的建议。我将在这里测试和更新它
.doOnError(error -> Mono.subscriberContext()
.map(context -> {
// this is never invoked if provisionUserAndClass returns a Mono.error
TelemetryData telemetryData = context.get(TELEMETRY_DATA);
// log telemetryData + error message
}).subscribe())