Java 如何提供Mono使用者作为方法参数?

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

我有一个通用方法,它并行执行一组请求,将它们发送到外部web api,并收集结果

问题:调用方应该能够为web请求的子例程提供成功和错误处理程序。但是怎么做呢

例如:

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(...))