Newbiee
Newbiee

Reputation: 592

running background job on a specific action in sails js

i am trying to make a service that runs in background when specific event happens. As an example when user verifies email i want my service of deleting possible unverified duplicate emails form database. i tried using kue to save my purpose but i think its more like the services will run once the sails lift fires?

so how to run a service when specific event happens? any help would be much appreciated.

thanks

Upvotes: 0

Views: 1718

Answers (2)

MjZac
MjZac

Reputation: 3536

You can indeed use Kue for this purpose.

  1. Create a config file kue.js for Kue

    var kue = require('kue');
    var kue_engine = kue.createQueue({
      prefix: 'kue',
      redis: {
        port: '6379',
        host: 'localhost'
      }
    });
    
    
    process.once('SIGTERM', function (sig) {
      kue_engine.shutdown( 5000, function(err) {
        console.log( 'Kue shutdown: ', err||'' );
        process.exit( 0 );
      });
    });
    
    module.exports.kue = kue_engine;
    
  2. Add the job to Kue in relevant controller action.

    var kue_engine = sails.config.kue;
    kue_engine.create('delete_verified_email', {email: '[email protected]'})
      .priority('medium')
      .attempts(3)
      .save();
    
  3. Create a worker.js in project root to consume kue jobs.

    var kue = require('kue');
    require('sails').load({
        hooks: {
            blueprints: false,
            cors: false,
            csrf: false,
            grunt: false,
            http: false,
            i18n: false,
            logger: false,
            policies: false,
            pubsub: false,
            request: false,
            responses: false,
            session: false,
            sockets: false,
            views: false
          }
        }, function (err, app) {
              sails.log.info('Starting kue');
              var kue_engine = sails.config.kue;
    
              //register kue.
    
              kue_engine.on('job complete', function (id) {
                  sails.log.info('Removing completed job: ' + id);
                  kue.Job.get(id, function (err, job) {
                      job.remove();
                  });
              });
              kue_engine.process('delete_verified_email', 20, function (job, done) {
                  // you can access the data passed while creating job at job.data
                  // all the sails models, services are available here
                  console.log(job.data.email)
                  done && done();
              });
    
  4. Run the worker.js to consume the kue jobs created by your sails app.

Upvotes: 2

Manuel Reil
Manuel Reil

Reputation: 508

Maybe Sails.js lifecycle hooks could help you. We are using them for instance to update statistics, e.g. persisting number of users per type after a user update call.

Also we are using Node Agenda (Sails.js hook) to create jobs to be executed either one time to a defined time in the future or like a cron job. Maybe you will want to collect the invalid/ expired email address verification entries to be purged and delete them in a hourly batch.

Upvotes: 1

Related Questions