Java Webアプリで長いタスク(ユーザーによってトリガーされ、そのユーザーのみ)を実行する最良の方法は何ですか? ejb @Asynchronous および jax-ws 非同期 (ポーリング) 呼び出しを使用してみましたが、それらが返す Future<?> はシリアル化できず、HttpSession に格納できませんでした (完了時に後で結果を取得するため)。Java Web 環境で並行 Future<?> を使用する簡単な方法はありますか、それとも本格的なジョブ管理フレームワークを使用する必要がありますか?
質問する
1115 次
3 に答える
3
これまでの最善の解決策は、アプリケーション スコープの Map<SessionId, List<Future<?>>> を使用することでした。これは、スティッキー セッションを使用するクラスターで機能し、JMS キューを使用したり、結果をデータベースに格納したりする必要はありません。
于 2013-03-21T14:38:59.607 に答える
2
JMS を使用するのが最善です。MDB がそのキュー / トピックをリッスンするキュー / トピックにメッセージを送信する非同期のメッセージング ソリューションを実装し、メッセージの到着時にトリガーされてオフラインで長いタスクを実行します。
http://www.javablogging.com/simple-guide-to-Java-message-service-jms-using-activemq/
于 2012-05-08T10:11:59.207 に答える
1
プロセスが結果を生成することになっており、プロセスに時間がかかることが予想される場合、おそらく最良の方法は、2 つの別々の呼び出しを行うことです。
- 最初にプロセスをトリガーし、一意のプロセス識別子を返すもの
- プロセス識別子を使用して結果を取得するための 2 つ目
したがって、全体的なプロセス フローは次のようになります。
- クライアント コール バック エンド サービス。
- バックエンド サービスは、一意の ID を使用して非同期プロセスを開始し、一意の ID をクライアントにすぐに返します。
- 非同期プロセスは、結果をセッションまたは他のより永続的なメカニズム (データベース、ファイルなど) に保持します。
- 一意の ID を持つクライアント側のポーリング サーバー
- 取得メソッドは、存在する場合は結果を返し、存在しない場合は未完了メッセージを返します
于 2012-05-08T10:46:52.527 に答える