我有一个当前正在正常访问的Spring控制器,但是我想以这样的方式更改实现:如果控制器执行的任务需要超过定义的时间,例如10秒,那么控制器可以响应一个“你的请求正被处理消息”给调用者,但如果方法在时间内返回,那么响应从控制器传递给调用方法,换句话说,我想从Spring控制器定时异步执行。
注意:这不完全是TaskExecutor域(至少根据我的理解),因为我不想只是将执行交给TaskExecutor并立即返回。
我使用Spring 3.0和Java 1.5并且控制器没有视图,我只想将输出直接写入流,调用客户端期望。
答案 0 :(得分:6)
嗯,是 TaskExecutor
域名。在您的控制器中,只需将处理逻辑包装在Callable
中,将其提交到AsyncTaskExecutor
并等待最多10秒钟。就是这样!
final Future<ModelAndView> future = asyncTaskExecutor.submit(new Callable<ModelAndView>() {
@Override
public ModelAndView call() throws Exception {
//lengthy computations...
return new ModelAndView("done");
}
});
try {
return future.get(10, TimeUnit.SECONDS);
} catch (TimeoutException e) {
return new ModelAndView("timeout");
}
当然这有点讨厌,特别是当它在一个控制器中出现不止一次时。如果是这种情况,您应该看看servlet 3.0异步支持(见下文)。