簡體   English   中英

Spring 引導@Async 方法*有時*未調用

[英]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 中調用異步方法——不起作用該方法需要公開,以便它可以被代理。 而自調用也不起作用,因為它繞過了代理,直接調用了底層方法。

資源: https://www.baeldung.com/spring-async

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM