4

1つのメソッドから約15の異なるwebserivce呼び出しを行う必要があるstipes(java)web-appがあります。例えば: ...

    public Resolution userProfile()
    {
        serviceOneCall();
        serviceTwoCall();
        serviceThreeCall();
        serviceFourCall();
        ....
        serviceTenCall();

        return new RedirectResolution("profiel.jsp");
    }

これらはすべて並行して呼び出すことができ、相互に依存していません。これらの呼び出しのほとんどすべてが行っていることの1つは、セッションにデータを配置することです。1つまたは2つは、セッションにある同じオブジェクトにデータを配置する可能性があるため、スレッドセーフがおそらく問題になります。

誰かがこれらすべてを同時に呼び出す良い方法を提案できますか?

4

3 に答える 3

5

ExecutorServiceスレッドプールを使用して、Callable呼び出す必要のあるWSごとにを送信し、同時変更の可能性があるときに更新されるオブジェクトで同期します。

の管理を容易にするために、 Guavaの同時拡張機能を使用することもできますFuture。たとえば、Futures.allAsList()これを使用すると、がに変換List<Future<T>>されるため、すべての回答を待つために行う必要Future<List<T>>があるのは1つだけです。get()

于 2012-09-13T20:14:53.077 に答える
5

この作業を並行して行うためのすべてのソリューションには、新しいスレッドを生成するか、リモートネットワーク呼び出しが発生するスレッドプールにジョブを送信することが含まれます。

スレッドセーフの問題を回避する良い方法は、(またはメソッドのいずれかに)のexecutorServiceサブクラスを使用して送信し、Callablesに応答値を返すようにすることです。このようにして、最初のメソッドは、各呼び出しの戻り値を処理し、セッションで応答を設定するか、他のオブジェクトを更新するかを選択できます。この作業は別のスレッドで発生します。Callable<T>submit(Callable)invokeAll(Collection<Callable>)

したがって、基本的なアルゴリズム:

  1. Callable<T>これらの各呼び出しをサブクラスのexecutorServiceに送信します
  2. Future<T>executorServiceから返されるsを収集します
  3. 応答が得られるまでブロックするようにそれぞれを呼び出しFuture.get()てから、メインスレッドに戻って希望する方法で応答を処理します
于 2012-09-13T20:16:52.047 に答える
-2
for (i = 0; i <= numOfServiceCalls; i++) {
    new Thread(new Runnable() {
        switch(i) {
            case 1 : serviceOneCall();
                     break();
            case 2 : serviceTwoCall();
                     break();
            // Keep going with as many cases as you have.
        }
    });
}
于 2012-09-13T19:56:55.340 に答える