У меня есть класс Action Struts2, который помещает запрос JMS Fetch для списка Trade в JMS Queue. Это сообщение JMS Fetch обрабатывается внешним процессом и может занимать несколько секунд или даже несколько минут в зависимости от количества файлов Trade, которые будут обрабатываться приложением внешней обработки задач.Struts2 JMS обработка запросов длительный процесс
Я хочу знать, как обращаться с этим HTTP-запросом с соответствующим ответом. Ожидает ли клиент, пока не вернется список торгов? (клиент (UI) должен воздействовать на него и не должен делать ничего другого).
Так я подошел это HTTP Request -> Struts2 Действие ->
- Вызывает Runnable для запуска в отдельном потоке (отдельно от класса действий)
- UI ждет
- Действия класс нить спит до работоспособного делает его работа
- Когда задача завершен, список возвращаемых торгов в UI
Flow выглядит следующим образом:
- Место JMS Fetch Запрос на queue1
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.
Это явно не отказоустойчивый подход.
Любой лучший подход к предложению? Просьба разъяснить шаги для обработки в одном полном запросе - поток ответов.