2016-08-08 3 views
0

リモートAPIから照会する必要があるIDのリストがあります。エンティティをAPIから同時に(同時に)照会し、リスト内のIDの順序を維持したい。複数のIDを同時に照会して単一のObservableに結合する

Observablesでどのように達成できますか?

Observable<String> strings = Observable.from(Arrays.asList(5, 4, 7, 2, 1) 
       .stream() 
       .map(Main::retrieve) 
       .collect(Collectors.toList())) 
       .flatMap(o -> o); 

上記のコードスニペットを使用すると、オーダーが保証されないようです。

答えて

0

concatMapEagerを使用して、この動作を実現並行性

代わりに、私は私がflatMap内部subscribeOn(Schedulers.io())オペレータコールとチェーンだろうMain::retrieveリターン(多分Observable.fromCallableを使用して)Observableに電話をかけるでしょう。

Schedulers.io()では、長時間実行されるがCPUライトタスク(通常はIO)のスレッドプールが増えているRxJavaスケジューラが使用されます。

flatMapの代わりに、** AND *並列化の両方が重要な場合はconcatMapEagerを使用できます。 concatMapは、最初の内部Observableが完了するのを待って、2番目などのトリガーを待つことによって順序を維持します。 concatMapEagerは、すべての内部Observablesをトリガーし、順番に再生しますそれは可能です。

これは最小限のアプローチです。[ABC]をトリガーして[ACB]で受信すると、すぐに「A」が放出され(正しい順序)、Bが到着するまでCがバッファリングされ、バッファリングされ、同様に放射される。

ので、コードは次のようになります。

Observable<String> strings = Observable.from(Arrays.asList(5, 4, 7, 2, 1)) 
    //be efficient/parallel friendly but still retain order 
    .concatMapEager(i -> 
     //Main's method has been converted to return an Observable 
     retrieve(i) 
     //retrieve will be executed in its own IO thread, so in parallel 
     .subscribeOn(Schedulers.io()) 
    ); 
1

私はそれが自分の意見を持つ2つのAPIを混合されたようObservable.from(...)の内のJava 8 Stream APIから収集を行うことは、良い考えであることはよく分からない代わりにflatMap

関連する問題