Ich verwende RX Java für den Großteil der Verarbeitung in meinem Tool. Grundsätzlich ist die Idee des Werkzeugs ich arbeite ist:Wie gruppieren oder cachen Sie Emissionen im komplexen Prozessablauf?
- die Payload erhalten (zum Beispiel HTML-Datei) von einer Quelle
- es in Fragmente geteilt einige spezifische Regel.
- Jedes Fragment kann zusätzliche Daten erfordert über asynchronen http Anruf geholt werden (kann solche Anrufe ein oder mehr gemacht werden), um die Daten
- jedes Fragment verwenden könnte genau gleiche HTTP-Aufrufe (Endpunkte)
- dann verwenden, von dem http-Endpunkt zurück, um etwas mit dem Fragment zu tun, dann kombinieren Sie alle verarbeiteten Fragmente zurück auf die Nutzlast - nennen wir es "verarbeitete Payload" Grundsätzlich ist der Fluss, den ich beschrieben, bereits implementiert und funktioniert gut, einfache Marmor-Diagramm zeigt grundlegende Idee.
Nicht sicher, ob Diagramm lesbar sein wird, so dass der Pseudocode der Verarbeitung wie folgt aussieht:
Observable.just("SOME_PAYLOAD_AS_STRING")
.flatMap(payload -> splitToFragmentObservables(payload)) //Getting observables of fragments
.concatMapEager(//concat all processed fragments
fragment -> getServiceCallsObservable(fragment) //get service calls for all fragments
.flatMap(this::doServiceCall) // do service call
.reduce(new HashMap<>(), (all, result) -> { //reduce results into map
all.addAll(result);
return all;
})
.map(all -> newFragmentWithData(fragment, all)) //apply somehow the all service results to my fragment
)
.reduce(new StringBuilder(), StringBuilder::append) //reduce all fragments back to string
.map(StringBuilder::toString);
Nun, ich denke, wie einige der zur Verbesserung der Verarbeitung, insbesondere HTTP-Aufrufe. Wie Sie im Diagramm sehen, kann jedes Fragment genau die gleichen Aufrufe (A, B oder C) ausführen, was unnötiger Overhead ist.
Ich bin auf der Suche nach einem Weg, wie Sie vermeiden, die gleichen Service-Anrufe in jedem Fragment zu tun. Was ist der beste Weg, es zu verbessern? Gruppiere dieselben Anrufe, führe den Anruf aus und benutze ihn dann irgendwie, wenn du das Endergebnis machst? Oder stattdessen etwas Caching?