Spring webclient: несколько запросов одновременно - PullRequest
0 голосов
/ 17 января 2020

Возможно ли объединить несколько запросов в одном клиенте? Например, я хочу иметь возможность обновлять балансы как покупателя, так и продавца при совершении транзакции. Сейчас он просто обновляет баланс покупателя:


    public Mono<Void> isAccountBalanceGreater(Account acc, Product prd) {


       double newBuyerBalance  =acc.getBalance() - prd.getPrice();

       Mono<Account> seller =  webClientBuilder.build().get().uri("http://account-service/user/accounts/{userId}/", prd.getProductId())
    .retrieve().bodyToMono(Account.class)
    .map(a-> new Account(a.getAccountId(),a.getOwner(),a.getPin(),a.getBalance()+prd.getPrice(),a.getUserId()));

    Account newOwnerAcc = new Account(acc.getAccountId(),acc.getOwner(),acc.getPin(),newBuyerBalance,acc.getUserId());


return webClientBuilder.build().put()
.uri("http://account-service/account/update/{accountId}",acc.getAccountId())
.body(Mono.just(newOwnerAcc),Account.class)
.retrieve().bodyToMono(Void.class);





        }

Есть ли способ, которым я могу вызвать два метода сложения, чтобы оба баланса были обновлены?

Обновление : этот метод работает для вызова моно значения как переменной uri.

    return acc.flatMap(a->{


               UriComponents urlc = UriComponentsBuilder.fromUriString("http://account-service/account/update/{accountId}")
                       .encode().build();

               URI uri = urlc.expand(a.getAccountId()).toUri();

                return webClientBuilder.build().put()
                         .uri(uri)
                             .body(acc,Account.class).retrieve().bodyToMono(Void.class);
            });


1 Ответ

1 голос
/ 17 января 2020

Для упрощения я извлеку вызов веб-клиента для отдельного метода:

Mono<Void> webClientCall(Account acc) {
 return webClientBuilder.build().put()
    .uri("http://account-service/account/update/{accountId}",acc.getAccountId())
    .body(Mono.just(newOwnerAcc),Account.class)
    .retrieve().bodyToMono(Void.class);
}

При условии, что у вас есть учетные записи, вы можете использовать операторы zip и then:

Account acc1;
Account acc2; 

return webClientCall(acc1).zipWith(webClientCall(acc2))
         .then();

...