【问题标题】:Spring Reactor Mono wait for the subscriber to complete it's task before returning the dataSpring Reactor Mono 在返回数据之前等待订阅者完成它的任务
【发布时间】:2021-10-13 17:37:13
【问题描述】:

我正在尝试使用返回 Mono 的 Spring reactor webclient 执行多个 HTTP 调用。我正在使用 Mono.block() 等待所有单声道完成。这不是等到 subscribe() 完成。

public class UserValidator {

    public Mono<User> getUserSummary(int userId) {
        User user = new User();

        // First Mono
        Mono<Address> address = WebClientUtil.mono(userId, Address.class);
        address.subscribe(adrs -> updateAddress(adrs, user));

        // Second Mono
        Mono<Education> education = WebClientUtil.mono(userId, Education.class);
        education.subscribe(edcn -> updateEducationDeatils(edcn, user));

        Mono.when(address, education).block(); // Blocking the monos to complete

        // Intermittently returning the incomplete data ******************
        return Mono.just(user);
    }

    private void updateAddress(Address adrs, User user) {
        // Do some validations
        // Validations takes 5 to 10 seconds
        user.setAddress(adrs);
    }

    private void updateEducationDeatils(Education education, User user) {
        // Do some validations
        // Validations takes 5 to 10 seconds
        user.setEducation(education);
    }

}

有人可以帮我解决这个问题,以便在 subscribe() 完成后返回更新的用户对象吗?

【问题讨论】:

    标签: java spring spring-boot spring-webflux


    【解决方案1】:

    如果返回值也是Mono,则不应阻止Mono,而是使用zip

        public Mono<User> getUserSummary(int userId) {
            Mono<Address> addressMono = WebClientUtil.mono(userId, Address.class);
            Mono<Education> educationMono = WebClientUtil.mono(userId, Education.class);
    
            return Mono.zip(addressMono, educationMono, (address, education) -> {
              User user = new User();
              user.setAddress(address);
              user.setEducation(education);
            });
        }
    

    另外,请确保您的验证也不会被阻止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2021-12-26
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多