SpringBoot与任务
异步任务
异步任务非常简单,在执行发送邮件或者其他比较耗费时间的任务时,我们希望快速的去响应用户而不是让用户等待,那么就可以开启异步任务,让发送邮件跟响应用户同时去做
使用异步任务非常简单,只需要两个注解:@EnableAsync、@Async
1、@EnableAsync标注在主程序类上,表示开启异步任务:
@EnableAsync
@SpringBootApplication
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class, args);
}
}
2、在要执行异步的方法上标注上@Async,就会开启一个新的线程去执行
@GetMapping("/hello")
public String hello(){
asyncService.hello(); // 在这里会开启一个新的线程执行
return "success";
}
asyncService:
@Async
public void hello() {
...
}
做完这两步,该方法就可以异步执行了
定时任务
项目开发中经常需要定时执行一些任务,不如在每天凌晨时分析一天的日志信息。SpringBoot为我们提供了异步执行任务调度的方式,提供了TaskExecutor、TaskScheduler接口
两个注解:@EnableScheduling、@Scheduled
@EnableScheduling标注在主程序类上,表示开启定时任务
@EnableScheduling
@SpringBootApplication
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class, args);
}
}
@Scheduled标注在要执行定时任务的方法上
// 0 * * * * MON-SAT表示周一到周六每一分钟都执行一次这个方法
@Scheduled(cron = "0 * * * * MON-SAT")
public void hello(){
System.out.println("hello...");
}
做完上面两步就可以定时执行该方法了
只是定时的规则是什么呢?这就不得不提到cron表达式了
cron表达式
在标注@Scheduled注解的时候要使用cron表达式来表示隔多久执行一次任务,那么这个表达式怎样写呢?
首先,表达式各个位置上代表的信息是:秒 分 时 日 月 周几
字段介绍
|
字段 |
允许值 |
允许特殊字符 |
|
秒 |
0-59 |
, - * / |
|
分 |
0-59 |
, - * / |
|
小时 |
0-23 |
, - * / |
|
日期 |
1-31 |
, - * ? / L W C |
|
月份 |
1-12 |
, - * / |
|
星期 |
0-7或SUN-SAT |
, - * ? / L C # |
字符介绍
|
特殊字符 |
代表含义 |
例子 |
|
|
, |
枚举 |
0,1,2,3 * * * *MON-SAT |
表示每分钟的第0,1,2,3秒都执行 |
|
- |
区间 |
0-3 * * * * MON-SAT |
表示0到4秒每一秒都执行 |
|
* |
任意 |
|
|
|
/ |
步长 |
0/4 * * * * MON-SAT |
表示从0秒启动,每4秒执行一次 |
|
? |
日/星期冲突匹配 |
0 * * ? * MON |
因为在星期的地方写了每周一都执行一次,但是在日期的地方就不能写*,因为不是每天都是周一,因此用?匹配 |
|
L |
最后 |
0 0 2 LW * ? |
表示每个月最后一个工作日的凌晨两点执行一次 |
|
W |
工作日 |
|
|
|
C |
和calendar联系后计算过的日期 |
|
|
|
# |
星期,4#2表示第二个星期四 |
|
|
邮件任务
- 邮件发送需要引入spring-boot-starter-mail
- Spring Boot自动配置MailSenderAutoConfiguration
- 定义MailProperties内容,配置在application.yml中
- 自动装配JavaMailSender
- 测试邮件发送
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、配置邮件相关信息,注意,密码填写授权码
spring:
mail:
username: 2789519045@qq.com
password: fjkmnzgjgwhwdfjc # 邮箱授权码
host: smtp.qq.com
properties:
mail:
smtp:
ssl:
enable: true # 开启ssl安全连接
3、测试邮件发送
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
public void contextLoads() {
SimpleMailMessage message = new SimpleMailMessage();
// 设置邮件信息
message.setSubject("今晚打球不");
message.setText("今晚8点去打球");
message.setTo("2968626690@qq.com");
message.setFrom("2789519045@qq.com");
// 发送
javaMailSender.send(message);
}
发送复杂邮件(支持HTML跟发送文件)
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
public void test() throws MessagingException {
// 创建一个复杂邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// 参数一:MimeMessage
// 参数二:是否发送文件
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 设置邮件信息
helper.setSubject("今晚打球不");
helper.setText("<b style='color: red;'>今晚8点去打球</b>", true); // 参数二:允许html
// 上传文件
helper.addAttachment("1.jpg", new File("G:\\壁纸\\1.jpg"));
helper.addAttachment("2.jpg", new File("G:\\壁纸\\2.jpg"));
helper.setTo("2968626690@qq.com");
helper.setFrom("2789519045@qq.com");
// 发送
javaMailSender.send(mimeMessage);
}

浙公网安备 33010602011771号