Java 如何提供Mono使用者作为方法参数?
我有一个通用方法,它并行执行一组请求,将它们发送到外部web api,并收集结果 问题:调用方应该能够为web请求的子例程提供成功和错误处理程序。但是怎么做呢 例如:Java 如何提供Mono使用者作为方法参数?,java,spring,spring-webflux,project-reactor,Java,Spring,Spring Webflux,Project Reactor,我有一个通用方法,它并行执行一组请求,将它们发送到外部web api,并收集结果 问题:调用方应该能够为web请求的子例程提供成功和错误处理程序。但是怎么做呢 例如: public <Req, Rsp> List<Rsp> sendApiRequests(List<Req> requests, Class<Rsp> type) { return Flux.fromIterable(requests) .flatMap
public <Req, Rsp> List<Rsp> sendApiRequests(List<Req> requests, Class<Rsp> type) {
return Flux.fromIterable(requests)
.flatMap(req -> webClient.post()
.uri(uri)
.bodyValue(req)
.retrieve()
.bodyToMono(type)
.//TODO how can I add a generic handler methods here?
.)
.filter(rsp -> rsp.success() && rsp.results > 0) //some common filters
.collectList()
.block();
}
那有可能吗?因为我没有向调用者公开来自
webClient.post()
请求的Mono
,所以我不知道如何在其上链接处理程序方法。您可以在这里使用transform操作符。我不会称之为添加“消费者”,而是在反应管道的特定点插入额外的操作员。它看起来像:
public String blockingCall(Function<Mono<String>, Publisher<String>> transformer) {
return Mono.just("hi")
.transform(transformer)
.block();
}
您可以在此处使用transform操作符。我不会称之为添加“消费者”,而是在反应管道的特定点插入额外的操作员。它看起来像:
public String blockingCall(Function<Mono<String>, Publisher<String>> transformer) {
return Mono.just("hi")
.transform(transformer)
.block();
}
您应该使用
Mono#transform
。从反应器的位置:
transform操作符允许您将操作符链的一部分封装到函数中。该函数在装配时应用于原始操作符链,以使用封装的操作符对其进行扩充。这样做将对序列的所有订户应用相同的操作,基本上等同于直接链接操作符
就你而言:
public List sendApiRequests(列表请求、类类型、函数子例程){
返回通量.fromIterable(请求)
.flatMap((Req)->webClient.post()
.uri(uri)
.bodyValue(req)
.retrieve()
.bodyToMono(类型)
.transform(子例程)
)
.filter(rsp->rsp.success()&&rsp.results>0)//一些常见的过滤器
.LIST()
.block();
}
您应该使用Mono#transform
。从反应器的位置:
transform操作符允许您将操作符链的一部分封装到函数中。该函数在装配时应用于原始操作符链,以使用封装的操作符对其进行扩充。这样做将对序列的所有订户应用相同的操作,基本上等同于直接链接操作符
就你而言:
public List sendApiRequests(列表请求、类类型、函数子例程){
返回通量.fromIterable(请求)
.flatMap((Req)->webClient.post()
.uri(uri)
.bodyValue(req)
.retrieve()
.bodyToMono(类型)
.transform(子例程)
)
.filter(rsp->rsp.success()&&rsp.results>0)//一些常见的过滤器
.LIST()
.block();
}
blockingCall(it -> it.doOnSuccess(...).doOnError(...))