Quartz(3-Scheduler)

相关文章链接

  1. 定时任务工具类(Cron Util)
  2. SpringBoot Task
  3. Quartz(1-Job)
  4. Quartz(2-Trigger)
  5. Quartz(3-Scheduler)

BaseCalendar

专门用于屏蔽一个时间区间,使 Trigger 在这个区间中不被触发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AnnualCalendar

排除每一年中指定的一天或多少天,精度是天

CronCalendar

使用表达式排除某些时间段不执行,精度取决于 Cron 表达式,最大精度到秒

DailyCalendar

指定的时间范围内的每一天不执行,指定每天的时间段,格式是 HH: MM [: SS[mmm]],即最大精度可以到毫秒

HolidayCalendar

排除节假日,精度到天

MonthlyCalendar

排除月份中的数天,可选值为 1-31,精度是天

WeeklyCalendar

排除星期中的一天或多天,可选值比如为:java.util.Calendar.SUNDAY,精度是天

基本使用

public class CalendarSchedule {
   
    public static void main(String[] args) throws SchedulerException {
   
        //创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                                .withIdentity("test")
                                .build();
        AnnualCalendar holidays = new AnnualCalendar();
        // 排除今天的时间 2017 年 11 月 27 日(月份是从 0~11 的)
        GregorianCalendar nationalDay = new GregorianCalendar(2017, 10, 27);  
        // 排除的日期,如果为 false 则为包含
        holidays.setDayExcluded(nationalDay,true); 

        Trigger simpleTrigger = TriggerBuilder.newTrigger()
                .withIdentity("testTrigger")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                              .withIntervalInSeconds(1)
                              .repeatForever()) //每一秒执行一次 job
                .modifiedByCalendar("holidays")   //将我们设置好的 Calander 与 trigger 绑定
                .build();
        
        //创建 Scheduler 实例
        StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = stdSchedulerFactory.getScheduler();
        //向 Scheduler 注册日历
        scheduler.addCalendar("holidays",holidays,false,false);
        //让 trigger 应用指定的日历规则
        scheduler.scheduleJob(jobDetail,simpleTrigger);
        scheduler.start();
    }
}

定时任务增删改查

参考 Scheduler 源码中的方法

通过配置文件定义每个任务的属性,项目启动后将每个任务加载到内存中,将其中一个任务用来监听配置文件的修改,当其修改后动态刷新任务

#定时任务
quartz:
  jobs:
    - name: myName #(随便取任务名)
      group: collect
      cron: 0 0/5 * * * ? *
      jobClass: com.gamer.me.quartz.jobs.MyJob #(自己的定时任务的执行类,也就是你写业务代码的类)
      desc: 我的任务
@Data
public class SchedulerJob {
   

    private String name;
    private String group;
    private String cron;
    private String jobClass;
    private String desc;
}
@Data
@Component
@ConfigurationProperties(prefix = "quartz")
public class SchedulerJobs {
   

    private List<SchedulerJob> jobs;
}
@Slf4j
@Component
public class SchedulerManager {
   

    @Autowired
    private Scheduler scheduler;

    /**
     * 激活任务
     * @param schedulerJob
     */
    public void activeJob(SchedulerJob schedulerJob){
   
        JobKey jobKey = JobKey.jobKey(schedulerJob.getName(), schedulerJob.getGroup());
        try {
   
            if (scheduler.checkExists(jobKey) && !MonitorCronJob.JOB_NAME.equals(schedulerJob.getName())) {
   
                updateJob(schedulerJob);
            }else {
   
                createJob(schedulerJob);
            }
        } catch (SchedulerException e) {
   
            logger.error("activeJob {}", e);
        }
    }

    /**
     * 创建任务并加入调度
     * @param schedulerJob
     */
    public void createJob(SchedulerJob schedulerJob){
   
        JobKey jobKey = JobKey.jobKey(schedulerJob.getName(), schedulerJob.getGroup());
        try {
   
            if (scheduler.checkExists(jobKey)) {
   
                return;
            }
            Class<?> clazz = Class.forName(schedulerJob.getJobClass());
            JobDetail jobDetail = getJobDetail(schedulerJob, (Class<Job>) clazz);
            Trigger cronTrigger = getCronTrigger(schedulerJob);
            //加入调度器
            scheduler.scheduleJob(jobDetail, cronTrigger);
        } catch (ClassNotFoundException | SchedulerException e) {
   
            logger.error("createJob {}", e);
        }
    }

    /**
     * 更新任务触发器
     * @param schedulerJob
     */
    public void updateJob(SchedulerJob schedulerJob){
   
        TriggerKey triggerKey = TriggerKey.triggerKey(schedulerJob.getName(), schedulerJob.getGroup());
        try {
   
            Trigger trigger = scheduler.getTrigger(triggerKey);
            if (trigger == null) {
   
                return;
            }
            JobKey jobKey = trigger.getJobKey()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值