Tomcat で JSF 2 と Weld Cdi を使用して Web フロントエンドを開発しています。
現在、リクエスト時間を最適化するために複数の Web サービスを並行して実行する際に問題が発生しています。
ユーザーは、リストから複数の項目を選択できます。
選択された項目ごとに、リスト キーをパラメーターとして使用して、プロセスが 1 つの Web サービスからその情報を収集します。
私の現在のアプローチは、Bean に注入される Web サービス ポート インターフェイスを返す Producer を使用することです。Bean は、選択されたキーごとにループでこの Web サービスを呼び出します。
@Inject
private WSAnzeigeAssetsummen serviceAccess;
:
for ( Integer pfNr : sessionKeys.getPfnrList() ) {
summaryTable = serviceAccess.execute(snr, pfnr, requestType, "", desiredRows, userName);
processResult(summaryTable):
}
高速化するために、Future を返す ExecutorService と必要な数のワーカーを使用しようとしました。
この構成の問題は、ワーカーにサービス ポートを挿入できないことです。これは、ワーカーが管理されていないためです。サービス ポートを手動で作成することは機能しますが、プロデューサー クラスを無視するため、高く評価されません。
また、テスト時に、定義済みの結果セットを提供するダミーのサービス ポートを挿入することはできません。
tomcat-weld 環境での並列実行について何も見つからなかったので、私のアプローチに何か問題があるに違いありません。
このような状況を解決するための正しいアプローチは何ですか?
編集:私が試したことをより明確にするために...
public class DataCollector implements ISumRequest<Integer, Integer, String, FutureResult> {
ExecutorService pool = Executors.newCachedThreadPool();
@Inject
SessionBean sessionBean;
public Future<FutureResult> collectInformation(Integer snr, Integer pfnr, String requestType) {
CollectWorker worker = new CollectWorker (snr,pfnr,requestType,sessionBean.getUserName());
return pool.submit(worker);
}
}
このようにすると、ワーカーは管理されません。