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. |