| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- --[[
- Adds a repeatable job
- Input:
- KEYS[1] 'repeat' key
- KEYS[2] 'delayed' key
-
- ARGV[1] next milliseconds
- ARGV[2] msgpacked options
- [1] name
- [2] tz?
- [3] pattern?
- [4] endDate?
- [5] every?
- ARGV[3] legacy custom key TODO: remove this logic in next breaking change
- ARGV[4] custom key
- ARGV[5] prefix key
- Output:
- repeatableKey - OK
- ]]
- local rcall = redis.call
- local repeatKey = KEYS[1]
- local delayedKey = KEYS[2]
- local nextMillis = ARGV[1]
- local legacyCustomKey = ARGV[3]
- local customKey = ARGV[4]
- local prefixKey = ARGV[5]
- -- Includes
- --- @include "includes/removeJob"
- local function storeRepeatableJob(repeatKey, customKey, nextMillis, rawOpts)
- rcall("ZADD", repeatKey, nextMillis, customKey)
- local opts = cmsgpack.unpack(rawOpts)
- local optionalValues = {}
- if opts['tz'] then
- table.insert(optionalValues, "tz")
- table.insert(optionalValues, opts['tz'])
- end
- if opts['pattern'] then
- table.insert(optionalValues, "pattern")
- table.insert(optionalValues, opts['pattern'])
- end
- if opts['endDate'] then
- table.insert(optionalValues, "endDate")
- table.insert(optionalValues, opts['endDate'])
- end
-
- if opts['every'] then
- table.insert(optionalValues, "every")
- table.insert(optionalValues, opts['every'])
- end
- rcall("HMSET", repeatKey .. ":" .. customKey, "name", opts['name'],
- unpack(optionalValues))
- return customKey
- end
- -- If we are overriding a repeatable job we must delete the delayed job for
- -- the next iteration.
- local prevMillis = rcall("ZSCORE", repeatKey, customKey)
- if prevMillis then
- local delayedJobId = "repeat:" .. customKey .. ":" .. prevMillis
- local nextDelayedJobId = repeatKey .. ":" .. customKey .. ":" .. nextMillis
- if rcall("ZSCORE", delayedKey, delayedJobId)
- and rcall("EXISTS", nextDelayedJobId) ~= 1 then
- removeJob(delayedJobId, true, prefixKey, true --[[remove debounce key]])
- rcall("ZREM", delayedKey, delayedJobId)
- end
- end
- -- Keep backwards compatibility with old repeatable jobs (<= 3.0.0)
- if rcall("ZSCORE", repeatKey, legacyCustomKey) ~= false then
- return storeRepeatableJob(repeatKey, legacyCustomKey, nextMillis, ARGV[2])
- end
- return storeRepeatableJob(repeatKey, customKey, nextMillis, ARGV[2])
|