Struts2 JMS请求处理长时间运行的进程

时间:2012-04-04 08:43:45

标签: struts2 jms long-running-processes

我有一个Struts2 Action类,它为JMS队列中的Trade列表放置JMS Fetch请求。此JMS Fetch消息由外部进程处理,可能需要几秒钟甚至几分钟,具体取决于外部任务处理应用程序要处理的Trade文件的数量。

我想知道如何使用适当的响应处理此HTTP请求。客户端是否等到返回交易列表? (客户端(UI)必须对其执行操作,并且没有其他任何操作)。

我接近它的方式是 HTTP请求 - >      Struts2动作 - >

  1. 调用Runnable以在单独的Thread(与Action类分开)中运行
  2. UI等待
  3. 动作类线程睡眠直到runnable完成它的工作
  4. 任务完成后,将交易列表返回给用户界面
  5. 流程如下:

    1. 在Queue1上放置JMS抓取请求
    2. Runnable的ExecutorService

      CClass cclass = new CClass();
      final ExecutorService execSvc = Executors.newFixedThreadPool(1);
      execSvc.execute(cclass);
      
    3. CClass实现runnable返回交易列表:

      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();
      }
      

      虽然这个runnable正在执行,但我在Action类中执行Thread.sleep(让Runnable在单独的Thread中执行)

       // In Action class    
        try {
              Thread.sleep(5000); // some time till when the runnable will get executed
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          execSvc.shutdown();
      

      问题是如果我将Callable与FutureTask一起使用并执行get(),那将阻塞直到返回任何结果。如果我执行Runnable,我必须将Action类Thread置于睡眠状态,直到runnable执行并且tradeList可用。

      使用Runnable方法,我可以将几百条记录返回到UI,在主Action类中提供5秒Thread.sleep(),但只有部分构造的tradeList才能获取数千条记录并在UI中显示。

      这显然不是一种防故​​障方法。

      任何更好的建议方法?请在一个完整的请求中阐明处理的步骤 - 响应流程。

1 个答案:

答案 0 :(得分:0)

是的,在制作标准HTTP请求时有更好的方法(使用ajax可以做其他事情)。

您想要查看Struts2 Execute and Wait Interceptor,它具有您已经实现的大部分功能。还要看一下令牌拦截器......这可能很有用(它可以防止重复请求,但是不提供像exec这样的快乐等待屏幕,等待呢)。