1

JSF を使用する Web アプリケーションでは、フロント エンドから (チェック ボックスを使用して) 選択された 100 レコードがあり、ボタンをクリックすると、選択された 100 レコードを開始する必要があります (RESTAPI 呼び出しを使用して調査を作成します)。 REST API 呼び出しを行う Bean のメソッドを呼び出します。

現在、各レコードは順番に処理され、各レコードは平均で 20 秒かかります。そのため、100 近くのレコードを選択すると、リクエスト タイムアウトが発生します。スレッドを使用して Bean でメソッドを呼び出す予定です。どうすればよいか教えてください。Bean 内のメソッドは、参照番号をパラメーターとして受け取るinitializereview です。

4

1 に答える 1

4

マネージド Bean は、最終的には POJO です。したがって、あなたの問題は、複数のスレッドを使用して異なるオブジェクトに対して同様のタスクを実行する方法に要約されるため、最終的にはJSF の問題ではなくJavaの問題です。このためには、ExecutorServiceインターフェースを使用する必要があります。これを実現するための簡単な例:

@ManagedBean
@RequestScoped
public class SomeBean {
    List<String> records;
    //other fields, constructor, getters and setters...
    public void foo() {
        int poolSize = records.size();
        ExecutorService executor = Executors.newFixedThreadPool(poolSize);
        for (final String record : records) {
            executor.execute(new Runnable() {
                public void run() {
                    //tasks to perform in the threads...
                }
            });
        }
        executor.shutdown();
    }
}

この例の注意事項:

  • poolSize実行するrecords.size()作業ごとにスレッドを作成する例としてこれを使用しました。サーバーがサポートする数のスレッドを作成する必要があることに注意してください。この変数の実際の値は、テストの結果によって異なります。初期値として 10 を使用し、それを変更してパフォーマンス結果を測定することをお勧めします。
  • Runnable匿名クラスを作成する代わりに、達成したいタスクを保持するインターフェイスを実装するクラスを作成できます。

これは可能な解決策であることに注意してください。IMO は、たとえば JMS 呼び出しを介して、レコードのリストをそれらを処理するコンポーネントに送信する方がよいでしょう。次に、コンポーネントは安静サービスを呼び出し、レコードを処理するために必要なその他のことを行います。

于 2013-10-26T19:24:50.877 に答える