Java 主线程未等待订阅服务器在被动订阅服务器中完成其任务
我在spring中有一个服务,它需要使用十种不同的方法获取数据 我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有的响应出现,然后返回一个响应 在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程并不等待订阅方方法完成 下面是我订阅的两种方法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
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();