私はStruts2 Actionクラスを使用して、JMSキューにトレードリストのJMSフェッチ要求を配置しています。このJMSフェッチ・メッセージは、外部プロセスによって処理され、外部タスク処理アプリケーションによって処理されるTradeファイルの数に応じて数秒または数分かかります。Struts2 JMSリクエストの長時間処理の処理
このHTTPリクエストを適切な応答で処理する方法を知りたいと思います。取引のリストが返されるまでクライアントは待っていますか? (クライアント(UI)はそれに対処する必要があり、その間に行うことはありません)。
私はそれが HTTPリクエストで近づい道 - > Struts2のアクション - >
- は
- UIが を待つ(Actionクラスとは別の)別のスレッドで実行するRunnableを呼び出しますタスクが完了すると、クラスのスレッドが実行可能になるまで寝
- アクションは、それがUI
次のように流れがある:
:JMSはRunnableをCClass cclass = new CClass();
final ExecutorService execSvc = Executors.newFixedThreadPool(1);
execSvc.execute(cclass);
CClassは、取引のリストを返す実行可能な実装ためQUEUE1
ExecutorServiceの上フェッチ要求を
- 場所
List<Trade> tradesList = new ArrayList<Trade>(); @Override public void run() { while (true) { try { Message message = msgConsumer.receive(); // SYNCHRONOUS/NO MDB if (message == null){ break; } if (message instanceof TextMessage) { TextMessage txtMessage = (TextMessage) message; Trade trade = TradeBuilder.buildTradeFromInputXML(txtMessage); if (trade != null) { tradesList.add(trade); // tradeList is a CClass class variable } } } catch (JMSException e) { logger.error("JMSException occurred ", e); } } closeConnection(); }
そして、これが実行runnableisながら、私はFutureTaskで呼び出し可能に使用して取得を行う場合
// In Action class try { Thread.sleep(5000); // some time till when the runnable will get executed } catch (InterruptedException e) { e.printStackTrace(); } execSvc.shutdown();
問題がある(Runnableをは別のスレッドで実行できるようにする)ActionクラスでのThread.sleepを実行します()結果が返されるまでブロックされます。私がRunnableを実行する場合、Runnableが実行され、tradeListが利用可能になるまで、ActionクラスThreadをスリープ状態にする必要があります。
Runnableアプローチを使用すると、メインアクションクラスで5秒のThread.sleep()を与えるUIに数百のレコードを戻すことができますが、何千ものレコードがフェッチされて表示されるUI。
これは明らかに誤りではありません。
推奨する方法はありますか?完全な1つの要求 - 応答フローで処理するステップを解明してください。