[英]Spring Boot @Async method *sometimes* not invoked
我的 Spring 引導應用程序提供了以下 REST controller 調用Service
的兩種方法。 其中一種方法使用@Async
注釋,因此它應該異步運行。
主要應用程序 class 使用@EnableAsync
進行注釋。
我觀察到的問題是:基本上,執行的是異步方法。 我可以在生產系統中看到相應的日志條目。 但似乎有時async 方法沒有被調用。 數據庫中有一些文件 ID 沒有出現在日志中。
您知道何時會發生這種行為嗎?
REST controller
@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 調用異步方法不能作為異步工作。 您必須為異步方法創建另一個服務並從您的服務中調用它。
原因:
自調用——從同一個 class 中調用異步方法——不起作用該方法需要公開,以便它可以被代理。 而自調用也不起作用,因為它繞過了代理,直接調用了底層方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.