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); }