异步定时邮件任务

Posted dxj1016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步定时邮件任务相关的知识,希望对你有一定的参考价值。

狂神讲解的配套视频地址 https://www.bilibili.com/video/BV1PE411i7CV

1、异步任务

我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。

  1. 创建springboot项目,选web模块
    在这里插入图片描述
  2. 在service层创建一个类AsyncService,编写方法test,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况;
@Service
public class AsyncService {
   public void test(){
       try {
           Thread.sleep(4000);
      } catch (InterruptedException e) {
           e.printStackTrace();
      }
       System.out.println("数据正在处理....");
  }
}
  1. 在controller层创建AsyncController类
@RestController
public class AsyncController {
   @Autowired
   AsyncService asyncService;
   @GetMapping("/test")
   public String test(){
       asyncService.test();//停止三秒,转圈
       return "数据处理成功";
  }
}
  1. 访问:http://localhost:8080/hello进行测试,3秒后出现数据处理成功,这是同步等待的情况。
  2. 问题:我们如果想让用户直接得到消息,就在后台使用多线程的方式进行处理即可,但是每次都需要自己手动去编写多线程的实现的话,太麻烦了,我们只需要用一个简单的办法,在我们的方法上加一个简单的注解即可,如下:
  3. 给test方法添加@Async注解;
//告诉Spring这是一个异步方法
@Async
public void test(){
   try {
       Thread.sleep(4000);
  } catch (InterruptedException e) {
       e.printStackTrace();
  }
   System.out.println("数据正在处理中....");
}
  1. SpringBoot就会自己开一个线程池,进行调用!但是要让这个注解生效,我们还需要在主程序上添加一个注解@EnableAsync,开启异步注解功能;
@EnableAsync //开启异步注解功能
@SpringBootApplication
public class SpringbootTaskApplication {
   public static void main(String[] args) {
       SpringApplication.run(SpringbootTaskApplication.class, args);
  }
}
  1. 重启项目,访问:http://localhost:8080/test;网页瞬间响应,后台代码执行!

2、定时任务

可以定时设置任务,Spring为我们提供了异步执行任务调度的方式,提供了两个接口。

  • TaskExecutor接口:任务执行者
    在这里插入图片描述
  • TaskScheduler接口:任务调度者
    在这里插入图片描述

两个注解:

  • @EnableScheduling:开启定时功能注解
  • @Scheduled:什么时候执行

cron百度百科

在线cron表达式生成器

cron表达式详解

  1. 在上面的项目中的service层创建ScheduledService类,设置执行时间
@Service
public class ScheduledService {
//   在一个特定的时间执行这个方法 Timer
   //秒   分   时     日   月   周几
   //0 * * * * MON-FRI
   //注意cron表达式的用法;
   @Scheduled(cron = "0 01 23 * * ?")//每天的23点01分钟00秒执行一次
   public void test(){
       System.out.println("hello.....,你被执行了");
  }
}
  1. 在主程序上增加@EnableScheduling 开启定时任务功能
@EnableAsync //开启异步注解功能
@EnableScheduling //开启基于注解的定时任务
@SpringBootApplication
public class SpringbootTaskApplication {
   public static void main(String[] args) {
       SpringApplication.run(SpringbootTaskApplication.class, args);
  }
}

3、邮件任务

  1. 导入依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  1. ctrl+鼠标点击进去这个依赖里面可以看到有三个依赖
    在这里插入图片描述
  2. 双击shift查看自动配置类:MailSenderAutoConfiguration
    在这里插入图片描述
  3. 然后点进去看配置文件
    在这里插入图片描述
  4. 返回MailSenderAutoConfiguration类看MailSenderJndiConfiguration类
    在这里插入图片描述
  5. 这个类中JavaMailSenderImpl类,通过@Bean注入
    在这里插入图片描述
  6. 设置配置文件properties:
spring.mail.username=你的qq
spring.mail.password=你的qq授权码
spring.mail.host=smtp.qq.com
# qq需要配置ssl
spring.mail.properties.mail.smtp.ssl.enable=true
  1. 获取授权码:登录QQ邮箱–>设置->账户->开启pop3和smtp服务;授权码填入上面的配置文件中
    在这里插入图片描述
  2. 发送一个简单的邮件
 @Autowired
    JavaMailSenderImpl mailSender;
    @Test
    void contextLoads() {
        //邮件设置1:一个简单的邮件
        SimpleMailMessage message = new SimpleMailMessage();
        message.setSubject("紧急通知");
        message.setText("今晚7:30开会");
        message.setTo("1278065208@qq.com");
        message.setFrom("1278065208@qq.com");
        mailSender.send(message);
    }
  1. 查看自己邮箱,看是否有发送记录和接收记录
    在这里插入图片描述
  2. 发送一个复杂的邮件
@Test
    public void contextLoads2() throws MessagingException {
        //邮件设置2:一个复杂的邮件
        MimeMessage mimeMessage = mailSender.createMimeMessage();
//        组装
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("通知-明天考试");
        helper.setText("<p style='color:red'>明天 9:30开始考试</p>",true);
        //发送附件
        helper.addAttachment("1.jpg",new File("D:\\\\笔记\\\\java\\\\狂神说java\\\\springbootstudy\\\\springboot-tasks-study\\\\src\\\\main\\\\resources\\\\1.jpg"));
        helper.addAttachment("2.jpg",new File("D:\\\\笔记\\\\java\\\\狂神说java\\\\springbootstudy\\\\springboot-tasks-study\\\\src\\\\main\\\\resources\\\\2.jpg"));
        helper.setTo("1278065208@qq.com");
        helper.setFrom("1278065208@qq.com");
        mailSender.send(mimeMessage);
    }
  1. 代码封装
/**
     * @param html
     * @param subject
     * @param text
     * @throws MessagingException
     */
    public void sendMail(Boolean html,String subject,String text) throws MessagingException{
        //邮件设置2:一个复杂的邮件
        MimeMessage mimeMessage = mailSender.createMimeMessage();
//        组装
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, html);

        helper.setSubject(subject);
        helper.setText(text,true);

        //发送附件
        helper.addAttachment("1.jpg",new File("D:\\\\笔记\\\\java\\\\狂神说java\\\\springbootstudy\\\\springboot-tasks-study\\\\src\\\\main\\\\resources\\\\1.jpg"));
        helper.addAttachment("2.jpg",new File("D:\\\\笔记\\\\java\\\\狂神说java\\\\springbootstudy\\\\springboot-tasks-study\\\\src\\\\main\\\\resources\\\\2.jpg"));

        helper.setTo("1278065208@qq.com");
        helper.setFrom("1278065208@qq.com");

        mailSender.send(mimeMessage);
    }

以上是关于异步定时邮件任务的主要内容,如果未能解决你的问题,请参考以下文章

7.4 异步定时和邮件发送任务

SpringBoot异步定时邮件任务

21SpringBoot 异步任务,定时任务,邮件任务

36springboot——异步任务定时任务邮件任务

微服务架构中的任务调度:在 SpringBoot 框架中使用异步任务,定时任务和邮件任务

异步定时邮件任务