您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何對xxl-job進行simpleTrigger并動態創建任務擴展的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
需求上要求能實現quartz的simpleTrigger任務,同時還需要動態的創建任務而非在控制面板上創建,查閱xxl-job官方文檔發現simpelTrigger其暫時還躺在to do list,而動態創建可以調用
JobInfoController
其add和start接口(但是有個弊端,start/stop/remove等方法都只要求傳送id,這點上可以自己擴展接口實現),還需要放開登錄權限,接下來就老夫上去就上一梭子,開干。
CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` ( `id` int(11) NOT NULL AUTO_INCREMENT, `job_group` int(11) NOT NULL COMMENT '執行器主鍵ID', `job_cron` varchar(128) DEFAULT NULL COMMENT '任務執行CRON', `job_desc` varchar(255) NOT NULL, `add_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, `author` varchar(64) DEFAULT NULL COMMENT '作者', `alarm_email` varchar(255) DEFAULT NULL COMMENT '報警郵件', `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '執行器路由策略', `executor_handler` varchar(255) DEFAULT NULL COMMENT '執行器任務handler', `executor_param` varchar(512) DEFAULT NULL COMMENT '執行器任務參數', `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞處理策略', `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任務執行超時時間,單位秒', `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失敗重試次數', `glue_type` varchar(50) NOT NULL COMMENT 'GLUE類型', `glue_source` mediumtext COMMENT 'GLUE源代碼', `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE備注', `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新時間', `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任務ID,多個逗號分隔', `ext_reamrk` varchar(255) DEFAULT NULL, `job_start_time` bigint(20) DEFAULT NULL COMMENT 'trigger開始時間于當前時間的時間間隔 單位毫秒\n', `job_end_time` datetime DEFAULT NULL COMMENT 'trigger結束時間', `job_repeat_count` bigint(7) DEFAULT '-1' COMMENT 'simple_trigger 執行次數 ', `job_repeat_interval` bigint(12) DEFAULT NULL COMMENT 'simple_trigger 時間間隔 單位毫秒', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
job_cron設為空,支持simpleTrigger;
ext_reamrk自定義擴展字段,可以根據它來刷選job從而避免start/stop/remove接口只有id作為參數;
job_repeat_count,simplerTrigger的執行次數,默認-1即為無限次,0的話是執行1次;
job_repeat_interval,simplerTrigger每次執行的時間間隔,單位毫秒;
job_start_time,trigger開始時間和當前時間的時間間隔,單位毫秒;
job_end_time,trigger結束時間
xxl-job在新建任務的時候只是把job數據保存到數據庫里,只有啟動的時候才會創建jobDetail
和trigger
并由scheduler
來啟動job。
重寫XxlJobDynamicScheduler
的addJob
方法:根據jobInfo中的值構建cron的trigger還是simple的trigger。
public static boolean addJob(XxlJobInfo xxlJobInfo) throws SchedulerException { String jobName = String.valueOf(xxlJobInfo.getId()); String cronExpression = xxlJobInfo.getJobCron(); Integer jobRepeatCount = xxlJobInfo.getJobRepeatCount(); Long jobRepeatInterval = xxlJobInfo.getJobRepeatInterval(); // 1、job key TriggerKey triggerKey = TriggerKey.triggerKey(jobName); JobKey jobKey = new JobKey(jobName); // 2、valid trigger if(scheduler.checkExists(triggerKey)) { return true; } // 3.1、corn trigger Trigger trigger = null; if (!StringUtils.isEmpty(cronExpression)) { CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); // withMisfireHandlingInstructionDoNothing 忽略掉調度終止過程中忽略的調度 TriggerBuilder<CronTrigger> builder = TriggerBuilder.newTrigger().withIdentity(triggerKey) .withSchedule(cronScheduleBuilder) .endAt(xxlJobInfo.getJobEndTime()); Optional.ofNullable(xxlJobInfo.getJobStartTime()) .ifPresent(start -> builder.startAt(new Date(System.currentTimeMillis() + start))); trigger = builder.build(); } else // 3.2、simple trigger if (Objects.nonNull(jobRepeatInterval) && Objects.nonNull(jobRepeatCount)) { SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(jobRepeatInterval) .withRepeatCount(jobRepeatCount); TriggerBuilder<SimpleTrigger> builder = TriggerBuilder.newTrigger().withIdentity(triggerKey) .withSchedule(simpleScheduleBuilder) .endAt(xxlJobInfo.getJobEndTime()); Optional.ofNullable(xxlJobInfo.getJobStartTime()) .ifPresent(start -> builder.startAt(new Date(System.currentTimeMillis() + start))); trigger = builder.build(); } // 3.3、valid trigger if(Objects.isNull(trigger)) { return true; } // 4、job detail Class<? extends Job> jobClass_ = RemoteHttpJobBean.class; // Class.forName(jobInfo.getJobClass()); JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build(); /*if (jobInfo.getJobData()!=null) { JobDataMap jobDataMap = jobDetail.getJobDataMap(); jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class)); // JobExecutionContext context.getMergedJobDataMap().get("mailGuid"); }*/ // 5、schedule job Date date = scheduler.scheduleJob(jobDetail, trigger); logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, trigger:{}, date:{}", jobDetail, trigger, date); return true; }
感謝各位的閱讀!關于“如何對xxl-job進行simpleTrigger并動態創建任務擴展”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。