Async on spring boot rest rest api - 注释应该只在服务或控制器上
Async on spring boot rest rest api - annotation should be on service only or controller
我必须在 spring 引导中实现具有异步功能的方法:
对于注解asyn的位置我有点迷糊,基本上我的rest controller是这样的:
@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);
}
而服务class如下:
@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
将使方法在单独的线程中执行,即调用者不会等待被调用的完成 method.Each 对服务器的请求已经由单独的线程提供服务,因此您无需在控制器方法上提供 @Async
。
您可以将它保留在服务层中,或者更好的是在您实际需要执行该方法的另一层中 asynchronously.In您的情况实际上可以将方法保留为异步,其中您使用休息模板来触发mail.If 你没有另一个 class 因为它可以将服务层方法保持为异步。
您的代码是正确的,@Async 使您的服务代码在单独的线程中执行,因此控制器在调用服务后立即变得空闲。当您不需要 return 执行响应时,它工作正常。但是,如果您需要异步处理请求,然后收集响应以作为 REST 响应发送回调用者,那么您可以将 WebAsyncTask 与 Spring 一起使用。请参阅下面的 URL,其中解释了异步 REST 服务的实现。
https://www.thetechnojournals.com/2019/10/asynchronous-rest-service.html
我必须在 spring 引导中实现具有异步功能的方法:
对于注解asyn的位置我有点迷糊,基本上我的rest controller是这样的:
@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);
}
而服务class如下:
@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
将使方法在单独的线程中执行,即调用者不会等待被调用的完成 method.Each 对服务器的请求已经由单独的线程提供服务,因此您无需在控制器方法上提供 @Async
。
您可以将它保留在服务层中,或者更好的是在您实际需要执行该方法的另一层中 asynchronously.In您的情况实际上可以将方法保留为异步,其中您使用休息模板来触发mail.If 你没有另一个 class 因为它可以将服务层方法保持为异步。
您的代码是正确的,@Async 使您的服务代码在单独的线程中执行,因此控制器在调用服务后立即变得空闲。当您不需要 return 执行响应时,它工作正常。但是,如果您需要异步处理请求,然后收集响应以作为 REST 响应发送回调用者,那么您可以将 WebAsyncTask 与 Spring 一起使用。请参阅下面的 URL,其中解释了异步 REST 服务的实现。 https://www.thetechnojournals.com/2019/10/asynchronous-rest-service.html