计算Spring中控制器/方法的执行时间

时间:2011-10-05 15:25:31

标签: spring spring-mvc task asynchronous

我有一个当前正在正常访问的Spring控制器,但是我想以这样的方式更改实现:如果控制器执行的任务需要超过定义的时间,例如10秒,那么控制器可以响应一个“你的请求正被处理消息”给调用者,但如果方法在时间内返回,那么响应从控制器传递给调用方法,换句话说,我想从Spring控制器定时异步执行。

注意:这不完全是TaskExecutor域(至少根据我的理解),因为我不想只是将执行交给TaskExecutor并立即返回。

我使用Spring 3.0和Java 1.5并且控制器没有视图,我只想将输出直接写入流,调用客户端期望。

1 个答案:

答案 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异步支持(见下文)。

进一步阅读: