java - spring boot rest api上的异步-注释应仅在服务上或控制器上
问题描述
我必须在 Spring Boot 中实现一个具有异步功能的方法:
我对注释异步的位置有点困惑,基本上我的休息控制器如下:
@RestController
@RequestMapping("/email")
public class EmailController {
public @ResponseBody ResponseEntity<String> sendMailCon(@RequestBody EmailRequestDto emailRequestDto) {
LOG.debug("calling method sendMail from controller ");
//do complex stuff
sendMailService.sendEmail(emailRequestDto);
return new ResponseEntity<>("Mail has been sent successfully", HttpStatus.OK);
}
服务类如下:
@Component
public class SendMailServiceImpl implements SendMailService {
private static final Logger LOG = LoggerFactory.getLogger(SendMailServiceImpl.class);
@Autowired
private JavaMailSender javaMailSender;
@Override
@Async("threadPoolExecutor")
public void sendEmail(EmailRequestDto emailRequestDto) {
LOG.debug("calling method sendMail do complex stuff");
...
}
我已按如下方式配置了我的异步 bean:
@EnableAsync
@Configuration
public class AsyncConfig {
@Bean(name = "threadPoolExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(25);
executor.setQueueCapacity(100);
executor.initialize();
return executor;
}
我的问题是 SendMailServiceImpl 上的注释 @Async 是正确的还是我需要将它添加到控制器的方法 sendMailCon 中?
解决方案
基本上@Async
会使方法在单独的线程中执行,即调用者不会等待被调用方法的完成。对服务器的每个请求都已经由单独的线程提供服务,因此您无需提供@Async
控制器方法。
您可以将其保留在服务层或更好的另一层,您实际上需要异步执行该方法。在您的情况下,您实际上可以将方法保持为异步,您使用休息模板来触发邮件。如果您不这样做没有另一个类,可以将服务层方法保持为异步。
推荐阅读
- apache-kafka - 分区中 Kafka 处理期间致命技术错误的推荐方法
- azure-devops - 无法使用 REST API 向工作项添加评论
- php - require() 报告不存在这样的目录,但 file_exists 在完全相同的路径上返回 true
- r - 用于比较 R 中的两个数据帧的 FOR 循环优化
- laravel - Laravel 编辑路线不起作用..404 未找到错误
- python - 如何在 Django 中捕获 CSRF 错误
- r - 在 R 中计算具有类间隔的分组数据的描述性统计量
- javascript - 将对象内对象中的布尔值替换为数组的值
- javascript - 在 TypeScript 文件上使用 jest 运行测试时,Babel 无法识别 TypeScript 语法
- azure - Azure 函数和 WebJob - 计时器触发时的奇怪行为