メインスレッドは、反応性の加入者に自分のタスクを完了するために、加入者を待っていません

Manshaviクマール:

私は10の異なる方法を使用してデータをフェッチする必要があり、春にサービスを提供しています。

私は、これらの方法は、いくつかのDB操作を行うと、親スレッドに戻るために並列に実行したいと思います。しかし、親スレッドは、すべての応答が来るまで待ってから応答を返す必要があります。

私の現在のアプローチでは、私は非同期的にすべてのメソッドを実行するために反応性のモノを使用していますが、メインスレッドが終了するの加入方法を待っていません。

以下は、私が加入している私の2つの方法です

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

加入者がそのタスクを完了するためにメインスレッドが待機していないので、どのように私はこのような状況を扱うことができるというのが私の出力が示しますか?

マイケル・ベリー:

私はあなたを仮定しているgetProfileDetails()getAddressDetails()書かれたとして、彼らはあまり意味がありませんような方法は、単なるプレースホルダです。

ことで、これはここにあなたの全体のアプリケーションであり、そしてあなたが本当にちょうど完了する前にブロックする場合、あなたにもちょうどあなたの現在の変更される可能性があり、言ったsubscribe()の呼び出しをdoOnNext()ちょうどそして、blockLast()

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

反応スレッドでブロックすると、通常、正当な理由のための反応性のアプリケーションで無分別であるが、この場合には、あなたは文字通り完全に終了する前にブロックしたい - 私はここに多くのマイナス面を見ることができないようにします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=364124&siteId=1