2017-12-08 3 views
0

Ich verwende Retrofit2 mit Rxjava, um API-Aufrufe zu machen. Ich muss mehrere API-Aufrufe (der gleichen API) machen, sagen wir 100 von ihnen. Jetzt möchte ich, maximal 5 von ihnen parallel ausgeführt werden. Wenn also 5 API-Aufrufe laufen, sollte der 6. warten. Sobald einer dieser laufenden 5 Anrufe abgeschlossen ist, sollte der 6. beginnen. Ich will das nicht in der Masse von 5, wo die ersten 5 vervollständigt werden und erst danach die nächsten 5 passiert.Api Anrufe Verkettung zu einem bestimmten Limit Rxjava2 + Retrofit2

Ich bin mir nicht sicher, wie ich mit Rxjava erreichen kann und deshalb habe ich kein Schnipsel zum Posten. Jede Hilfe wäre toll

+0

Mit welchem ​​spezifischen Szenario haben Sie es zu tun? Anstatt dies in RxJava zu versuchen, würde ich mir das Kernproblem ansehen, ist das die einzige Lösung? –

Antwort

1

RxJava verfügt über bestimmte Operatoren, die die Anzahl der aktiven Threads begrenzen können.

observable 
    .flatMap(input -> apiCallReturningObservable(input), 5) 
    .subscribe(); 

wird maximal 5 Invokationen von apiCallReturningObservable() auf einmal haben.

+0

Wird die sechste automatisch aufgerufen, wenn einige der fünf Arbeiter fertig sind, oder schneidet sie nach dem angegebenen Limit ab? –

+0

Die Dokumentation sagt, dass es schließlich alle Werte abbildet, aber die Anzahl der gleichzeitigen Abonnements begrenzt. –

+0

Das macht genau das, was ich brauchte! – Apr444

-2

Ich denke nicht, Rx ist der richtige Ruf dafür, ich glaube, dass was Sie wollen, ist ein ThreadPool. Ein ThreadPool ist, wenn Sie eine feste Anzahl von Threads definieren, die für die Ausführung einer Arbeit verantwortlich sind. Wenn mehr Jobs eingereicht werden als freie Threads im Pool vorhanden sind, werden sie in die Warteschlange gestellt und aufgerufen, sobald ein Worker-Thread frei wird. Eine Beispielimplementierung, die die native Java-API verwendet, finden Sie unter here.

Wenn Sie immer noch Rx dafür verwenden möchten, können Sie eine eigene Implementierung eines ThreadPool erstellen, der jedes Mal ein Ereignis abgibt, wenn ein Worker-Thread verfügbar ist - oder Sie können die Anzahl der spawn-Threads überwachen, die Ereignisse entsprechend ausgeben sie beenden ihren Job. Sobald dies geschehen ist, abonnieren Sie den Publisher und tun Sie, was Sie wollen.

Verwandte Themen