Springboot中异步任务,邮件任务,定时任务简析
一、异步任务
测试
1、在服务层编写一个测试方法,使线程休眠三秒,用于模拟任务提交的时间,
并在方法上面声明@Async注解,指明这是一个异步方法
@Service
public class AsyncService {
//让spring知道这是一个异步方法
@Async
public void hello(){
try {
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("数据正在处理中。。。。。");
}
}
2、编写一个线程控制类,调用服务层的方法
@RestController
public class AsyncController {
@Autowired
AsyncService service;
@RequestMapping("hello")
public String hello(){
service.hello();//停止三秒
return "Ok";
}
}
3、在主方法上面添加@EnableAsync注解开启异步任务
//开启异步任务注解
@EnableAsync
@SpringBootApplication
public class Springboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
二、邮件任务
实例测试
1、引入依赖,spring-boot-starter-mail是基于Jakarta Mail API的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、开启邮箱中的POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,开启一个即可,得到一个密码
QQ邮箱的位置为:设置->账户

163邮箱位置:设置->POP3/SMTP/IMAP

3、在配置文件中配置账号密码
spring.mail.username=xxxxxx@qq.com //邮箱
spring.mail.password=qgriunbjkfrdbdef //步骤二获取的密码
spring.mail.host=smtp.qq.com //smtp协议声明
# 开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true
4、简单的纯文本邮件任务流程:
(1)声明JavaMailSenderImpl实例
(2)new一个SimpleMailMessage对象
(3)设置邮件的标题,内容,收件人,发件人
(4)使用JavaMailSenderImpl实例发送
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
void contextLoads() {
//一个简单的邮件任务
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("你好啊,这个美丽的世界"); //邮件标题
message.setText("这是一个邮件任务测试消息"); //邮件内容
message.setTo("xxxxxxxxx@qq.com"); //收件人
message.setFrom("**********@qq.com"); //发件人
javaMailSender.send(message);
}
5、声明一个复杂的邮件任务,可以进行文字的样式修改,发送图片,发送附件等
(1)声明JavaMailSenderImpl实例
(2)使用JavaMailSenderImpl实例创建一个复杂的邮件
(3)创建一个帮助类
(4)使用帮助类对象设置邮件的标题,内容,附件,收件人,发件人
(5)使用JavaMailSenderImpl实例发送
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
void contextLoads2() throws MessagingException {
//一个复杂的邮件任务
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//组装
//MimeMessageHelper(mimeMessage, 是否多文件)
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setSubject("测试");
//setText("文件内容","是否开启html支持")
helper.setText("这是一条复杂的邮件测试任务<img src='https://th.bing.com/th/id/R586ee0f0e499f1d119d91572e4df675f?rik=66f7ePWJTdcmNA&riu=http%3a%2f%2fwx3.sinaimg.cn%2flarge%2f61f1701fgy1fs4087kpl2j20ku0v9tuo.jpg&ehk=Mda1mcH9Jm3e0ZPQqbTqUMWYXQipSHe79J%2bJ88oQ5m4%3d&risl=&pid=ImgRaw'/>",true);
//附件
helper.addAttachment("111.jpg",new File("F:\\IdeaProjects\\Spring-Project\\springboot-09-test\\src\\main\\resources\\static\\img\\111.jpg"));
helper.setTo("xxxxxxxxx@qq.com");
helper.setFrom("**********@qq.com");
javaMailSender.send(mimeMessage);
}
JavaMailSenderImpl的几个属性设置说明如下:
Host:邮箱服务器主机。
Port:端口号。
Username:发件方账户。
Password:密码,qq邮箱的话此处设置16位授权码,不是邮箱密码,切记!
mail.smtp.auth:认证机制开关,记得开启。
mail.smtp.starttls.enable:TLS通讯协议开关,连接qq的SMTP服务器,需使用此通讯协议。
mail.smtp.timeout :连接超时时间,单位毫秒。
发送文本消息用SimpleMailMessage类
它的几个重要属性说明如下:
From:发件方的账户,和Username的值相同
To:收件方
Subject:邮件主题
Text:邮件内容
三、定时任务
主要组成
Taskscheduler 任务调度者
TaskExecutor 任务执行者
@@EnableScheduling //开启定时功能的注解
@Scheduled //什么时候执行
示例:
(1)在主方法上开启定时任务支持
//开启定时任务注解
@EnableScheduling
@SpringBootApplication
public class Springboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
(2)编写一个服务,并在方法上面添加cron表达式
@Service
public class ScheduledService {
//在一个特定的时间执行这个方法 Timer
/*
cron = "0 57 16 * * ?" 每天的16:57:00执行
cron = "0 57 16 ? * 1-5" 每周1-5的16:57:00执行
*/
@Scheduled(cron = "0 57 16 * * ?")
public void hello(){
System.out.println("hello,在一个特定的时间,你被执行了");
}
}
cron表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek
一、结构
corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
二、各字段的含义
注意事项:
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
(1):表示匹配该域的任意值。假如在Minutes域使用, 即表示每分钟都会触发事件。
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用,如果使用表示不管星期几都会触发,实际上并不是这样。
(3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
(4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
(5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
(6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9)#:用于确定每个月第几个星期几,只能出现在DayofWeek域。例如在4#2,表示某月的第二个星期三。
三、常用表达式例子
| Contab表达式 | 说明 |
|---|---|
| 0 */1 * * * ? | 每隔1分钟触发一次 |
| 0 0 5-15 * * ? | 每天5:00~15:00整点触发 |
| 0 0/3 * * * ? | 每隔3分钟触发一次 |
| 0 0-5 14 * * ? | 每天14:00~14:05期间每隔1分钟触发一次 |
| 0 0/5 14 * * ? | 每天14:00~14:55期间每隔5分钟触发一次 |
| 0 0/5 14,18 * * ? | 每天14:0014:55和18:0018:55两个时间段内每5分钟触发一次 |
| 0 0/30 9-17 * * ? | 每天9:00~17:00内每半小时触发一次 |
| 0 0 10,14,16 * * ? | 每天10:00、14:00和16:00触发 |
| 0 0 12 ? * WED | 每周三12:00触发 |
| 0 0 17 ? * TUES,THUR,SAT | 每周二、周四、周六17:00触发 |
| 0 10,44 14 ? 3 WED | 每年3月的每周三的14:10和14:44触发 |
| 0 15 10 ? * MON-FRI | 周一至周五的上午10:15触发 |
| 0 0 23 L * ? | 每月最后一天23:00触发 |
| 0 15 10 L * ? | 每月最后一天10:15触发 |
| 0 15 10 ? * 6L | 每月最后一个周五10:15触发 |
| 0 15 10 * * ? 2005 | 2005年的每天10:15触发 |
| 0 15 10 ? * 6L 2002-2005 | 2002年~2005年的每月的最后一个周五上午10:15触发 |
| 0 15 10 ? * 6#3 | 每月的第三个周五10:15触发 |
另附一个在线cron表达式生成器:https://cron.qqe2.com/
声明:
本文为,学习时编写,参考b站狂神说,链接地址:https://www.bilibili.com/video/BV1PE411i7CV


浙公网安备 33010602011771号