返回语句后执行的代码

时间:2017-03-12 14:59:41

标签: java multithreading performance return execution

只是好奇地通过以下想法改进我的程序的响应时间,请帮助执行它:

@Controller   
public class SendData{  
   @RequestMapping(value = "/getEmailId", method = RequestMethod.GET)  
   public String getUserMail(String userId) {  
      //getting Email Id From Database
      String emailId = getEmailIdFromDatabase(userId); 

      //send mail
      sendNotificationMail(emailId);

      // send data to requestor
      return emailId;  
     }  
}

可能的想法:在将EmailId返回给请求者

后发送邮件
@Controller   
public class SendData{  
   @RequestMapping(value = "/getEmailId", method = RequestMethod.GET)  
   public String getUserMail(String userId) {  
      //getting Email Id From Database
      String emailId = getEmailIdFromDatabase(userId); 

      // send data to requestor
      return emailId;  

      //send mail
      sendNotificationMail(emailId);
     }  
}

因为我正在大规模地进行(例如,我得到emailIds的列表)所以我希望请求者首先获得emailIds并删除发送通知邮件的等待时间。

  • 请告诉解决方案是否可以通过线程实现。
  • 如果使用除Java之外的任何语言都可以这样的话吗?
  • 我尝试过使用finally块,但观察到finally块在return语句之前执行。

3 个答案:

答案 0 :(得分:2)

您提出的第二个代码块无效。 return语句之后的代码是死代码,它根本不会被调用,我猜java甚至不会让它编译。<​​/ p>

我看到你正在使用Spring,因此解决问题的一个方法是创建一个服务来处理电子邮件请求并使用JavaMailSender类。可以使用properties.yml配置此类,您可以在以下教程中找到一个很好的示例:Sending HTML Mail with Spring Boot and Thymeleaf

为了防止它被阻止,您只需要使用@Async注释负责在Service类内发送电子邮件的方法。这很可能是您简单应用的最佳解决方案。

PS:这个解决方案有一些缺点。如果您的应用程序需要处理大量电子邮件,则无法扩展。要解决这个问题,您应该寻找一种模式,在这种模式中,您将向队列添加请求,并让您的架构的另一个组件(工作者)只是为了消耗队列并发送电子邮件。请记住,只有在您确实需要时才应遵循此方法。

答案 1 :(得分:1)

一种可能且天真的解决方案就是为邮件发送启动一个新线程:

new Thread() {
    @Override
    public void run() {
        sendNotificationMail(emailId);
    }
}.start();

更强大的版本是在&#34之间拆分;我想要发送邮件&#34;和#34;我发了一封邮件&#34;。例如,不要发送邮件,只需将该邮件插入表中即可。使用@Scheduled从数据库中插入邮件,然后发送并删除它。这样您就可以缩短响应时间。它就是这样。当然,这只是一个想法,你可以使用消息总线等,但你明白了。

答案 2 :(得分:1)

问题的解决方法是使sendNotication服务异步:

1。通过使用线程

new Thread() 
{
   @Override
   public void run() 
   {
      sendNotificationMail(emailId);
   }
}.start();

2。使用Java Messaging服务

请参阅此网址:http://www.javatpoint.com/jms-tutorial