2012-04-04 10 views
1

私はStruts2 Actionクラスを使用して、JMSキューにトレードリストのJMSフェッチ要求を配置しています。このJMSフェッチ・メッセージは、外部プロセスによって処理され、外部タスク処理アプリケーションによって処理されるTradeファイルの数に応じて数秒または数分かかります。Struts2 JMSリクエストの長時間処理の処理

このHTTPリクエストを適切な応答で処理する方法を知りたいと思います。取引のリストが返されるまでクライアントは待っていますか? (クライアント(UI)はそれに対処する必要があり、その間に行うことはありません)。

私はそれが HTTPリクエストで近づい道 - > Struts2のアクション - >

  1. UIが
  2. を待つ(Actionクラスとは別の)別のスレッドで実行するRunnableを呼び出しますタスクが完了すると、クラスのスレッドが実行可能になるまで寝
  3. アクションは、それがUI
に取引のリストを返し、仕事
  • ですん

    次のように流れがある:

    :JMSはRunnableを

    CClass cclass = new CClass(); 
    final ExecutorService execSvc = Executors.newFixedThreadPool(1); 
    execSvc.execute(cclass); 
    
    CClassは、取引のリストを返す実行可能な実装
  • ためQUEUE1

  • ExecutorServiceの上フェッチ要求を

    1. 場所
      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つの要求 - 応答フローで処理するステップを解明してください。

  • 答えて

    0

    はい標準のHTTPリクエストを作成する際には、はるかに優れた方法があります(他にもajaxを使用することができます)。

    Struts2 Execute and Wait Interceptorを見てみましょう。すでに実装しているほとんどの機能を備えています。また、トークンインターセプタを見てください。これは有益かもしれません(重複した要求を防ぎますが、execやwaitのようなハッピー待機画面は提供しません)。

    関連する問題