【发布时间】:2021-02-25 04:50:39
【问题描述】:
我是响应式编程的新手,并尝试使用项目反应器模拟以下用例,但我发现将响应从一个服务调用传递到另一个依赖服务有点困难。任何建议或参考将不胜感激。
响应 getDetails(请求 inputRequest){
//Call two external services parallel based on the incoming request
Response1 = callExternalService1(inputRequest)
Response2 = callExternalService2(inputRequest)
//Call one external service based on the Response1 and Response2
Response3 = callExternalService3(Response1,Response2);
//Call three external service parallel based on the Response1, Response2 and Response3
Response4 = callExternalService4(Response1,Response2,Response3);
Response5 = callExternalService5(Response1,Response2,Response3);
Response6 = callExternalService6(Response1,Response2,Response3);
//Last service call
Response finalResponse= callLastExternalService(Response4,Response5,Response6);
return finalResponse;
}
我尝试了以下示例,它适用于一个服务调用,但无法将响应传递给其他相关服务调用。
更新答案:
Mono<Response> getDetails(Request inputRequest){
return Mono.just(inputRequest.getId())
.flatMap(id->{
DbResponse res = getDBCall(id).block();
if(res == null){
return Mono.error(new DBException(....));
}
return Mono.zip(callExternalService1(res),callExternalService2(inputRequest));
}).flatMap(response->{
Response extser1 = response.getT1();
Response extser2 = response.getT2();
//any exceptions?
return Mono.zip(Mono.just(extser1),Mono.just(extser2),callExternalService3();
}).flatMap(response->callExternalService4(response.getT1(),response.getT2(),response.getT3())
});
}
private Mono<DbResponse> getDBCall(String id) {
return Mono.fromCallable(()->dbservice.get(id))
.subscribeOn(Schedulers.boundedElastic());
}
问题:
- 如何在不使用块的情况下将 Mono
转换为 DbResponse 操作? - 如果任何外部服务失败,如何构建 平面图中的失败响应并返回?
【问题讨论】:
标签: java-8 reactive-programming spring-webflux project-reactor