Cron定时执行库

使用方法

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
--新建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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
--定时器组件
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

上次更新 2021-01-28