2017-11-03 4 views
0

Ich habe Probleme, ein passendes Konstrukt für den gegebenen Anwendungsfall zu finden.Halten Sie X-Anfragen parallel, bis N Anfragen abgeschlossen

Ich habe eine Funktion, die für die angegebene Eingabezeichenfolge eine Single<String> generiert. Diese Single ist eine Kombination aus mehreren Aufgaben, die voraussichtlich bis zu einer halben Minute dauern, aber ich denke, das ist nicht relevant für die Frage.

Das Verhalten, das ich versuche zu erreichen, ist 5 dieser Aufgaben aktiv parallel mit dem Ziel, N Aufgaben abzuschließen. Da die Aufgaben nicht nur zeitlich hoch sind, sollten keine überzähligen Aufgaben gestartet werden, die später verworfen werden. Es ist nicht wichtig, die Ergebnisse dieser Aufgaben irgendwie zusammenzuführen, ich behalte einfach jedes Ergebnis in onSuccess.

Also im Grunde mein Plan ist es, eine Zählervariable zu haben, die dann bei 0 beginnt, in einer Schleife, erzeugen 5 Single, den Zähler um 5. Melden Sie sich an ihnen zu erhöhen, onComplete den Zähler und onTerminate wenn counter < N zu erhöhen, Starten Sie einen anderen Single.

Am Ende fehlt mir jedoch ein guter Weg, um die rekursiv erzeugten Single Objekte zu verfolgen, aber ich muss warten, bis N fertig sind.

Gibt es ein Konstrukt zur Verfügung, das dies leicht machen würde, oder sollte ich versuchen, dies mit Zählern oder einer Liste von zu erreichen?

Antwort

1

Der Operator flatMap() akzeptiert einen zusätzlichen Parameter, der die Anzahl der gleichzeitig verwalteten Subskriptionen angibt. Hier ist eine Testprobe:

@Test 
public void testStuff() throws Exception { 
    Single<String> source; 
    PublishSubject<String> src = PublishSubject.create(); 
    src 
      .flatMap(s -> doStuff(s).toObservable(), 5) 
      .subscribe(v -> { // process v 
      }); 
} 

Single<String> doStuff(String subject) { 
    return Single.just(subject); 
} 

Wenn doStuff() kehrt ein Single, haben Sie es konvertieren zu einem Observable, denn das ist, was flatMap() Arbeiten mit.

Verwandte Themen