1

Java Webアプリで長いタスク(ユーザーによってトリガーされ、そのユーザーのみ)を実行する最良の方法は何ですか? ejb @Asynchronous および jax-ws 非同期 (ポーリング) 呼び出しを使用してみましたが、それらが返す Future<?> はシリアル化できず、HttpSession に格納できませんでした (完了時に後で結果を取得するため)。Java Web 環境で並行 Future<?> を使用する簡単な方法はありますか、それとも本格的なジョブ管理フレームワークを使用する必要がありますか?

4

3 に答える 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/

http://docs.oracle.com/javaee/1.3/jms/tutorial/

于 2012-05-08T10:11:59.207 に答える
1

プロセスが結果を生成することになっており、プロセスに時間がかかることが予想される場合、おそらく最良の方法は、2 つの別々の呼び出しを行うことです。

  1. 最初にプロセスをトリガーし、一意のプロセス識別子を返すもの
  2. プロセス識別子を使用して結果を取得するための 2 つ目

したがって、全体的なプロセス フローは次のようになります。

  1. クライアント コール バック エンド サービス。
  2. バックエンド サービスは、一意の ID を使用して非同期プロセスを開始し、一意の ID をクライアントにすぐに返します。
  3. 非同期プロセスは、結果をセッションまたは他のより永続的なメカニズム (データベース、ファイルなど) に保持します。
  4. 一意の ID を持つクライアント側のポーリング サーバー
  5. 取得メソッドは、存在する場合は結果を返し、存在しない場合は未完了メッセージを返します
于 2012-05-08T10:46:52.527 に答える