2017-12-12 40 views
-3

私はVertxフレームワーク上でJavaで書いていますが、私はブロックコードに関するアーキテクチャの質問があります。複数の同期関数を非同期で実行する方法は?

{

"システム": "CD0"、

"システム": "CD1"、

"システム" Iは、10個のオブジェクトから成るようなのでJsonObject有します: "CD2"、

"システム": "CD3"、

"システム": "CD4"、

"システム": "CD5"、

"システム": "CD6"、

"システム": "CD7"、

"システム": "CD8"、

"システム「:」CD9"

}

私もJsonObjectからオブジェクトを取得し、同期機能を持っており、それにオブジェクトを送信しているときに、SOAP Webサービスを消費します。 SOAP Webサービスはコンテンツ(たとえばCD0)を取得し、数秒後にEnumを返します。 それから、そのenum値が返され、ハッシュテーブルなどのデータ変数に保存されます。

私が最終的に望むのは、すべてのJsonObjectのオブジェクトを繰り返し処理し、それぞれが並列にブロッキングコードを実行する関数です。 私はそれを並列に実行したいので、関数の呼び出しの1つが20秒待つ必要があっても、他の呼び出しを止めません。

どうすればvertxでこのようなことができますか?

p.s:私が書いた間違いを訂正していただければ幸いです。

+2

[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)を入力してください。 – vinS

+0

ExecutorServiceを使用してください。 –

+0

スレッドの聞こえます!そのことは同じことをしているようです。 –

答えて

2

rxJavaと "zip"の別々の通話を使用しない理由は何ですか? VertxはrxJavaも非常にサポートしています。

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

してからちょうど引数の一部の配列とそれを使用します:

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 
}); 

もっと違うString引数で10回同じメソッドを呼び出して、あなたはこのような何かを行うことができString別に戻ってきていると仮定すると、一般的なジップ関数とリアクティブプログラミングについて:reactivex.io

関連する問題