我想知道使用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会产生什么影响?
答案 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可以改善单个请求响应时间。