Allows functions to run at set times, taking into consideration multi-server environments for hassle free scheduling.
Works well with Jobs.
First ensure you have RediBox installed.
Install Schedule via npm:
npm install redibox-hook-schedule --save
Within your redibox
config, we'll setup a new schedule
object containing a schedules
array. Each array item consists of a runs
function, data
and an interval
.
-
runs [Function/String] A function or string (a globally available function as a dot notated string i.e. some.fooBar function which would resolve to global.some.fooBar automatically).
-
data [Array/Object/Primitive] Any data to pass along to each schedule function.
-
interval [String] A string of the interval time, compatible with Later.js.
-
multi [Boolean]
- default:
false
Iftrue
, the schedule will run on every server. Iffalse
it'll be locked to a single server only.
- default:
{
schedule: {
schedules: [
runs: function(schedule) {
// do something every 5 minutes
console.log('The value of foo is: ' + schedule.data.foo);
},
data: {
foo: 'bar',
},
interval: 'every 5 minutes',
],
},
}
If passing in a function directly (like above), the schedule is available to the runs
function as the first argument, where the data can be accessed via schedule.data
.
Under the hood, the schedule uses Later. If a schedule is set to run every 1 minute
, it will run on the minute, every minute. This ensures uniform schedules across multiple environments. It does not run 1 minute after the server booted.
Typically a large application will deploy many servers running the same code base. As expected the schedule will run on each individual server. If you have 20 servers deployed, and a schedule runs every minute to query an external API then update your database, you don't want 20 servers doing this at once.
Luckily, by default only a single server can only run a schedule at any one time. This is handled by utilising Redis locks. Once a schedule is picked up by a server, it is locked on Redis and cannot be run again until it is unlocked (which is performed automatically).
There might be however use cases where running a scheduled task across all servers is required. In this case, simply set the multi
option to true
on the schedule object.
MIT