Scheduling jobs on a Sails.js application
In one of my projects there was the need to put scheduled tasks on my Sails.js application. Agenda and node-schedule are the tools of my choice when scheduling jobs on a node.js app. What we are gona cover is adding scheduling to our Sails.js application using node-schedule and agenda.
To get started let’s create our application
sails new SailsScheduling cd SailsScheduling
My approach to use node-schedule is to add some configuration on the bootstrap.js file.
npm install node-schedule --save
We will add a service to our Sails.js application. Services on a Sails.js application reside on the api/services/ path. Suppose that we implement a service that will send emails
/**
* Created by gkatzioura on 6/20/16.
*/
var send = function (text,callback) {
sails.log.info("Should send text: "+text)
callback();
};
module.exports = {
send: send
}Then we add our job triggering code on bootstrap.js.
/**
* Bootstrap
* (sails.config.bootstrap)
*
* An asynchronous bootstrap function that runs before your Sails app gets lifted.
* This gives you an opportunity to set up your data model, run jobs, or perform some special logic.
*
* For more information on bootstrapping your app, check out:
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.bootstrap.html
*/
var scheduler = require('node-schedule');
module.exports.bootstrap = function(cb) {
// It's very important to trigger this callback method when you are finished
// with the bootstrap! (otherwise your server will never lift, since it's waiting on the bootstrap)
var emailService = EmailService;
var minuteJob = scheduler.scheduleJob('* * * * *', function(){
EmailService.send("Random text",function (err, result) {
sails.log.info("Job executed")
});
});
cb();
};The next example would use agenda. Instead of rolling out our own configuration we will use sails-hook-jobs which integrates wonderfully to our sails application as a grunt task.
npm install mongodb@~1.4 --save npm install sails-hook-jobs --save
We need mongodb 1.4 version for mongo-skin.
Agenda is backed by mongodb. For docker users you can issue
docker run --name some-mongo -d mongo
and have a mongodb server up and running.
Next step is creating the file config/jobs.js containing the configuration.
/**
* Default jobs configuration
* (sails.config.jobs)
*
* For more information using jobs in your app, check out:
* https://github.com/vbuzzano/sails-hook-jobs
*/
module.exports.jobs = {
// Where are jobs files
"jobsDirectory": "api/jobs",
// agenda configuration.
// for more details about configuration,
// check https://github.com/rschmukler/agenda
"db": {
"address" : "localhost:27017/jobs",
"collection" : "agendaJobs"
},
"name": "process name",
"processEvery": "10 seconds",
"maxConcurrency": 20,
"defaultConcurrency": 5,
"defaultLockLifetime": 10000
};Next step is to create the directory jobs on our api folder. In order to add a job we should create a javascript source file on the api/jobs folder. You file should have the ending Job.js. Pay special attention to this, you do not want to spend hours on figuring out what went wrong like I did.
Our job would send an email every five minutes.
module.exports = function(agenda) {
var job = {
frequency: 'every 5 minutes',
run: function(job, done) {
EmailService.send("Test email",function (err,result) {
if(err) {
sails.log.error("Job was not executed properly");
done(err);
} else {
sails.log.info("Agenda job was executed");
done();
}
});
},
};
return job;
}All in all there are definitely more tools out there for Sails.js scheduling. My personal choice is agenda, due to its approach on managing your jobs and integrating as a sails task.
You can find the source code on github.
| Reference: | Scheduling jobs on a Sails.js application from our WCG partner Emmanouil Gkatziouras at the gkatzioura blog. |

