28

我想知道在 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";
        }
    };
}

我对何时使用什么感到困惑。一起使用异步 servlet/controller 和 spring @Async 会有什么影响?

4

2 回答 2

26

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

摘抄:

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

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

callable 也是 Runnable 的替代品,从某种意义上说,它可以返回结果并抛出已检查的异常。

说你有一个方法

public String aMethod(){

}

这可以通过简单地返回一个 Callable 接口来实现异步。

public Callable<String>  aMethod(){

}
于 2013-06-18T18:53:19.067 回答
0

使用 Callable 接口并不能提高单个请求的性能,在某些情况下它有助于接收更多请求。如果您的响应类型为 void,您可以使用 runnable 而不是 callable,因此使用 runnable 可以提高单个请求的响应时间。

于 2016-08-30T08:59:35.973 回答