在 return 语句之后执行的代码
Code to execute after return statement
只是想通过以下想法改进我的程序的响应时间,请帮助执行它:
@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;
}
}
可能的想法:在 returning 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 语句之前执行。
一个可能的天真的解决方案是启动一个新线程来发送邮件:
new Thread() {
@Override
public void run() {
sendNotificationMail(emailId);
}
}.start();
一个更强大的版本是在 "I want send a mail" 和 "I send a mail" 之间拆分。例如,不是发送邮件,而是将该邮件插入 table。使用 @Scheduled 从数据库中获取插入的邮件,然后发送并删除它。因此,您可以缩短响应时间。就是这样。当然,这只是一个想法,您可以使用消息总线或类似工具,但您明白了。
您好,您提出的第二个代码块无效。
return语句后面的代码是死代码,根本不会被调用,估计java连编译都不让了。
我看到您正在使用 Spring,因此解决您的问题的一种方法是创建一个服务来处理电子邮件请求并使用 JavaMailSender
class。这个 class 可以使用 properties.yml
配置,你可以在下面的教程中找到一个很好的例子:Sending HTML Mail with Spring Boot and Thymeleaf
为了防止它被阻止,您只需要在服务 class 中用 @Async
注释负责发送电子邮件的方法。这很可能是您的简单应用程序的最佳解决方案。
PS:这个解决方案有一些缺点。如果您的应用程序需要处理大量电子邮件,它就无法扩展。要解决这个问题,您应该寻找一种模式,在该模式中,您将向队列添加请求,并让您的体系结构的另一个组件(工作人员)只是使用队列并发送电子邮件。请记住,只有在您确实需要时才应遵循此方法。
问题的解决方案是使您的 sendNotication 服务异步:
1。通过使用线程
new Thread()
{
@Override
public void run()
{
sendNotificationMail(emailId);
}
}.start();
2。通过使用 Java 消息服务
参考这个 URL : http://www.javatpoint.com/jms-tutorial
只是想通过以下想法改进我的程序的响应时间,请帮助执行它:
@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;
}
}
可能的想法:在 returning 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 语句之前执行。
一个可能的天真的解决方案是启动一个新线程来发送邮件:
new Thread() {
@Override
public void run() {
sendNotificationMail(emailId);
}
}.start();
一个更强大的版本是在 "I want send a mail" 和 "I send a mail" 之间拆分。例如,不是发送邮件,而是将该邮件插入 table。使用 @Scheduled 从数据库中获取插入的邮件,然后发送并删除它。因此,您可以缩短响应时间。就是这样。当然,这只是一个想法,您可以使用消息总线或类似工具,但您明白了。
您好,您提出的第二个代码块无效。 return语句后面的代码是死代码,根本不会被调用,估计java连编译都不让了。
我看到您正在使用 Spring,因此解决您的问题的一种方法是创建一个服务来处理电子邮件请求并使用 JavaMailSender
class。这个 class 可以使用 properties.yml
配置,你可以在下面的教程中找到一个很好的例子:Sending HTML Mail with Spring Boot and Thymeleaf
为了防止它被阻止,您只需要在服务 class 中用 @Async
注释负责发送电子邮件的方法。这很可能是您的简单应用程序的最佳解决方案。
PS:这个解决方案有一些缺点。如果您的应用程序需要处理大量电子邮件,它就无法扩展。要解决这个问题,您应该寻找一种模式,在该模式中,您将向队列添加请求,并让您的体系结构的另一个组件(工作人员)只是使用队列并发送电子邮件。请记住,只有在您确实需要时才应遵循此方法。
问题的解决方案是使您的 sendNotication 服务异步:
1。通过使用线程
new Thread()
{
@Override
public void run()
{
sendNotificationMail(emailId);
}
}.start();
2。通过使用 Java 消息服务
参考这个 URL : http://www.javatpoint.com/jms-tutorial