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

dev*_*hts 23 spring asynchronous callable

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

据我了解,@ Async用于使任何方法(特别是任何服务方法)异步执行.

@Async
void doSomething(String s) {
// this will be executed asynchronously
}
Run Code Online (Sandbox Code Playgroud)

以及任何返回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";
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

我很困惑,什么时候使用什么.使用异步servlet/controller和spring @Async会产生什么影响?

sha*_*ltc 19

这篇文章解释了你在寻找什么

摘抄:

在某些情况下,您可以在后台作业完成处理时立即返回客户端.例如,发送电子邮件,启动数据库作业,以及其他代表 可以通过Spring 支持或通过将事件发布到Spring Integration通道然后返回客户端可用于查询的确认ID 来处理的"即发即弃"场景@Async结果.

可调用的返回类型使控制器方法异步.这通常用于长轮询等情况.有关更多信息,请阅读同一作者的这篇文章.

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

假设你有一个方法

public String aMethod(){

}
Run Code Online (Sandbox Code Playgroud)

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

public Callable<String>  aMethod(){

}
Run Code Online (Sandbox Code Playgroud)