今天来给大家带来的是inBuilder低代码平台特性推荐系列第八期——定时任务!
inBuilder计划任务框架支持快速开发,任务开发完成后,只需发布成bean,并通过配置界面绑定所需触发器,即可到点触发。
一、 概念介绍
定时任务,简要说明就是在指定时间触发执行某个动作。
任务(Job):任务是真正执行体,承载着具体的业务逻辑。
触发器(Tigger): 触发器记录着调度任务的时间规则,Trigger主要包括两种:SimpleTrigger和CronTrigger。
调度器(Scheduler) : 调度器管理了所有的任务和触发器,并负责整个定时系统的调度。
二、 调度任务
在服务启动时,当前服务器默认不会加载系统内的任务。如果想让当前服务器运行任务,需要先将“/server(jstack)/config/platform/common/sys_schedule.json”文件中的开关设置为true。
三、 任务状态
调度任务状态主要分为以下四个:
停止:任务未启动
准备:任务准备执行
启动:任务已被调度服务管理,并在规定时间执行
失败:任务启动失败
“准备”大家可以理解为将要执行,但是还没被调度服务所管理。
任务查询时会判断准备状态任务实际运行状态。只有状态为准备,并已经被任务调度器所管理的任务才会显示为启动。
所以,准备状态ready一般有两个原因:
1.不存在调度服务器,任务根本没有启动。
2.存在调度服务器,但任务查询请求访问的为非调度调度器,无法依赖任务调度器判断任务是否已被管理。(这也是任务操作为什么要直连调度服务器的原因)
四、 开发相关要求
1. 构件逻辑内应避免多线程
inBuilder平台每个定时任务的调度均在各自的线程内进行,线程分配时、销毁时的上下文进行统一管理,构件内开启多线程会导致构件内线程无法获取上下文的情形,因此应避免。
2. 构件应为无状态的构件任务
inBuilder平台定时任务已经支持分布式负载,同一个定时任务的相邻两次间隔很有可能分发在两个不同计算节点上进行,因此构件本身不能依赖上次执行后缓存在计算节点内存中的数据,即构件无状态。
3. 构件任务内不允许吞异常
inBuilder平台定时任务已经支持异常捕获,关键的异常信息可以以RuntimeException的类型扔出来 框架捕捉后会统一记录到执行日志中,直接在前端进行查看。
五、 开发示例
1. 场景介绍
商品字典单价定时同步至未提交的销售订单。
2. 运行时效果及要求
每一分钟同步一次。
同步时只将商品的单价同步至销售订单即可。
3. 开发步骤
01开启计划任务: 启动服务之前,确保以下文件中计划任务的可用配置已开启。
/server/config/platform/common/sys_schedule.json中ScheduleCenter改为true
02任务定义
菜单路径:【系统公共】-【系统配置】-【调度任务】-【任务管理】。
任务管理页面如图所示。左侧列表展示当前系统支持或已预置的任务类型,右侧列表展示当前任务类型下的任务信息。
点击【新增】按钮,进入单任务详情界面,输入任务编号、任务名称,选择定时器。
点击【选择】进入定时器选择列表界面,可以选择已经有的定时器,也可以新增定时器,我们点击【新增】进入定时器定义界面,完成定时器编辑之后选中该定时器。
【任务信息】,定义完成通用构件之后,可以选择补充。
03 通用构件定义
打开商品业务对象,在该业务对象新建通用构件。
进入通用构件设计器界面,填写应用、服务单元、版本等信息,方法列表中点击新增填写方法编号GoodToOrder、名称商品单价同步销售订单管理,入参和返回值本例未使用不用维护。
用idea打开通用构件所在maven工程,编写代码逻辑。
在通用构件同目录下新建java文件,将其器发布成bean。
04 单任务配置通用构件配置
方法编码为通用构件的方法编码,元数据标识为通用构件发布的元数据ID,组件名称为通用构件的名称;对象参数为通用构件执行方法需要传递的参数。对象参数中若包含多个参数,使用英文逗号隔开,若包含数组则使用英文中括号括起。
05 查看执行结果
启动服务,查看日志,并可以通过详细信息查看详细执行情况。
查看调度日志,可以看到任务执行完成等事件,代表定时任务执行成功。
欢迎大家下载inBuilder开源社区版,免费试用体验。