【问题标题】:Spring Boot @Async method *sometimes* not invokedSpring Boot @Async 方法*有时*未调用
【发布时间】:2021-04-22 22:56:13
【问题描述】:

我的 Spring Boot 应用程序提供了以下 REST 控制器,它调用 Service 的两个方法。其中一种方法带有@Async 注释,因此它应该异步运行。

主应用程序类用@EnableAsync注解。

我观察到的问题是:基本上执行的是异步方法。我可以在生产系统中看到相应的日志条目。但似乎有时异步方法没有被调用。数据库中有文件 ID 没有出现在日志中。

您知道什么时候会发生这种行为吗?

REST 控制器

@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);
}

【问题讨论】:

  • 如何在generateThumbnail中获得file

标签: spring spring-boot


【解决方案1】:

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

原因:

自调用——在同一个类中调用异步方法 – 不起作用该方法需要公开才能被代理。 并且自调用不起作用,因为它绕过了代理和 直接调用底层方法。

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

【讨论】:

  • generateThumbnail 不是从同一个类调用的。
  • 正如@SarvarNishonboyev 提到的,generateThumbnail 方法是从控制器类调用的。因此,它不是从同一个服务调用的。
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2018-11-09
  • 2019-05-05
  • 2018-08-15
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多