mirror of
https://github.com/CommunityOx/ox_lib.git
synced 2026-08-17 06:56:03 +01:00
feat(cron): add maxDelay property to control task execution delay (#708)
This commit is contained in:
@@ -27,6 +27,7 @@ setmetatable(currentDate, {
|
|||||||
---@field id number
|
---@field id number
|
||||||
---@field debug? boolean
|
---@field debug? boolean
|
||||||
---@field lastRun? number
|
---@field lastRun? number
|
||||||
|
---@field maxDelay? number Maximum allowed delay in seconds before skipping (0 to disable)
|
||||||
|
|
||||||
---@class OxTask : OxTaskProperties
|
---@class OxTask : OxTaskProperties
|
||||||
---@field expression string
|
---@field expression string
|
||||||
@@ -284,7 +285,7 @@ function OxTask:getNextTime()
|
|||||||
|
|
||||||
if self.lastRun and nextTime - self.lastRun < 60 then
|
if self.lastRun and nextTime - self.lastRun < 60 then
|
||||||
if self.debug then
|
if self.debug then
|
||||||
print(('Preventing duplicate execution of task %s - Last run: %s, Next scheduled: %s'):format(
|
lib.print.debug(('Preventing duplicate execution of task %s - Last run: %s, Next scheduled: %s'):format(
|
||||||
self.id,
|
self.id,
|
||||||
os.date('%c', self.lastRun),
|
os.date('%c', self.lastRun),
|
||||||
os.date('%c', nextTime)
|
os.date('%c', nextTime)
|
||||||
@@ -353,13 +354,25 @@ function OxTask:scheduleTask()
|
|||||||
local sleep = runAt - currentTime
|
local sleep = runAt - currentTime
|
||||||
|
|
||||||
if sleep < 0 then
|
if sleep < 0 then
|
||||||
return self:stop(self.debug and ('scheduled time expired %s seconds ago'):format(-sleep))
|
if not self.maxDelay or -sleep > self.maxDelay then
|
||||||
|
return self:stop(self.debug and ('scheduled time expired %s seconds ago'):format(-sleep))
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.debug then
|
||||||
|
lib.print.debug(('Task %s is %s seconds overdue, executing now due to maxDelay=%s'):format(
|
||||||
|
self.id,
|
||||||
|
-sleep,
|
||||||
|
self.maxDelay
|
||||||
|
))
|
||||||
|
end
|
||||||
|
|
||||||
|
sleep = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
local timeAsString = self:getTimeAsString(runAt)
|
local timeAsString = self:getTimeAsString(runAt)
|
||||||
|
|
||||||
if self.debug then
|
if self.debug then
|
||||||
print(('(%s) task %s will run in %d seconds (%0.2f minutes / %0.2f hours)'):format(timeAsString, self.id, sleep,
|
lib.print.debug(('(%s) task %s will run in %d seconds (%0.2f minutes / %0.2f hours)'):format(timeAsString, self.id, sleep,
|
||||||
sleep / 60,
|
sleep / 60,
|
||||||
sleep / 60 / 60))
|
sleep / 60 / 60))
|
||||||
end
|
end
|
||||||
@@ -367,13 +380,13 @@ function OxTask:scheduleTask()
|
|||||||
if sleep > 0 then
|
if sleep > 0 then
|
||||||
Wait(sleep * 1000)
|
Wait(sleep * 1000)
|
||||||
else
|
else
|
||||||
Wait(1000)
|
Wait(0)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.isActive then
|
if self.isActive then
|
||||||
if self.debug then
|
if self.debug then
|
||||||
print(('(%s) running task %s'):format(timeAsString, self.id))
|
lib.print.debug(('(%s) running task %s'):format(timeAsString, self.id))
|
||||||
end
|
end
|
||||||
|
|
||||||
Citizen.CreateThreadNow(function()
|
Citizen.CreateThreadNow(function()
|
||||||
@@ -400,10 +413,10 @@ function OxTask:stop(msg)
|
|||||||
|
|
||||||
if self.debug then
|
if self.debug then
|
||||||
if msg then
|
if msg then
|
||||||
return print(('stopping task %s (%s)'):format(self.id, msg))
|
return lib.print.debug(('stopping task %s (%s)'):format(self.id, msg))
|
||||||
end
|
end
|
||||||
|
|
||||||
print(('stopping task %s'):format(self.id))
|
lib.print.debug(('stopping task %s'):format(self.id))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -413,6 +426,7 @@ end
|
|||||||
---Creates a new [cronjob](https://en.wikipedia.org/wiki/Cron), scheduling a task to run at fixed times or intervals.
|
---Creates a new [cronjob](https://en.wikipedia.org/wiki/Cron), scheduling a task to run at fixed times or intervals.
|
||||||
---Supports numbers, any value `*`, lists `1,2,3`, ranges `1-3`, and steps `*/4`.
|
---Supports numbers, any value `*`, lists `1,2,3`, ranges `1-3`, and steps `*/4`.
|
||||||
---Day of the week is a range of `1-7` starting from Sunday and allows short-names (i.e. sun, mon, tue).
|
---Day of the week is a range of `1-7` starting from Sunday and allows short-names (i.e. sun, mon, tue).
|
||||||
|
---@note maxDelay: Maximum allowed delay in seconds before skipping (0 to disable)
|
||||||
function lib.cron.new(expression, job, options)
|
function lib.cron.new(expression, job, options)
|
||||||
if not job or type(job) ~= 'function' then
|
if not job or type(job) ~= 'function' then
|
||||||
error(("expected job to have type 'function' (received %s)"):format(type(job)))
|
error(("expected job to have type 'function' (received %s)"):format(type(job)))
|
||||||
@@ -431,6 +445,7 @@ function lib.cron.new(expression, job, options)
|
|||||||
task.id = #tasks + 1
|
task.id = #tasks + 1
|
||||||
task.job = job
|
task.job = job
|
||||||
task.lastRun = nil
|
task.lastRun = nil
|
||||||
|
task.maxDelay = task.maxDelay or 1
|
||||||
tasks[task.id] = task
|
tasks[task.id] = task
|
||||||
task:run()
|
task:run()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user