簡體   English   中英

Async on spring boot rest rest api - annotation should be on service only or controller

[英]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 是否正確,或者我需要將其添加到 controller 的方法 sendMailCon 中?

你的實現是正確的。 在這種情況下,您不需要在 controller 方法上添加 @Async

基本上@Async將使方法在單獨的線程中執行,即調用者不會等待被調用方法的完成。對服務器的每個請求已經由單獨的線程提供服務,因此您無需在@Async上提供 @Async方法。

您可以將其保留在服務層或更好的另一層,您實際上需要異步執行該方法。在您的情況下,您實際上可以將方法保持為異步,您使用 rest 模板觸發郵件。如果你不這樣做沒有另一個 class 因為可以將服務層方法保持為異步。

您的代碼是正確的,@Async 使您的服務代碼在單獨的線程中執行,因此 controller 在調用服務后立即變得免費。 當您不需要從執行中返回響應時,它可以正常工作。 但是,如果您需要異步處理請求,然后收集響應以作為 REST 響應發送回調用方,那么您可以將 WebAsyncTask 與 Spring 一起使用。 請參閱下面的 URL,它解釋了異步 REST 服務的實現。 https://www.thetechnojournals.com/2019/10/asynchronous-rest-service.html

暫無
暫無

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

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