マネージド 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 呼び出しを介して、レコードのリストをそれらを処理するコンポーネントに送信する方がよいでしょう。次に、コンポーネントは安静サービスを呼び出し、レコードを処理するために必要なその他のことを行います。