何时使用Spring @Async vs Callable控制器(异步控制器,servlet 3)

时间:2013-06-18 10:50:06

标签: spring asynchronous callable

我想知道使用Callable在Spring中使用@Async和Servlet 3异步请求实现的一般用例。

据我所知,@ Async用于使任何方法(特别是任何服务方法)异步执行。

@Async
void doSomething(String s) {
// this will be executed asynchronously
}

以及任何返回Callable

的控制器
  @RequestMapping("/view")
public Callable<String> callableWithView(final Model model) {
    return new Callable<String>() {
        @Override
        public String call() throws Exception {
            Thread.sleep(2000);
            model.addAttribute("foo", "bar");
            model.addAttribute("fruit", "apple");
            return "views/html";
        }
    };
}

我很困惑什么时候使用什么。使用异步servlet /控制器和spring @Async会产生什么影响?

2 个答案:

答案 0 :(得分:19)

This帖子有您要找的内容的解释

摘录:

  

在某些情况下,您可以在a时立即返回客户端   后台工作完成处理。例如发送电子邮件,   启动数据库作业,其他人代表 fire-and-forget   可以使用Spring的@Async支持或通过   将事件发布到Spring Integration通道,然后返回一个   客户端可以用来查询结果的确认ID。

Callable返回类型使控制器方法异步。这通常用于长轮询等情况。有关详细信息,请阅读同一作者的this帖子。

同样可调用是Runnable的替代方法,在某种意义上,它可以返回结果并抛出已检查的异常。

假设您有方法

public String aMethod(){

}

只需返回Callable接口即可使其异步。

public Callable<String>  aMethod(){

}

答案 1 :(得分:0)

使用Callable接口无法提高单个请求性能,在某些情况下有助于获取更多请求。如果您的响应类型无效,则可以使用runnable而不是callable,因此使用runnable可以改善单个请求响应时间。