您现在的位置是:首页 > 学无止境 > Java 网站首页学无止境

SpringMVC异步发送邮件(小Demo)

  • summer
  • Java
  • 2020年3月31日 15:10
  • 304已阅读
简介一个SpringMVC中异步任务的小demo

0、前言


对于一个web应用来说,服务器可以快速的响应将会大大地提高用户使用感受。因此对于一些耗时较长的处理工作,可以让服务器先对用户请求进行响应,然后再异步完成这些耗时较长的工作。

最近毕设中需要使用到邮件通知,因为以前后台都是使用Django,类似这种的异步工作有celery可以很好的来完成。毕设开始转Java开发,使用SSM,记录一下SpringMVC中异步发送邮件的方法。

1、配置文件


在spring配置文件中添加以下代码

<beans 
       .......
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation=
       .......
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task-4.3.xsd">
      <!--允许@Async-->
      <task:annotation-driven executor="Executor" />
      <task:executor id="Executor" pool-size="5" />

2、方法编写


完成上面工作后,我们可以编写一个发送邮件的异步函数,其使用@Async注解进行修饰。注意,不要将异步函数编写为static类型

@Component
public class SendEmail {
    /
     * @param recipient 收件人
     * @param notice 通知内容
     * @return bool
     /
    @Async
    public Future<Boolean> notice(String recipient, NoticeInfo notice){
        // 发件人邮箱
        String from = "发件人邮箱";
        // 主机地址
        String host = "smtp.qq.com";
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器
        properties.setProperty("mail.smtp.host", host);
        properties.setProperty("mail.smtp.port","465");
        //允许ssl
        properties.setProperty("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.auth", "true");
        // 获取默认session对象
        Session session = Session.getInstance(properties, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送者邮箱", "鉴别码");
            }
        });
        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
          // Set From: 头部头字段
          message.setFrom(new InternetAddress(from, "notices", "UTF-8"));
          // Set To: 头部头字段
          message.addRecipient(Message.RecipientType.TO,
                  new InternetAddress(recipient));

      // Set Subject: 头部头字段
      message.setSubject(notice.title);
      Multipart mainPart = new MimeMultipart();
      // 创建一个包含HTML内容的MimeBodyPart
      BodyPart html = new MimeBodyPart();
      // 设置HTML内容
      html.setContent(&amp;quot;测试&amp;quot;, &amp;quot;text/html; charset=utf-8&amp;quot;);
      mainPart.addBodyPart(html);
      // 设置消息体
      message.setContent(mainPart);
      // 发送消息
      Transport.send(message);
   } catch (Exception mex) {
              mex.printStackTrace();
              return new AsyncResult&amp;lt;&amp;gt;(false);
    }
    return new AsyncResult&amp;lt;&amp;gt;(true);

}

使用Future可以返回异步执行的结果,判断是否执行完毕是需要类似下面操作

Future<Boolean> result = SendEmail.notice("123@qq.com", notice);
if(result.isDone()){
    System.out.pringln("发送完毕");
}

3、调用异步函数


注意,调用异步函数的类和实现异步函数的类需要是不同的类。调用类似于static类型的函数

@Autowired
SendEmail sendEmail;

public String addNotice(Notice noticeInfo){ // ...... for(UserInfo teacher: course.getTeachers()) { sendEmail.notice(teacher.getEmail(), noticeInfo); } }

4、测试


简单的测试了一下时间 使用同步发送的话,三个用户发送邮件耗时6秒左右,也就是说明用户在操作后服务器将近6秒才进行响应

使用异步发送时,服务里立即对客户端进行了响应

大大提高了用户的使用体验。


版权声明:本文为博主原创文章,转载时请注明来源。https://blog.thinker.ink/passage/29/

 

上一篇:随便扯几句

下一篇:返回主页

文章评论

Top