У меня есть служба весной, которая должна извлекать данные, используя десять различных методов.
Я хотел бы, чтобы эти методы выполнялись параллельно для выполнения некоторых операций с БД и возврата в родительский поток. Но родительский поток должен подождать, пока все ответы придут, и затем вернуть ответ.
В моем текущем подходе я использую реактивный моно для выполнения всех методов асинхронно, но основной поток не ожидает методов подписчика для fini sh.
Ниже приведены мои два метода, на которые я подписался
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());
}
};
}
И ниже мой основной метод
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
Мой вывод показывает, что основной поток не ждет, пока подписчик завершит свою sh свою задачу, так как я могу справиться с этой ситуацией?