定时任务与分布式任务

一、定时任务

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 lqs0911@qq.com
 * @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/

posted @ 2023-01-31 12:13  冰枫丶  阅读(46)  评论(0编辑  收藏  举报