java - 线程提交任务,不等待春天完成
问题描述
我正在编写一个服务,我想公开一个将调用另一个服务的端点,如果服务调用成功,那么我想将结果发送回 UI/调用应用程序。
在发回响应之前并行,我想执行/提交一个应该在后台运行的任务,我的调用不应该依赖于这个任务的成功或失败。
在返回回复之前,我想做的 -
executorService.execute(object);
这不应该是阻塞调用..
任何建议
解决方案
正如评论中所建议的那样,Spring Async 方法是这里的方法。
一些警告:
异步方法可以有不同的返回类型,它们确实可以返回 CompletableFuture 但这是以防万一,如果您从某个后台进程调用它们并希望等待/检查它们的执行状态,或者可能在未来准备好时执行其他操作. 在您的情况下,您似乎想要“即发即弃”的行为。因此,您应该为带注释的方法使用
void
返回类型。@Async
确保您放置
@EnableAsync
. 在这种情况下,它的工作方式是将具有@Async
某种代理方法的 bean 包装起来,因此代理实际上被注入到您的服务中。所以@EnableAsync
开启了这个代理生成机制。您可以在调试器中验证通常情况是否如此,并检查注入的引用对象的实际类型。考虑自定义任务执行器,以确保您使用符合您需求的执行器运行异步方法。例如,您可能不希望每次调用 async 方法都会产生一个新线程(并且有一个行为类似这样的执行程序)。例如,您可以在此处阅读有关各种执行者的信息
更新
在代码方面,您应该执行以下操作:
public class MyAsyncHandler {
@Async
public void doAsyncJob(...) {
...
}
}
@Service
public class MyService {
@Autowired // or autowired constructor
private MyAsyncHandler asyncHandler;
public Result doMyMainJob(params) {
dao.saveInDB();
// do other synchronous stuff
Result res = prepareResult();
asyncHandler.doAsyncJob(); // this returns immediately
return res;
}
}
推荐阅读
- java - 为什么 Maven 不编译 Guava Table 代码而 Eclipse 编译器编译?(推断类型不符合上限)
- html - 如何始终显示 HTML 文件并在其中嵌入新页面?
- typescript - 侧边菜单 (.tsx),反应原生
- sql - 获取有条件的数据
- groovy - 从 jmeter 请求正文中捕获动态值并在同一
- python - Write all values in one line csv.DictWriter
- python - 如何注释采用可变长度元组的函数?(可变元组类型注释)
- javascript - 通过调用 C# 代码的 JS 更新 Blazor
- c# - System.Net.WebException - 内部服务器错误 500
- jquery - 如何移动显示答案的输入字段