定时任务,简要说明就是在指定时间内触发执行某个动作。举个例子而言,譬如我们在朋友生日准时送上生日祝福,那么平时比较繁忙的我们,有时候往往甚至不知道今天是星期几,那么这时候可以让程序帮我们去定时的送上生日祝福。
1 为什么要用定时任务
-
无需手动触发,无需页面(人工)触发动作
-
执行时间准确,会在准确的时间内进行业务处理
-
低耦合,单独为一个动作体,可以自行开关,不影响其他业务功能
2 怎么使用定时任务
以springboot为例子
2.1 在启动类中加入@EnableScheduling注解
@EnableScheduling @SpringBootApplication public class OpenServiceApplication { public static void main(String[] args) { SpringApplication.run(OpenServiceApplication.class, args); } }
2.2 在方法上添加@Scheduled注解,以及定时cron表达式
@Scheduled(cron = "0 */5 * * * ?") public void demo() throws Exception { System.out.println("在这里提醒朋友们,多喝热水"); }
3 cron表达式
在线生成cron表达式:(在线Cron表达式生成器)
cron表达式简单的来说就是,你要告诉程序什么时候执行任务的语言
表达式组成(七位数字,其中spring只认前六位):
Seconds Minutes Hours DayofMonth Month DayofWeek Year 或 Seconds Minutes Hours DayofMonth Month DayofWeek
字段 | 秒 | 分 | 时 | 日 | 月 | 星期 | 年 |
---|---|---|---|---|---|---|---|
范围 | 1-59 | 1-59 | 0-23 | 1-31 | 1-12 | 1-7 | 自选年份 |
符号 | , - * / | , - * / | , - * / | , - * / ? L W C | , - * / | , - * / ? L C | * |
基本符号释义:
符号 | , | - | * | / |
---|---|---|---|---|
含义 | 枚举值 | 范围值 | 任意值 | 起始触发,后间隔触发 |
例子 | 5,60 在秒域表示5秒跟60秒都匹配 | 3-23 在时域表示3点到23点这个范围都匹配 | 在分域中表示,每分钟都匹配 | 5/20 在分域表示起始分钟为5触发,后每间隔20分再次触发 |
特殊符号释义
符号 | ? | L | W | LW | # | C |
---|---|---|---|---|---|---|
范围 | DayofMonth DayofWeek | DayofMonth | DayofMonth | 连用 | DayofWeek | DayofMonth DayofWeek |
含义 | DayofMonth 与 DayofWeek 冲突时使用 | 表示最后 | 表示有效的工作日 ; 匹配前后距离最近的工作日 | 表示某月最后一个工作日 | 每个月第几个星期几 | 需关联日历 |
例子 | 譬如指定了每个月20日执行,那么便不能指定具体的星期了,需用? | DayofWeek使用6L表示最后一个星期五 | 20L ; 假如20日是星期六,那么匹配19日 | LW;最后一个工作日 | 4#2; 某月第二个星期三 | 不常见,此处暂不举例 |
专有符号除了?以外,Spring定时任务都不支持使用
4 异步多线程使用定时任务
4.1 在启动类上使用@EnableAsync注解
@EnableScheduling @EnableAsync @SpringBootApplication public class OpenServiceApplication { public static void main(String[] args) { SpringApplication.run(OpenServiceApplication.class, args); } }
4.2 在方法上使用@Async注解
@Scheduled(cron = "0 */5 * * * ?") @Async public void demo() throws Exception { log.info("线程名称为:"+Thread.currentThread().getName()); System.out.println("在这里提醒朋友们,反复执行这是不同的线程"); }