如何对xxl-job进行simpleTrigger并动态创建任务扩展
这篇文章给大家分享的是有关如何对xxl-job进行simpleTrigger并动态创建任务扩展的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
业务场景
需求上要求能实现quartz的simpleTrigger任务,同时还需要动态的创建任务而非在控制面板上创建,查阅xxl-job官方文档发现simpelTrigger其暂时还躺在to do list,而动态创建可以调用
JobInfoController
其add和start接口(但是有个弊端,start/stop/remove等方法都只要求传送id,这点上可以自己扩展接口实现),还需要放开登录权限,接下来就老夫上去就上一梭子,开干。
job_info字段调整说明
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 忽略掉调度终止过程中忽略的调度 TriggerBuilderbuilder = 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 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并动态创建任务扩展"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!