Kette eine Reihe von asynchronen Aufrufen

9

Ich habe eine Reihe von asynchronen Operationen

%Vor%

Dies hat einige Probleme:

  1. Die Callbacks können nicht anderswo wiederverwendet werden, da jedes an den "nächsten Schritt"
  2. gebunden ist
  3. Das Umordnen von Operationen oder das Einfügen einer anderen Operation ist nicht intuitiv und beinhaltet das Springen überall.

Ich habe die folgenden Optionen untersucht, um dies zu mildern:

  1. ExecuterService#invokeAll - Ich sehe nicht, wie diese Lösung ohne Blockierung verwendet werden kann.
  2. RxJava - Ich würde es vorziehen, einen solchen Paradigmenwechsel in meiner Anwendung zu vermeiden, wenn ich kann!
  3. Guavas ListenableFutures und seine transform -Methode. Ich sah, dass dies an wenigen Stellen um die Interweb-Nuss herum erwähnt wird. Ich sehe ehrlich nicht, wie dies mein Problem lösen würde.

Die Frage ist also: Was wäre ein gutes Muster, um eine Reihe asynchroner Aufrufe in Java zu verketten? Auf der Suche nach einer Lösung, die mit Java 7 funktioniert, da ich dies für eine Android-App brauche.

    
curioustechizen 26.09.2014, 12:13
quelle

3 Antworten

3

Es ist sicherlich etwas rätselhaft in Bezug auf die tatsächliche Absicht und den Anwendungsfall, in dem Sie auf dieses Problem gestoßen sind. Außerdem ist nicht ganz klar, was something , somethingElse und yetAnotherThing sind (woher sie kommen und wohin sie gehen sollen).

Basierend auf den von Ihnen zur Verfügung gestellten Informationen und als Ergänzung (oder eher Erweiterung oder Verallgemeinerung) der Antwort von slatertidan : Der Unterschied zwischen diesen Dummy-Aufrufen, die Sie dort skizziert haben, scheint

zu sein
  • Das String -Argument, das an die get -Methode
  • übergeben wird
  • Die Callback , die
  • genannt wird
  • Welche Methode wird als nächstes ausgeführt

Sie könnten diese Teile ausfiltern: Das Argument String und Callback könnten als Parameter an eine allgemeine Methode übergeben werden, die ein Callable erzeugt. Die Reihenfolge der Aufrufe könnte einfach definiert werden, indem diese Callable -Objekte in der richtigen Reihenfolge in einer Liste platziert und alle mit einem single-threaded Executor-Service ausgeführt werden.

Wie Sie in der Methode main dieses Beispiels sehen können, kann die Reihenfolge der Aufrufe dann relativ einfach konfiguriert werden:

%Vor%

(Im Beispiel wird invokeAll verwendet, das blockiert, bis alle Aufgaben ausgeführt wurden. Dies könnte anders gelöst werden, um an der Aufrufseite wirklich nicht blockierend zu sein. Die Hauptidee besteht darin, eine Liste der Aufgaben zu erstellen alle mit der gleichen Methode erstellt Aufruf)

    
Marco13 30.09.2014, 16:16
quelle
1

Spontaner Gedanke: Sie könnten die verketteten Aufrufe als Methodenparameter definieren, um Ihre Methoden wiederverwendbar zu machen. Hier ist mein Beispielcode:

%Vor%     
slartidan 26.09.2014 12:35
quelle
1

Ich unterstütze die genehmigte Antwort vollständig, aber ich werfe auch etwas ein, das ich für diese Art von Problemen erstellt habe, was praktisch ist, wenn Sie damit beginnen, bedingte Logik innerhalb Ihrer Kette von asynchronen Aktionen hinzuzufügen. Ich habe es kürzlich in eine einfache Bibliothek ( jasync-driver ) übersetzt.

So würden Sie Ihr Beispiel verkabeln. Wie Sie sehen können, hat jede Aufgabe keine Kenntnis von der folgenden Aufgabe. Im Gegensatz zu der genehmigten Antwort wird die Verkettung der Aufgaben durch einen einfachen synchronen (... schauenden) Methodenkörper anstelle einer Liste durchgeführt.

%Vor%

Hier ist eine Optimierung des Beispiels, die eine bedingte Logik enthält, die von einem asynchronen Ergebnis abhängt:

%Vor%

Wie Sie sehen, ist die asynchrone bedingte Logik so einfach wie das Schreiben einer if-Standardanweisung.

    
Ryan 19.06.2016 04:06
quelle

Tags und Links