基於RAMJobStore開發Quartz Scheduler調度器列表

trigger各狀態說明:java

None:Trigger已經完成,且不會在執行,或者找不到該觸發器,或者Trigger已經被刪除 NORMAL:正常狀態 PAUSED:暫停狀態 COMPLETE:觸發器完成,可是任務可能還正在執行中 BLOCKED:線程阻塞狀態 ERROR:出現錯誤spring

計劃中的任務express

指那些已經添加到quartz調度器的任務,由於quartz並無直接提供這樣的查詢接口,因此咱們須要結合JobKey和Trigger來實現,核心代碼:異步

Scheduler scheduler = schedulerFactoryBean.getScheduler();
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
for (JobKey jobKey : jobKeys) {
    List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
    for (Trigger trigger : triggers) {
        ScheduleJob job = new ScheduleJob();
        job.setJobName(jobKey.getName());
        job.setJobGroup(jobKey.getGroup());
        job.setDesc("觸發器:" + trigger.getKey());
        Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
        job.setJobStatus(triggerState.name());
        if (trigger instanceof CronTrigger) {
            CronTrigger cronTrigger = (CronTrigger) trigger;
            String cronExpression = cronTrigger.getCronExpression();
            job.setCronExpression(cronExpression);
        }
        jobList.add(job);
    }
}

上面代碼中的jobList就是咱們須要的計劃中的任務列表,須要注意一個job可能會有多個trigger的狀況,在下面講到的當即運行一次任務的時候,會生成一個臨時的trigger也會出如今這。這裏把一個Job有多個trigger的狀況當作是多個任務。咱們前面包括在實際項目中通常用到的都是CronTrigger ,因此這裏咱們着重處理了下CronTrigger的狀況工具

Scheduler scheduler = schedulerFactoryBean.getScheduler();
List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());
for (JobExecutionContext executingJob : executingJobs) {
    ScheduleJob job = new ScheduleJob();
    JobDetail jobDetail = executingJob.getJobDetail();
    JobKey jobKey = jobDetail.getKey();
    Trigger trigger = executingJob.getTrigger();
    job.setJobName(jobKey.getName());
    job.setJobGroup(jobKey.getGroup());
    job.setDesc("觸發器:" + trigger.getKey());
    Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
    job.setJobStatus(triggerState.name());
    if (trigger instanceof CronTrigger) {
        CronTrigger cronTrigger = (CronTrigger) trigger;
        String cronExpression = cronTrigger.getCronExpression();
        job.setCronExpression(cronExpression);
    }
    jobList.add(job);
}

當即運行任務測試

這裏的當即運行,只會運行一次,方便測試時用。quartz是經過臨時生成一個trigger的方式來實現的,這個trigger將在本次任務運行完成以後自動刪除。trigger的key是隨機生成的,例如:DEFAULT.MT_4k9fd10jcn9mg。在個人測試中,前面的DEFAULT.MT是固定的,後面部分才隨機生成ui

Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
scheduler.triggerJob(jobKey);

更新任務的時間表達式線程

更新以後,任務將當即按新的時間表達式執行:code

Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
    scheduleJob.getJobGroup());
//獲取trigger,即在spring配置文件中定義的 bean id="myTrigger"
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//表達式調度構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob
    .getCronExpression());
//按新的cronExpression表達式從新構建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
    .withSchedule(scheduleBuilder).build();
//按新的trigger從新設置job執行
scheduler.rescheduleJob(triggerKey, trigger);

對於quartz的操做實際上是能夠封裝成一個簡單的工具輔助類接口

/**
 * 建立定時任務
 *
 * @param scheduler the scheduler
 * @param jobName the job name
 * @param jobGroup the job group
 * @param cronExpression the cron expression
 * @param isSync the is sync
 * @param param the param
 */
public static void createScheduleJob(Scheduler scheduler, String jobName, String jobGroup,
                                     String cronExpression, boolean isSync, Object param) {
    //同步或異步
    Class<? extends Job> jobClass = isSync ? JobSyncFactory.class : JobFactory.class;
    //構建job信息
    JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
    //放入參數,運行時的方法能夠獲取
    jobDetail.getJobDataMap().put(ScheduleJobVo.JOB_PARAM_KEY, param);
    //表達式調度構建器
    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
    //按新的cronExpression表達式構建一個新的trigger
    CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup)
        .withSchedule(scheduleBuilder).build();
    try {
        scheduler.scheduleJob(jobDetail, trigger);
    } catch (SchedulerException e) {
        LOG.error("建立定時任務失敗", e);
        throw new ScheduleException("建立定時任務失敗");
    }
}
相關文章
相關標籤/搜索