简述
定时任务模块是为了方便管理员更好地管理一些需要定时执行的任务,比如可能在某段时间需要周期性地执行发送提醒消息,但有可能又要临时控制这周期性任务的终止或重启,或者是需要立即执行任务。通常一个系统管理后台如果提供了管理界面去定时调度或立即执行任务,会让系统更容易维护。
jeecg的定时任务实现
截图是jeecg的“定时任务”模块查看某条任务时的详情信息,列出了配置一条定时任务的关键字段。任务ID用于任务调度器唯一标识该任务,对任务的启动或停止就靠它来找到任务了。cron表达式是设定任务何时执行,而任务类名是任务执行时要运行的代码。“执行服务器IP”和“远程主机”则提供了多机环境下在别的机器定时执行的能力。这些数据最后都会持久化到数据库里,表名为 t_s_timetask 。
下面我们看下关键代码。对列表的增删改查的代码与其他模块差不多,关键逻辑在于定时任务是怎么初始化和定时执行的。在 TimeTaskController 类,我们可以找到一个关键的类 DynamicTask 。
上图左侧是这个类的结构,右侧是 startTask( ) 方法的主要代码。从方法代码中可看到,这里其实是引入了 Spring 封装的对 Quartz 调度框架的使用,如果大家对 Quartz 框架有点了解的话,应该很容易理解这个类的逻辑。结合代码跟注释,相信大家会较易理解 jeecg 是怎么初始化定时任务,增删改时又是怎样更新计划任务的。
一些思考
jeecg 提供了简单的定时任务管理模块的基本实现,如果不是要做高大上的管理,只是需要一个方便操作的入口,就已经够用了。当然,很多时候,我们不会满足于这么简单的功能,需要额外增加适合自己项目需求的功能,这时候就可以参考已有的实现进一步扩展完善。我以前接触过的系统,一般会加上手工触发任务、记录运行状态、查看运行结果等等功能。远程配置或者定时远程执行这个功能对于多机环境还是比较有用的,但像 jeecg 框架通过暴露公共接口的方式来实现,就要加上权限校验的逻辑了,安全问题往往是比较容易忽略的。