spring - Spring Boot @Async 方法*有时*未调用
问题描述
我的 Spring Boot 应用程序提供了以下 REST 控制器,它调用Service
. 其中一种方法带有注释,@Async
因此它应该异步运行。
主应用程序类用@EnableAsync
.
我观察到的问题是:基本上,执行的是异步方法。我可以在生产系统中看到相应的日志条目。但似乎有时async 方法没有被调用。数据库中有一些文件 ID 没有出现在日志中。
您知道何时会发生这种行为吗?
休息控制器
@PostMapping(consumes = MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Void> uploadDocument(@RequestParam("file") MultipartFile multipartFile) {
long fileId = fileService.save(multipartFile);
file.generateThumbnail(fileId);
return ResponseEntity.ok().build();
}
文件服务
@Transactional
public long save(MultipartFile multipartFile) {
// saves the file...
return fileId;
}
@Async
@Transactional
public void generateThumbnail(long fileId) {
// generate thumbnail
log.info("Starting thumbnail generation for fileId {}", fileId);
file.setThumbnailId(thumbnailId);
}
解决方案
从 FileService 调用异步方法不能作为异步工作。您必须为异步方法创建另一个服务并从您的服务中调用它。
原因:
自调用——从同一个类中调用异步方法——将不起作用该方法需要是公共的,以便它可以被代理。而自调用也不起作用,因为它绕过了代理,直接调用了底层方法。
推荐阅读
- amazon-web-services - 如何在 AWS 云形成中引用嵌套堆栈资源?
- ios - 在另一个圆形 UIView 中移动一个圆形 UIView
- python - Scikit-fuzzy 得到错误引发 ValueError("Unexpected input: " + key)
- python - 如何将 tensorflow.keras 模型移动到 GPU
- reactjs - 将 app.js 从 create-react-app 转换为 react native,得到错误 Invariant Violation
- python - 带有早期条件检查的列表理解
- json - 使用 apoc.periodic.commit 将无尽的 json 流插入 neo4j
- html - 按下“JSON 删除按钮”后,数据会在几秒钟后重新出现
- javascript - 如何同时使用两个 onkeydown 事件?
- npm - 抑制单行多命令 Makefile 配方的输出