我在在线应用程序中具有一项功能。生成收据后,我需要将收据邮寄给客户。我的问题是邮件功能需要花费更多时间近20到30秒,客户在网上交易期间无法等待很长时间。
因此,我已经使用java ExecutorService独立运行邮件服务[sendMail]并将响应页面返回给客户,无论是否发送了邮件。
在在线应用程序[Http request&response]中使用ExecutorService是否正确。下面是我的代码。请指教。
@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;
}
答案 0 :(得分:1)
您可以执行此操作,尽管我不希望这段代码在控制器类中使用,但要单独使用(关注点和所有问题的分离)。
但是,由于您似乎正在使用Spring,因此不妨使用其scheduling framework。
答案 1 :(得分:1)
可以使用Executor Service发出异步邮件发送请求,但是您应该在设计中尝试遵循SOLID原则。让服务层负责运行执行程序任务。
答案 2 :(得分:1)
我同意@daniu和@Ankur关于您应该遵循的关注分离问题。因此,只需创建一个专用服务(如“ EmailService”)并将其注入到需要的地方即可。 此外,您正在利用Spring框架,并且您可以利用其Async feature。 如果您喜欢编写自己的异步代码,那么我建议您使用CompletableFuture而不是ExecutorService来更好地处理失败(也许您不希望将存储的消息发送到队列中以实现重试功能或其他行为)。>