2012-04-04 6 views
1

У меня есть класс Action Struts2, который помещает запрос JMS Fetch для списка Trade в JMS Queue. Это сообщение JMS Fetch обрабатывается внешним процессом и может занимать несколько секунд или даже несколько минут в зависимости от количества файлов Trade, которые будут обрабатываться приложением внешней обработки задач.Struts2 JMS обработка запросов длительный процесс

Я хочу знать, как обращаться с этим HTTP-запросом с соответствующим ответом. Ожидает ли клиент, пока не вернется список торгов? (клиент (UI) должен воздействовать на него и не должен делать ничего другого).

Так я подошел это HTTP Request -> Struts2 Действие ->

  1. Вызывает Runnable для запуска в отдельном потоке (отдельно от класса действий)
  2. UI ждет
  3. Действия класс нить спит до работоспособного делает его работа
  4. Когда задача завершен, список возвращаемых торгов в UI

Flow выглядит следующим образом:

  1. Место JMS Fetch Запрос на queue1
  2. ExecutorService для Runnable

    CClass cclass = new CClass(); 
    final ExecutorService execSvc = Executors.newFixedThreadPool(1); 
    execSvc.execute(cclass); 
    

Где CClass реализует работоспособной возвращает список торгов:

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 исполнение, я делаю Thread.sleep в классе действий (чтобы позволить Runnable выполнить в отдельном потоке)

// 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 class Thread в режим сна, пока не выполнится runnable и не будет доступен tradeList.

Использование Runnable-подхода, я могу получить пару сотен записей обратно в пользовательский интерфейс, предоставив 5-й Thread.sleep() в основном классе Action, но только частично сконструированный tradeList, когда тысячи записей должны быть извлечены и показаны в UI.

Это явно не отказоустойчивый подход.

Любой лучший подход к предложению? Просьба разъяснить шаги для обработки в одном полном запросе - поток ответов.

ответ

0

Да, при составлении стандартного HTTP-запроса существует гораздо лучший подход (с помощью ajax вы можете делать другие вещи).

Вы хотите посмотреть Struts2 Execute and Wait Interceptor который имеет большую часть функциональности, которую вы уже реализовали. Также посмотрите на токен-перехватчик ... который может быть полезен (он предотвращает дублирование запросов, но не обеспечивает счастливого экрана ожидания, такого как exec и wait does).

Смежные вопросы