繁体   English   中英

Spring 5 - 链反应式网络客户端调用

[英]Spring 5 - Chain reactive webclient calls

我正在尝试学习如何在 Spring 5 中使用反应式 WebClient。假设我需要拨打 3 个电话:

  1. 获取访问令牌
  2. 获取账户列表
  3. 对于每个帐户,获取交易列表。

这里,调用2和3分别依赖于1的output,而3也依赖于2的output。

我知道我可以做类似的事情:

accessTokenService
    .getAccessToken()
    .flatMapMany(accountsService::getAccounts)
    ...

但是对flatMapdoOnNext (或其他任何东西)的任何后续调用都只能访问帐户,而不能访问访问令牌。

我认为我的问题归结为:

如果调用 2 依赖于调用 1 的 output,而调用 3 依赖于调用 1 和 2 的 output,是否有一种标准方法可以在不使用block()的情况下完成此操作?

编辑澄清:调用 3 需要调用 1 的 output 作为输入,也需要调用 2 的 output 作为输入,例如:

accessTokenService
    .getAccessToken() // Call 1
    .flatMapMany((accessToken) -> accountsService.getAccounts(accessToken)) // Call 2
    .flatMapMany((accessToken, accounts) -> transactionService.getTransactions(accessToken, accounts)) // Call 3
    ...

假设数据类AccountTokenTransaction ,以及以下服务层结构:

interface AccessTokenService {
    Mono<Token> getAccessToken();
}
interface AccountsService {
    Flux<Account> getAccounts(Token token);
}
interface TransactionService {
    Flux<Transaction> getTransactions(Token token, Flux<Account> account);
}

然后您可以通过这种方式在收到令牌后将所有帐户的所有交易汇总在一起:

Flux<Transaction> transactions = accessTokenService
    .getAccessToken()
    .flatMapMany(token -> {
        final Flux<Account> accounts = accountsService.getAccounts(token);
        return transactionService.getTransactions(token, accounts);
    });

请注意,上面的所有调用都是非阻塞的。

接下来交易Flux会发生什么留给你:

  • 您可以阻止第一个/最后一个结果。
  • 您可以通过REST controller全部归还。
  • 您可以让它们全部由订阅者或 R2DBC 来使用它,随便您怎么说。

您可以使用以下方法实现它:

  1. Reactor 上下文,从版本3.1.3开始。
  2. 反应器元组
  3. 创建一个包含数据 && 访问令牌的包装器 object。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM