spring-boot - Spring Webflux : Extract value from Mono

标签 spring-boot reactive-programming spring-webflux

我是 spring webflux 的新手,正在尝试对两个单声道的值执行一些算术运算。我有一个产品服务,它通过 webClient 调用帐户服务来检索帐户信息。我想确定当前账户余额是否大于或等于产品的价格。

Mono<Account> account = webClientBuilder.build().get().uri("http://account-service/user/accounts/{userId}/",userId)
.retrieve().bodyToMono(Account.class);


//productId is a path variable on method
Mono<Product> product =this.productService.findById(productId);


当我尝试阻止流时出现错误

block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2


//Causes Error
Double accountBalance = account.map(a->a.getBalance()).block():

Double productPrice = product.map(p->p.getPrice()).block();

///Find difference, send response accordingly....


这是另一种更好的方法来实现这一目标的正确方法吗?我也在考虑以下方面的事情:
Mono<Double> accountBalance = account.map(a->a.getBalance()):

Mono<Double> productPrice = product.map(p->p.getPrice());

Mono<Double> res = accountBalance.zipWith(productPrice,(b,p)-> b-p);

//Something after this.....

最佳答案

您不能在主 react 器线程上使用块方法。这是禁止的。 block在其他线程上发布单声道时可能会起作用,但事实并非如此。

基本上你压缩两个单声道的方法是正确的。您可以创建一些辅助方法来对它们进行计算。在您的情况下,它可能看起来像:

public boolean isAccountBalanceGreater(Account acc, Product prd) {
   return acc.getBalance() >= prd.getPrice();
}

然后在您的 Mono 流中,您可以传递方法引用并使其更具可读性。
Mono<Boolean> result = account.zipWith(productPrice, this::isAccountBalanceGreater)


问题是你以后想用这些信息做什么。如果您只想返回 Controller truefalse没关系。否则你可能需要一些其他的映射、压缩等。

更新
return account.zipWith(productPrice, this::createResponse);

...

ResponseEntity createResponse(Account acc, Product prd) {
   int responseCode = isAccountBalanceGreater(acc, prd) ? 200 : 500;
   return ResponseEntity.status(responseCode).body(prd);
}

关于spring-boot - Spring Webflux : Extract value from Mono,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59723927/

相关文章:

java - 如何正确地将 2 列映射到同一实体

java - org.springframework.scheduling.annotation @Async 抛出服务器错误

rx-java - 仅在链中的 Observable 发出事件后才获取事件

java - 如何等待 List<Mono> 得到解析?

java - jackson.databind.ObjectMapper upperCasing json 数组和对象名称

scala - Scala 和 akka-http 休息服务的断路器

java - 如何使用 Spring WebClient 禁用 cookie

java - 如何限制 Flux<Map<K,V>> 中的元素数量并将其映射到自定义结果

java - 在 spring webflux 中使用 uri() 时如何保留 baseUrl

java - 找不到单元测试的 'annotation declaring class'