任务:
一、异步任务
二、定时任务
三、邮件任务
一、异步任务
1.创建项目
- 用spring初始化器创建
2.异步任务的解析
异步任务在开发中还是非常常见的
比如我们要发送邮件或者是处理数据,不想阻塞下面的线程,我们就可以用多线程的方式来进行异步处理
①先看同步处理的效果
(1)在主程序相同的目录下创建一个service包,建立AsyncService类
@Service
public class AsyncService {
public void hello(){
try {//模拟同步处理数据消耗3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("处理数据中......");
}
}
(2)在主程序相同的目录下创建一个controller包,建立AsyncController类
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@GetMapping("/hello")
public String hello(){
asyncService.hello();
return "success";
}
}
(3)测试
- 启动项目,在浏览器输入
http://localhost:8080/hello
,可以看到,浏览器是3秒钟才响应了数据,加载处理success。
这样我们就能看到,同步处理太慢了,需要异步来加快速度
②异步的使用
(1)直接在需要异步的方法上加上@Async
加上@Async之后,spring就会自己开一个线程池,来进行调用
(2)在主程序上加上@EnableAysnc
加上@EnableAysnc之后@Async才会起作用
(3)测试
- 启动项目,在浏览器输入
http://localhost:8080/hello
,可以看到,浏览器立即响应了数据,加载处理success。
二、定时任务
常用场景:
每天凌晨收集和分析日志
每个月都有一天汇总生成报表
两个注解 :
- @EnableScheduling
- @ Scheduled
cron表达式:
//second, minute, hour, day of month(日), month, and day of week(周)
@Scheduled(cron = "0 * * * * MON-SAT")//周一到周六每分钟打印一次//@Scheduled(cron = "0,1,2,3,4 * * * *
MON-SAT")//周一到周六每分钟的第1,2,3,4,5秒打印一次
@Scheduled(cron = "0-4 * * * * MON-SAT")//周一到周六每分钟的第1,2,3,4,5秒打印一次
@Scheduled(cron = "0/4 * * * * MON-SAT")//从1秒启动,每4秒执行一次
【0 0/5 14,18 * * ?】 每天14点整,和18点整,每隔5分钟执行一次
【0 15 10 ? * 1-6】 每个月的周一至周六10:15分执行一次
【0 0 2 ? * 6L】每个月的最后一个周六凌晨2点执行一次
【0 0 2 LW * ?】每个月的最后一个工作日凌晨2点执行一次
【0 0 2-4 ? * 1#1】每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次;
1.应用
①在service包下创建一个ScheduleService类
@Service
public class ScheduleService {
/**
* second, minute, hour, day of month(日), month, and day of week(周).
*/
//@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")//周一到周六每分钟的第1,2,3,4,5秒打印一次
@Scheduled(cron = "0 * * * * MON-SAT")//每分钟打印一次
public void hello(){
System.out.println("hello......");
}
}
②在主程序中添加注解@EnableScheduling
③测试
- 运行项目
- 控制台会1分钟打印一次
三、邮件任务
0.提前准备
①获取授权码
在第三方登录QQ邮箱,可能存在邮件泄露风险,甚至危害Apple ID安全,建议使用QQ邮箱手机版登录。 继续获取授权码登录第三方客户端邮箱
就是:如果想要第三方登录邮箱的话,需要得到授权码
- 我用qq邮箱演示,登录qq邮箱,点开设置-》账户,往下拉,点击生成授权码,只需要用绑定邮箱的手机按要求发消息即可
得到授权码之后,记录下来,用作之后的密码
1.引入场景启动器
- 在pom文件中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置邮箱
- 在全局配置文件中操作
spring.mail.username=2832466495@qq.com
spring.mail.password=授权码
spring.mail.host=smtp.qq.com
3.测试简单邮箱的发送
- 在测试类中添加以下代码
@Autowired
JavaMailSenderImpl mailSender;
@Test
public void test01(){
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//邮件设置
simpleMailMessage.setSubject("通知-今晚开会");
simpleMailMessage.setText("今晚7:30开会");
simpleMailMessage.setTo("2591871445@qq.com");
simpleMailMessage.setFrom("2832466495@qq.com");
mailSender.send(simpleMailMessage);
}
可以看到邮箱发送成功!!!
4.复杂邮件的发送
- 在测试类中添加以下代码
@Test
public void test02() throws Exception{
//复杂邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
//邮件设置
mimeMessageHelper.setSubject("通知-今晚开会");
mimeMessageHelper.setText("<b style='color:red'>今晚7:30开会</b>",true);
mimeMessageHelper.setTo("2591871445@qq.com");
mimeMessageHelper.setFrom("2832466495@qq.com");
//上传文件
mimeMessageHelper.addAttachment("1.jpg",new File("C:\\Users\\丹青\\Pictures\\Saved Pictures\\1F52G20Z0-5.jpg"));
mimeMessageHelper.addAttachment("2.jpg",new File("C:\\Users\\丹青\\Pictures\\Saved Pictures\\1F52G20Z0-5.jpg"));
mailSender.send(mimeMessage);
}
可以看到发送完成