首页 > 解决方案 > 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);
}

标签: springspring-boot

解决方案


从 FileService 调用异步方法不能作为异步工作。您必须为异步方法创建另一个服务并从您的服务中调用它。

原因:

自调用——从同一个类中调用异步方法——将不起作用该方法需要是公共的,以便它可以被代理。而自调用也不起作用,因为它绕过了代理,直接调用了底层方法。

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


推荐阅读