何时使用Spring@Async vs Callable controller(异步控制器,servlet 3)
我想知道在Spring中使用Callable实现@Async和Servlet 3异步请求的一般用例 据我所知,@Async用于使任何方法(特别是任何服务方法)异步执行何时使用Spring@Async vs Callable controller(异步控制器,servlet 3),spring,spring-mvc,asynchronous,callable,Spring,Spring Mvc,Asynchronous,Callable,我想知道在Spring中使用Callable实现@Async和Servlet 3异步请求的一般用例 据我所知,@Async用于使任何方法(特别是任何服务方法)异步执行 @Async void doSomething(String s) { // this will be executed asynchronously } 以及任何返回Callable的控制器 @RequestMapping("/view") public Callable<String> callableWit
@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";
}
};
}
@RequestMapping(“/view”)
公共可调用callableWithView(最终模型){
返回新的可调用(){
@凌驾
公共字符串调用()引发异常{
《睡眠》(2000年);
addAttribute(“foo”、“bar”);
添加属性(“水果”、“苹果”);
返回“视图/html”;
}
};
}
我不知道什么时候用什么。将异步servlet/controller与spring@Async一起使用会产生什么效果?文章解释了您要寻找的内容
摘录:
在某些情况下,您可以在
后台作业完成处理。例如发送电子邮件,
启动一个数据库作业,而其他的则代表着“火与忘”
可以通过Spring的@Async
支持或
将事件发布到Spring集成频道,然后返回
客户端可用于查询结果的确认id
可调用的返回类型使控制器方法异步。这通常用于长轮询等情况。更多信息,请阅读同一作者的文章
此外,callable是Runnable的一种替代方法,从某种意义上说,它可以返回结果并抛出已检查的异常
说你有办法
public String aMethod(){
}
这可以通过简单地返回一个可调用接口来实现异步
public Callable<String> aMethod(){
}
public可调用的aMethod(){
}
使用可调用接口无法提高单请求性能,在某些情况下,接受更多请求会有所帮助。如果您的响应类型为void,您可以使用runnable而不是callable,因此使用runnable可以缩短单个请求的响应时间。第一篇文章的链接已断开,谢谢您让我知道。我已经更新了链接。希望有帮助。@shazinltc如果我需要异步执行任务,并且需要立即获得任务ID
(表示任务注册的字符串,帮助用户跟踪任务进度),考虑到taskId
必须由@Async
注释的方法生成,而不是由调用程序生成,我该如何实现这一点呢?我研究这一点已经快两年了,所以现在脑子里什么都没有。非常抱歉。如果我有时间,我会调查一下并给你回电。@WebUser在调用@Async
并将这个trackId传递给Async方法之前,你需要生成trackId。例如,这个trackId可以是UUID。