业务需求

  1. 长时间不传数据终端标记下线
  2. 终端数据日报,月报,及大数据相关定时统计需求
  3. 数据清理

可用方案

  • 方案1:直接使用springboot的job 缺点:无法实现分布式调度,分布式环境下任务可能会被重复执行,无法手动调用
  • 方案2:对job写接口,然后接口通过linx系统级cron调用 缺点:依赖系统,依赖http对于时间比较长的任务不太友好,不方便统一的http相关参数配置
  • 方案3(选用):使用定时任务框架,下面是一个常用的开源框架对比图,lts,和xxl-job都在之前公司用过,由于LTS不支持分片,且已多年不维护,放弃,elastic-job及saturn均需要使用zookeeper做为分布式调度,目前系统没有微服务相关建设,故也放弃,最终选定使用xxl-job
    4f58bc69a18a2624eb346b3a487bf230.png

xxl-job搭建及使用

服务端配置

  • 初始化数据库,/xxl-job/docdbtables_xxl_jobsql,直接导入数据库
  • 下载源码,更改配置文件中的数据库连接打包测试
  • 测试没问题后打jar包布到服务器
  • 相关优化
    1. 去掉mail相关配置及依赖,后续有时间实现企业微信群报警
    2. 调整日志显示和其他业务相同
    3. 调整路径为/job
    4. 调整端口为不常用端口

客户端配置

  • 配置客户端,向服务器注册执行器,由于当前仅1个业务服务,只需要一个执行器
  • 添加切面用于统计traceId
  • 添加BaseJob接口,用于统一管理JOB

业务JOB代码编写

  • 在业务模块Job包下新增以Job结尾的类,实现BaseJob类runJob接口方法
  • 在实现类的runJob方法上添加@XxlJob注解,value为JobHandler名
  • 在JobEnum里添加一项用于标记此定时任务做用
  • 在实现类的runJob方法上添加@EnumFixedValue注解,@EnumFixedValue(value = 1,strValues = "TestJob",relatedEnum = JobEnum.class),value为JobEnum code,strValues为JobHandler