📦 Add Trails service for running cron tasks
With yo :
npm install -g yo generator-trails
yo trails:trailpack trailpack-cron
With npm (you will have to create config file manually) :
npm install --save trailpack-cron
First you need to add this trailpack to your main configuration :
// config/main.js
module.exports = {
...
packs: [
...
require('trailpack-cron'),
...
]
...
}
Static jobs can be added on config/cronjs` :
// config/cron.js
module.exports = {
jobs: {
myJob: {
schedule: '* * * * * *',
onTick: function (app) {
app.log.info('I am ticking every second');
},
onComplete: function (app) {
app.log.info('I am done');
},
start: true, // Start task immediately
timezone: 'France/Paris' // Custom timezone
}
}
}
You can use Cron
annotation on methods services, for this you need to install trailpack-annotations :
Ensure path for annotations is set appropriately:
// config/annotations.js
module.exports = {
...
pathToScan: './api/services', //or ./api for hmvc
...
}
After install just add your annotations :
'use strict'
const Service = require('trails-service')
/**
* @module DefaultService
*
* @description Default Service included with a new Trails app
* @see {@link http://trailsjs.io/doc/api/services}
* @this TrailsApp
*/
module.exports = class DefaultService extends Service {
/**
* @Cron('* * * * * *')
*/
hello(){
this.app.log.info('Run every second :)')
}
/**
* @Cron({schedule: '* * * * * *', start: true, timezone: 'Europe/Paris'})
*/
world(){
this.app.log.info('Run every second too :)')
}
}
Now you can send start/stop jobs like this :
this.app.services.CronService.jobs.myJob.start()
this.app.services.CronService.jobs.myJob.stop()
this.app.services.CronService.addJob('mySecondJob', {
schedule: '*/5 * * * * *',
onTick: function (app) {
app.log.info('I am ticking every 5 seconds');
},
onComplete: function (app) {
app.log.info('I am done');
},
start: true, // Start task immediately
timezone: 'France/Paris' // Custom timezone
})
For use in a Cluster Mode for preventing the jobs running on all server. Only one server of the cluster be run a job in a distributively form. You only need configure a redis server in the cron.js config file.
// config/cron.js
module.exports = {
cluster: {
host: 'localhost',
auth_pass: ''
db: 0,
ttl: 600 // Default TTL
},
jobs: {
myJob: {
schedule: '* * * * * *',
onTick: function (app) {
app.log.info('I am ticking every second');
},
onComplete: function (app) {
app.log.info('I am done');
},
start: true, // Start task immediately
timezone: 'France/Paris' // Custom timezone
}
}
}
For advanced options for the Redis Client take a look here: Node Redis Client Options
Hey dude! Help me out for a couple of 🍻!