Java 主线程未等待订阅服务器在被动订阅服务器中完成其任务

Java 主线程未等待订阅服务器在被动订阅服务器中完成其任务,java,spring,multithreading,spring-webflux,project-reactor,Java,Spring,Multithreading,Spring Webflux,Project Reactor,我在spring中有一个服务,它需要使用十种不同的方法获取数据 我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有的响应出现,然后返回一个响应 在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程并不等待订阅方方法完成 下面是我订阅的两种方法 private Mono<BaseResponse> getProfileDetails(long profileId){ return new Mono<BaseResponse

我在spring中有一个服务,它需要使用十种不同的方法获取数据

我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有的响应出现,然后返回一个响应

在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程并不等待订阅方方法完成

下面是我订阅的两种方法

private Mono<BaseResponse> getProfileDetails(long profileId){
        return new Mono<BaseResponse>() {

            @Override
            public void subscribe(Subscriber<? super BaseResponse> s) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // DB Operation
                System.out.println("Inside getProfileDetails");
                s.onNext(new BaseResponse());
            }
        };
    }

private Mono<Address> getAddressDetails(long profileId){
        return new Mono<Address>() {

            @Override
            public void subscribe(Subscriber<? super Address> s) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // DB Operation
                System.out.println("Inside getAddressDetails");
                s.onNext(new Address());
            }
        };
    }
我的输出显示主线程没有等待订阅服务器完成其任务,
那么我该如何处理这种情况呢?

我假设您的
getProfileDetails()
getAddressDetails()
方法只是占位符,因为它们在编写时没有多大意义

这就是说,如果这是您在这里的整个应用程序,并且您真的只想在完成之前进行阻止,那么您可以更改当前的
subscribe()
调用以获得
doOnNext()
,然后只需
blockLast()

在反应性应用程序中,阻塞反应性线程通常是不明智的,这是有充分理由的,但在这种情况下,您实际上只是想在完全退出之前阻塞-因此我看不出有什么负面影响。

,执行给定的任务,在所有任务完成后返回一个保留其状态和结果的未来列表。
public BaseResponse getDetails(long profileId){
        ExecutorService executors = Executors.newFixedThreadPool(2);

        Mono<BaseResponse> profileDetail = this.getProfileDetails(profileId).subscribeOn(Schedulers.fromExecutor(executors));
        Mono<BaseResponse> addressDetail = this.getAddressDetails(profileId).subscribeOn(Schedulers.fromExecutor(executors));

        List<BaseResponse> list = new ArrayList<>();

        profileDetail.mergeWith(addressDetail)
        .subscribe(consumer -> {
                list.add(consumer);
        });

        System.out.println("list: "+new Gson().toJson(list));
        executors.shutdown();

        return response;
    }
list: []
Inside getProfileDetails
Inside getAddressDetails
profileDetail.mergeWith(addressDetail)
.doOnNext(consumer -> {
        list.add(consumer);
})
.blockLast();