使用方法
直接上代码:
--新建cron对象
local c = cron.Cron()
--设置回调,不要让这个函数被阻塞
c:SetCallBack(function (_,name)
--回调函数返回的是这个cron的唯一名称
log.info("cron trigger", name)
--打印这个cron的配置
log.info("cron info", name, c:Get(name))
end)
sys.taskInit(function ()
--检查是否已经初始化(时间已同步)
--如果是2g模块,记得同步时间
while not c:Initial() do
log.info("initial","waiting")
sys.wait(1000)
end
log.info("cron initial", "done")
--每分钟执行一次
--负号代表*/
--Add: (name,min,day,mon,year,week)
--名称必须为唯一值
--时间参数均可为空,默认为-1
c:Add("test every 1 minute",-1,-1,-1,-1,-1)
--每两分钟执行一次
c:Add("test every 2 minutes",-2,-1,-1,-1,-1)
--每小时45分种时执行一次
c:Add("test at 45 minute",45,-1,-1,-1,-1)
--打印所有cron的配置
local list = c:List()
for i=1,#list do
log.info("cron info", list[i], c:Get(list[i]))
end
end)
库
点我下载cron.lua
源码
本库使用moonscript编写,点我下载cron.moon:
--定时器组件
module ..., package.seeall
export class Cron
--是否初始化完成
initial: false
--待处理的事件篮子
basket: {}
--回调函数
cbFunc: nil
--是否开启
enable: true
--检查时间是否匹配
check = (set,time)->
if set < 0
return time%(-set) == 0
else
return set == time
--循环执行检查,一分钟一次
run: =>
sys.taskInit ->
next = (os.date "*t").sec
sys.wait (60-next)*1000
while true
return unless @enable--对象停止后结束任务
t = os.date "*t"
for i, v in pairs @basket
if (check v.min,t.min) and
(check v.day,t.day) and
(check v.mon,t.month) and
(check v.year,t.year) and
(check v.week,t.wday)
@cbFunc i if @cbFunc
next = (os.date "*t").sec
sys.wait (61-next)*1000--+1s
--定时器初始化
Initial: =>
return true if @initial
--开机后默认时间肯定是2020年之前
@initial = (os.date "*t").year >= 2020
@run! if @initial
@initial
--新建对象后的事件
--新建的时候顺带检查一下初始化状态
new: =>
@Initial!
--设置回调函数
--定时器触发后,会调用该函数
SetCallBack: (func) =>
@cbFunc = func
--添加要执行的cron事件
--name为定时器名称,唯一值,不可重复
Add: (name,min=-1,hour=-1,day=-1,mon=-1,year=-1,week=-1) =>
@basket[name] = {:min,:hour,:day,:mon,:year,:week}
--去掉cron事件
--name为定时器名称,唯一值,不可重复
Del: (name) =>
@basket[name] = nil
--查看cron事件配置
--name为定时器名称,唯一值,不可重复
Get: (name) =>
return unless @basket[name]
@basket[name].min,@basket[name].day,@basket[name].mon,@basket[name].year,@basket[name].week
--获取cron名称列表
List: =>
k = {}
for i in pairs @basket
table.insert k,i
k
--销毁对象,停止所有定时器任务
Distory: =>
@enable = nil