Использование Java Executor Service в онлайн-приложении - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть одна функциональность в онлайн-приложении.Мне нужно отправить квитанцию ​​по почте клиенту после генерации квитанции.Моя проблема в том, что функция почты занимает больше времени, около 20-30 секунд, клиент не мог долго ждать во время онлайн транзакции.

Поэтому я использовал java ExecutorService для независимого запуска почтовой службы [sendMail] и возврата ответа PAGE клиенту, отправлена ​​ли почта или нет.

Правильно ли использовать ExecutorService в онлайн-приложении [запрос Http& Отклик].Ниже мой код.Добрый совет.

@RequestMapping(value="/generateReceipt",method=RequestMethod.GET)
public @ResponseBody ReceiptBean generateReceipt(HttpServletRequest httpRequest,HttpServletResponse httpResponse) {

// Other codes here 
...
...

I need run below line independently, since it takes more time. so commeneted and wrote executor service
//mailService.sendMail(httpRequest,  httpResponse, receiptBean);

java.util.concurrent.ExecutorService executorService = java.util.concurrent.Executors.newFixedThreadPool(10);
executorService.execute(new Runnable() {
    ReceiptBean receiptBean1;
    public void run() {
        mailService.sendMail(httpRequest,  httpResponse, receiptBean);
    }
    public Runnable init(ReceiptBean receiptBean) {
        this.receiptBean = receiptBean1;
        return(this);
    }
}.init(receiptBean));
executorService.shutdown();

return receiptBean;
} 

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Можно использовать Executor Service для выполнения асинхронного запроса на отправку почты, но вы должны попытаться следовать принципам SOLID в своем проекте.Пусть сервисный уровень позаботится о запуске задачи executor.

https://en.wikipedia.org/wiki/SOLID

0 голосов
/ 05 декабря 2018

Я согласен с @daniu и @Ankur относительно разделения интересов, которым вы должны следовать.Так что просто создайте специальный сервис, такой как «EmailService», и добавьте его туда, где это необходимо.Более того, вы используете Spring Framework, и вы можете воспользоваться его Асинхронной функцией .Если вы предпочитаете писать свой собственный асинхронный код, тогда я предлагаю использовать, возможно, CompletableFuture вместо ExecutorService для лучшей обработки ошибок (возможно, вы хотите хранить сообщения, не отправленные в очередь, для достижения функции повтора или другого поведения).

0 голосов
/ 05 декабря 2018

Вы можете сделать это, хотя я не ожидал бы, что этот код будет в классе контроллера, но в отдельном разделе (Разделение проблем и все).

Однако, поскольку вы, похоже, используете Spring, выможет также использовать их каркас планирования .

...