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

Posted

技术标签:

【中文标题】何时使用 Spring @Async vs Callable 控制器(异步控制器,servlet 3)【英文标题】:When to use Spring @Async vs Callable controller (async controller, servlet 3) 【发布时间】:2013-06-14 13:23:30 【问题描述】:

我想知道使用 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";
        
    ;

我对何时使用什么感到困惑。 Asynchronous servlet/controller 和 spring @Async 一起使用会有什么效果?

【问题讨论】:

【参考方案1】:

This 帖子解释了您要查找的内容

摘录:

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

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

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

说你有一个方法

public String aMethod()


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

public Callable<String>  aMethod()


【讨论】:

第一篇文章的链接已损坏 您好,感谢您告诉我。我已经更新了链接。希望对您有所帮助。 @shazinltc 如果我需要异步执行任务并且需要立即获取taskIdString 代表任务的注册,这有助于用户跟踪任务的进度),鉴于taskId 必须在使用@Async 注释的方法中生成,而不是由调用者生成,我该如何实现? 自从我从事这项工作以来已经快两年了,所以现在什么都没有。对此非常抱歉。如果我有时间,我会调查并回复你。 @WebUser 您需要在调用 @Async 之前生成 trackId 并将此 trackId 传递给 async 方法。例如,此 trackId 可以是 UUID。【参考方案2】:

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

【讨论】:

以上是关于何时使用 Spring @Async vs Callable 控制器(异步控制器,servlet 3)的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud config server vs consul的区别?

何时使用promises或async等待? [重复]

何时在 async 或 packaged_task 上使用 promise?

何时更喜欢 lambda 而不是带有 std::async 的打包任务? [复制]

SQL SERVER ENTERPRISE EDITION-CORE VS SERVER+CAL – DEMO ON DIFFERENCES

私有继承 VS 组合:何时使用哪个?