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("建立定時任務失敗"); } }