任务
- 异步任务
- 定时任务
- 邮件发送
1、异步任务
1.1、环境搭建
新建springboot项目
springboot-08-task
选择web模块
创建一个业务类
AsyncService
,编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况;package com.xj.service; import org.springframework.stereotype.Service; @Service // 交给Spring托管 public class AsyncService { public void hello(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("业务进行中...."); } }
编写控制类
AsyncController
@RestController public class AsyncController { @Autowired AsyncService asyncService; @GetMapping("/hello") public String hello(){ asyncService.hello(); return "success"; } }
1.2、异步处理
给hello方法添加@Async注解;
//告诉Spring这是一个异步方法 @Async public void hello(){ try { Thread.sleep(3000); } 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); } }
重启测试,网页瞬间响应,后台代码依旧执行!
2、邮件发送
邮件发送,在我们的日常开发中,也非常的多,Springboot也帮我们做了支持
- 邮件发送需要引入spring-boot-start-mail
- SpringBoot 自动配置MailSenderAutoConfiguration
- 定义MailProperties内容,配置在application.yml中
- 自动装配JavaMailSender
- 测试邮件发送
使用方法:
引入pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
配置文件(使用qq邮箱的模板)
spring.mail.username=xxx@qq.com spring.mail.password=你的qq授权码 spring.mail.host=smtp.qq.com # qq需要配置ssl spring.mail.properties.mail.smtp.ssl.enable=true
获取授权码:在QQ邮箱中的设置->账户->开启pop3和smtp服务,忘记授权码的,可以关闭之后重新开启就有了
Spring单元测试,简单邮件
@Autowired JavaMailSenderImpl mailSender; @Test void contextLoads() { // 邮件设置1:简单的邮件 SimpleMailMessage message = new SimpleMailMessage(); message.setSubject("通知-今晚开班会"); message.setText("今晚19:30开会"); message.setTo("1256240778@qq.com"); message.setFrom("1256240778@qq.com"); mailSender.send(message); }
复杂邮件
void contextLoads2() throws MessagingException { // 邮件设置2:复杂的邮件 // 注意不能直接new出来的 MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setSubject("通知-今晚开班会"); // 支持使用html格式 helper.setText("<b style='color:red'>今天 7:30来开会</b>",true); //发送附件 helper.addAttachment("1.jpg",new File("D:\\1.jpg")); helper.addAttachment("2.jpg",new File("D:\\1.jpg")); helper.setTo("1256240778@qq.com"); helper.setFrom("1256240778@qq.com"); mailSender.send(message); }
可以通过查看自动配置类:MailSenderAutoConfiguration
3、定时任务
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring为我们提供了异步执行任务调度的方式,提供了两个接口。
- TaskExecutor接口
- TaskScheduler接口
两个注解:
- @EnableScheduling
- @Scheduled
cron表达式:
结构(至少6个,也可以增加年)
corn从左到右(用空格隔开):秒 分 小时 日 月 星期 年份
各字段的含义
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒(Seconds) | 0~59的整数 | , - * / 四个字符 |
分(Minutes) | 0~59的整数 | , - * / 四个字符 |
小时(Hours) | 0~23的整数 | , - * / 四个字符 |
日期(DayofMonth) | 1~31的整数(但是你需要考虑你月的天数) | ,- * ? / L W C 八个字符 |
月份(Month) | 1~12的整数或者 JAN-DEC | , - * / 四个字符 |
星期(DayofWeek) | 1~7的整数或者 SUN-SAT (1=SUN) | , - * ? / L C # 八个字符 |
年(可选,留空)(Year) | 1970~2099 | , - * / 四个字符 |
测试步骤:
创建一个业务类
ScheduledService
,我们里面存在一个Scheduled方法,他需要定时执行,怎么处理呢?@Service public class ScheduledService { //秒 分 时 日 月 周几 //0 * * * * MON-FRI //注意cron表达式的用法; @Scheduled(cron = "0 * * * * 0-7") public void Scheduled(){ System.out.println("hello....."); } }
在主程序上增加
@EnableScheduling
开启定时任务功能@SpringBootApplication @EnableAsync // 开启异步注解功能 @EnableScheduling // 开启基于注解的定时任务 public class Springboot08TaskApplication { public static void main(String[] args) { SpringApplication.run(Springboot08TaskApplication.class, args); } }
常用的表达式
0/2 * * * * ? 表示每2秒 执行任务 0 0/2 * * * ? 表示每2分钟 执行任务 0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务 0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业 0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午12点 0 0 12 * * ? 每天中午12点触发 0 15 10 ? * * 每天上午10:15触发 0 15 10 * * ? 每天上午10:15触发 0 15 10 * * ? 每天上午10:15触发 0 15 10 * * ? 2005 2005年的每天上午10:15触发 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 0 15 10 15 * ? 每月15日上午10:15触发 0 15 10 L * ? 每月最后一日的上午10:15触发 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发 0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
谢谢光临~
- 本文链接:https://lxjblog.gitee.io/2020/08/02/%E4%BB%BB%E5%8A%A1/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。