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

何时使用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

我想知道在Spring中使用Callable实现@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";
        }
    };
}
@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。