何时使用 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 如果我需要异步执行任务并且需要立即获取taskId
(String
代表任务的注册,这有助于用户跟踪任务的进度),鉴于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的区别?
何时在 async 或 packaged_task 上使用 promise?
何时更喜欢 lambda 而不是带有 std::async 的打包任务? [复制]
SQL SERVER ENTERPRISE EDITION-CORE VS SERVER+CAL – DEMO ON DIFFERENCES