我有一个Struts2 Action类,它为JMS队列中的Trade列表放置JMS Fetch请求。此JMS Fetch消息由外部进程处理,可能需要几秒钟甚至几分钟,具体取决于外部任务处理应用程序要处理的Trade文件的数量。
我想知道如何使用适当的响应处理此HTTP请求。客户端是否等到返回交易列表? (客户端(UI)必须对其执行操作,并且没有其他任何操作)。
我接近它的方式是 HTTP请求 - > Struts2动作 - >
流程如下:
Runnable的ExecutorService
CClass cclass = new CClass();
final ExecutorService execSvc = Executors.newFixedThreadPool(1);
execSvc.execute(cclass);
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中显示。
这显然不是一种防故障方法。
任何更好的建议方法?请在一个完整的请求中阐明处理的步骤 - 响应流程。
答案 0 :(得分:0)
是的,在制作标准HTTP请求时有更好的方法(使用ajax可以做其他事情)。
您想要查看Struts2 Execute and Wait Interceptor,它具有您已经实现的大部分功能。还要看一下令牌拦截器......这可能很有用(它可以防止重复请求,但是不提供像exec这样的快乐等待屏幕,等待呢)。