异步定时邮件任务
Posted dxj1016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步定时邮件任务相关的知识,希望对你有一定的参考价值。
狂神讲解的配套视频地址 https://www.bilibili.com/video/BV1PE411i7CV
1、异步任务
我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。
- 创建springboot项目,选web模块
- 在service层创建一个类AsyncService,编写方法test,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况;
@Service
public class AsyncService {
public void test(){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理....");
}
}
- 在controller层创建AsyncController类
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@GetMapping("/test")
public String test(){
asyncService.test();//停止三秒,转圈
return "数据处理成功";
}
}
- 访问:http://localhost:8080/hello进行测试,3秒后出现数据处理成功,这是同步等待的情况。
- 问题:我们如果想让用户直接得到消息,就在后台使用多线程的方式进行处理即可,但是每次都需要自己手动去编写多线程的实现的话,太麻烦了,我们只需要用一个简单的办法,在我们的方法上加一个简单的注解即可,如下:
- 给test方法添加@Async注解;
//告诉Spring这是一个异步方法
@Async
public void test(){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理中....");
}
- SpringBoot就会自己开一个线程池,进行调用!但是要让这个注解生效,我们还需要在主程序上添加一个注解@EnableAsync,开启异步注解功能;
@EnableAsync //开启异步注解功能
@SpringBootApplication
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
}
- 重启项目,访问:http://localhost:8080/test;网页瞬间响应,后台代码执行!
2、定时任务
可以定时设置任务,Spring为我们提供了异步执行任务调度的方式,提供了两个接口。
- TaskExecutor接口:任务执行者
- TaskScheduler接口:任务调度者
两个注解:
- @EnableScheduling:开启定时功能注解
- @Scheduled:什么时候执行
- 在上面的项目中的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.....,你被执行了");
}
}
- 在主程序上增加@EnableScheduling 开启定时任务功能
@EnableAsync //开启异步注解功能
@EnableScheduling //开启基于注解的定时任务
@SpringBootApplication
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
}
3、邮件任务
- 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- ctrl+鼠标点击进去这个依赖里面可以看到有三个依赖
- 双击shift查看自动配置类:MailSenderAutoConfiguration
- 然后点进去看配置文件
- 返回MailSenderAutoConfiguration类看MailSenderJndiConfiguration类
- 这个类中JavaMailSenderImpl类,通过@Bean注入
- 设置配置文件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
- 获取授权码:登录QQ邮箱–>设置->账户->开启pop3和smtp服务;授权码填入上面的配置文件中
- 发送一个简单的邮件
@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);
}
- 查看自己邮箱,看是否有发送记录和接收记录
- 发送一个复杂的邮件
@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);
}
- 代码封装
/**
* @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);
}
以上是关于异步定时邮件任务的主要内容,如果未能解决你的问题,请参考以下文章