2017-12-12 1 views
-3

Ich schreibe in Java auf dem Vertex-Framework, und ich habe eine Architekturfrage bezüglich des Blockierens von Code. Ich habe ein JsonObject, die aus 10 Objekten bestehen, etwa so:Wie kann man mehrere synchrone Funktionen asynchron ausführen?

{

"System": "CD0"

"System": "CD1"

"System" : "CD2",

"System": "CD3",

"System": "CD4",

"System": "CD5"

"System": "CD6"

"System": "CD7"

"System": "CD8"

" System „:“ CD9"

}

ich habe auch eine synchrone Funktion, die ein Objekt aus dem JsonObject bekommt und verbraucht einen Web Service SOAP, während das Objekt, um es zu senden. Der SOAP-Webdienst ruft den Inhalt (z. B. CD0) ab und gibt nach einigen Sekunden eine Enum-Nummer zurück. Ich möchte dann den zurückgegebenen enum-Wert übernehmen und in einer Art Datenvariablen speichern (wie Hash-Tabelle).

Was ich letztlich möchte, ist eine Funktion, die über alle JsonObject-Objekte iterieren wird, und für jede einzelne den Blockierungscode parallel ausführen. Ich möchte es parallel laufen, so dass selbst wenn einer der Aufrufe an die Funktion 20 Sekunden warten muss, wird es nicht die anderen Anrufe stecken.

Wie kann ich so etwas in Vertex tun?

p.s: Ich werde schätzen, wenn Sie Fehler korrigieren werden, die ich schrieb.

+2

Bitte liefern Sie [Minimal, vollständige und überprüfbare Beispiel] (https://stackoverflow.com/help/mcve) – vinS

+0

Verwenden Sie eine 'ExecutorService'. –

+0

Gehört von Threads.! es scheint dasselbe zu tun. –

Antwort

2

Warum nicht rxJava verwenden und "zip" separate Anrufe? Vertex unterstützt auch rxJava sehr. Unter der Annahme, dass Sie 10-mal gleiche Methode mit unterschiedlichem String Argumente fordern und anderen String Rückkehr Sie so etwas tun könnte:

private Single<String> callWs(String arg) { 
    return Single.fromCallable(() -> { 
     //DO CALL WS 
     return "yourResult"; 
    }); 
} 

und dann ist es nur mit einigen Array von Argumenten zu verwenden:

String[] array = new String[10]; //get your arguments 

List<Single<String>> wsCalls = new ArrayList<>(); 
for (String s : array) { 
    wsCalls.add(callWs(s)); 
} 
Single.zip(wsCalls, r -> r).subscribe(allYourResults -> { 
    // do whatever you like with resutls 
}); 

Mehr über Zip-Funktion und reaktive Programmierung im Allgemeinen: reactivex.io

Verwandte Themen