2019独角兽企业重金招聘Python工程师标准>>>

博文原址:对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数据保存到数据库里,只有启动的时候才会创建jobDetailtrigger并由scheduler来启动job。

重写XxlJobDynamicScheduleraddJob方法:根据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 keyTriggerKey triggerKey = TriggerKey.triggerKey(jobName);JobKey jobKey = new JobKey(jobName);// 2、valid triggerif(scheduler.checkExists(triggerKey)) {return true;}// 3.1、corn triggerTrigger 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 triggerif (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 triggerif(Objects.isNull(trigger)) {return true;}// 4、job detailClass<? 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 jobDate date = scheduler.scheduleJob(jobDetail, trigger);logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, trigger:{}, date:{}", jobDetail, trigger, date);return true;}

效果图

可以看到将数据库里3任务改为间隔3秒,job_repeat_count为1,任务实际会执行2次。

额外的工作

  1. 虽然支持cron或simple,但是在控制台节目只能维护cron的trigger,并且优先cron,同时cron设为可以为空,但是管理平台上没有simple的相关数据,如果需要的话要重新修改对应的页面和add和update的逻辑;
  2. job状态取的是trigger的状态,所以可能看到的是simpleTrigger的状态。
  3. 目前job的trigger是在cron和simple中二者取一,但是也可以扩展启动任务的方法,使其支持扩展多trigger,但是triggerKey需要重新定义而非取jobName(因为trigger的hash是triggerKey的hash),本身xxl-job的jobKey取的是job的id,triggerKey取的也是job的id,没有使用到groupName。

欢迎

关注了解最新动态更新

转载于:https://my.oschina.net/damonchow/blog/3047308

对xxl-job进行simpleTrigger并动态创建任务扩展相关推荐

  1. SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:毅大师 blog.csdn.net/qq_39648 ...

  2. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  3. Javascript:DOM动态创建元素实例应用

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  4. 新建异常并处理java_java – 动态创建异常的工厂模式

    我创建了Exception xml并动态创建并抛出异常. com.package.CheckedException Checked Exception Message com.package.UnCh ...

  5. Angular动态创建组件之Portals

    本文主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的内容.如:Angular多级依赖注入.ViewContainerRef,Portal ...

  6. asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性

    asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false;  // true 因为这样该容器及其子控件会彻底的从页面上消 ...

  7. [原]动态创建Web控件制做计算器

    最近参加了Web基础开发的培训,收获不少,做了一个练习,在后台动态创建控件制作了一个简单功能的计算器.程序中控件创建好以后,往往不能放在想要的位置,前台的布局非常麻烦,我用Table.TableRow ...

  8. 《深入浅出MFC》系列之动态创建

    /*************************************************************************************************** ...

  9. Android应用开发—TextView的动态创建

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/voidreturn/article/details/77131800 动态创建TextView的两种 ...

最新文章

  1. java B2B2C springmvc mybatis多租户电子商城系统-Spring Cloud Feign
  2. Extjs中给同一个GridPanel中的事件添加参数的方法
  3. 在大数据时代下金融风控的分类
  4. [PL/SQL]使用存储过程实现导出指定数据到文件(仿EXP)|转|
  5. 记一个linux内核内存提权问题
  6. yolov3识别的类别_Gaussian YOLOv3:一个更强的YOLOv3,现已开源!
  7. rpm软件包管理的详细解读
  8. 实现二叉树的基本操作(Java版)
  9. 一个简单的SQL最优写法讨论(1)
  10. 笑死,小米新logo是这么来的
  11. 粗略写了使用GD2制作文字图像demo
  12. sentaurus的SDE仿真基本流程
  13. 小程序文档整理之 -- API(开放接口)
  14. apple pay,--牛逼,
  15. android 抠图功能,Android抠图工具,天天P图
  16. 广州app开发:移动app排行榜出炉
  17. python django怎么读_怎么读django
  18. 中文自然语言处理测评数据集、基准模型、语料库、排行榜整理分享
  19. Jetbrains IDEA 打不开的解决方法(多次重装IDEA,突然打不开)
  20. EasyExcel CellWriteHandler注入CellStyle不生效问题

热门文章

  1. [20161229]linux下使用oclumon命令(rac)
  2. mySQL优化 my.ini 配置说明
  3. 为什么科研总会走弯路【转】
  4. [zz]ZeroMQ 的模式
  5. 写一个比较全的进制转换函数--ic
  6. Base64编码和解码
  7. Vue的自定义滚动,我用el-scrollbar
  8. golang 编译后文件过大问题处理
  9. 基于Kubernetes构建现代大数据管道
  10. 利用 BASE64Encoder 对字符串进行加密 BASE64Decoder进行解密