一、定时任务
1、cron 表达式
语法: 秒 分 时 日 月 周 年(Spring 不支持年)
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
特殊字符:
,: 枚举;
(cron="7,9,23 * * * * ?"): 任意时刻的 7,9, 23 秒启动这个任务;
-: 范围;
(cron="7-20 * * * * ?"):任意时刻的 7-20 秒之间, 每秒启动一次
*: 任意;
指定位置的任意时刻都可以
/: 步长;
(cron="7/5 * * * * ?"): 第 7 秒启动, 每 5 秒一次;
(cron="*/5 * * * * ?"): 任意秒启动, 每 5 秒一次;
? :(出现在日和周几的位置) : 为了防止日和周冲突, 在周和日上如果要写通配符使用?
(cron="* * * 1 * ?"): 每月的 1 号, 启动这个任务;
L:(出现在日和周的位置) :last: 最后一个
(cron="* * * ? * 3L"): 每月的最后一个周二
W:Work Day: 工作日
(cron="* * * W * ?"): 每个月的工作日触发
(cron="* * * LW * ?"): 每个月的最后一个工作日触发
#:第几个
(cron="* * * ? * 5#2"): 每个月的第 2 个周 4
2、cron 示例
Expression | Meaning |
---|---|
0 0 12 * * ? | Fire at 12pm (noon) every day |
0 15 10 ? * * | Fire at 10:15am every day |
0 15 10 * * ? | Fire at 10:15am every day |
0 15 10 * * ? * | Fire at 10:15am every day |
0 15 10 * * ? 2005 | Fire at 10:15am every day during the year 2005 |
0 * 14 * * ? | Fire every minute starting at 2pm and ending at 2:59pm, every day |
0 0/5 14 * * ? | Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day |
0 0/5 14,18 * * ? | Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day |
0 0-5 14 * * ? | Fire every minute starting at 2pm and ending at 2:05pm, every day |
0 10,44 14 ? 3 WED | Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. |
0 15 10 ? * MON-FRI | Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday |
0 15 10 15 * ? | Fire at 10:15am on the 15th day of every month |
0 15 10 L * ? | Fire at 10:15am on the last day of every month |
0 15 10 L-2 * ? | Fire at 10:15am on the 2nd-to-last last day of every month |
0 15 10 ? * 6L | Fire at 10:15am on the last Friday of every month |
0 15 10 ? * 6L | Fire at 10:15am on the last Friday of every month |
0 15 10 ? * 6L 2002-2005 | Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005 |
0 15 10 ? * 6#3 | Fire at 10:15am on the third Friday of every month |
0 0 12 1/5 * ? | Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. |
0 11 11 11 11 ? | Fire every November 11th at 11:11am. |
3、SpringBoot 整合
定时任务:
1、@EnableScheduling 开启定时任务
2、@Scheduled开启一个定时任务
3、自动配置类 TaskSchedulingAutoConfiguration
/**
* @author Kisen
* @email [email protected]
* @date 2023/1/31 11:32
* @detail 定时任务
* 1、@EnableScheduling 开启定时任务
* 2、@Scheduled开启一个定时任务
* 3、自动配置类 TaskSchedulingAutoConfiguration
*/
@Slf4j
@Component
@EnableAsync
@EnableScheduling
public class HelloScheduled {
/**
* Spring中Cron表达式的区别:
* 1、在Spring中表达式是6位组成,不允许第七位的年份
* 2、在周几的的位置,1-7代表周一到周日,MON-SUN
* 3、定时任务不该阻塞。默认是阻塞的
* 1)、可以让业务以异步的方式,自己提交到线程池
CompletableFuture.runAsync(() -> {
xxxService.hello();
}, executor);
2)、支持定时任务线程池;设置 TaskSchedulingProperties
spring.task.scheduling.pool.size: 5
3)、让定时任务异步执行
异步任务:
1、@EnableAsync:开启异步任务
2、@Async:给希望异步执行的方法标注
3、自动配置类 TaskExecutionAutoConfiguration 属性绑定在TaskExecutionProperties
spring.task.execution.pool.core-size: 5
spring.task.execution.pool.max-size: 50
解决:使用异步任务 + 定时任务来完成定时任务不阻塞的功能
*
*/
@Async
@Scheduled(cron = "* * * ? * 2")
public void hello() throws InterruptedException {
log.info("hello...");
TimeUnit.SECONDS.sleep(3);
}
}
二、分布式定时任务
1、定时任务问题
1)、同时执行导致的重复
由于同样的服务会部署多个节点,多个节点的定时任务代码可能同时启动。将同样的事情做了多次
使用分布式锁。
2)、任务拆分并发执行
使用 ElasticJob
2、扩展-分布式调度
http://elasticjob.io/docs/elastic-job-cloud/00-overview/
标签:10,15,Fire,任务,every,定时,day,分布式 From: https://www.cnblogs.com/yydscn/p/17078568.html