Асинхронный при весенней загрузке rest api api - аннотация должна быть только на сервисе или контроллере - PullRequest
0 голосов
/ 27 сентября 2019

Мне нужно реализовать метод с асинхронными функциями при весенней загрузке:

Я немного запутался в отношении расположения асинхронных аннотаций, в основном мой контроллер покоя выглядит следующим образом:

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

Я настроил свой асинхронный компонент следующим образом:

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

Мой вопрос - аннотация @Async на SendMailServiceImpl верна, или янужно добавить его по методу sendMailCon из контроллера?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

В основном @Async заставит метод выполняться в отдельном потоке, т.е. вызывающая сторона не будет ждать завершения вызванного метода. Каждый запрос к серверу уже обслуживается отдельным потоком, поэтому вам не нужно предоставлять @Async в методе контроллера.

Вы можете оставить его на уровне обслуживания или, что еще лучше, еще на одном уровне, где вам действительно нужно, чтобы метод выполнялся асинхронно. В вашем случае вы могли бы фактически сохранить метод как асинхронный, гдеВы используете шаблон rest для запуска почты. Если у вас нет другого класса, для этого можно оставить метод уровня обслуживания как Async.

Read

0 голосов
/ 27 сентября 2019

Ваша реализация верна.В этом случае вам не нужно добавлять @Async в метод контроллера

...