From 901b2161f13116a6f0beab6dc110f5dd328f14e6 Mon Sep 17 00:00:00 2001 From: Andy Vanbutsele Date: Thu, 3 Sep 2015 15:34:21 +0200 Subject: [PATCH] (feature) add redis options with leader election over redis for CronJob --- .gitignore | 2 ++ .travis.yml | 3 +++ index.js | 1 + lib/cron-cluster.js | 27 +++++++++++++++++++++++++++ package.json | 23 +++++++++++++++++++++++ test/cron-cluster.js | 6 ++++++ 6 files changed, 62 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 index.js create mode 100644 lib/cron-cluster.js create mode 100644 package.json create mode 100644 test/cron-cluster.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd4f2b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.DS_Store diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..68b5c45 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: nodejs +nodejs: + - iojs diff --git a/index.js b/index.js new file mode 100644 index 0000000..fd2a7ac --- /dev/null +++ b/index.js @@ -0,0 +1 @@ +require('./lib/cron-cluster') diff --git a/lib/cron-cluster.js b/lib/cron-cluster.js new file mode 100644 index 0000000..9d8c3d7 --- /dev/null +++ b/lib/cron-cluster.js @@ -0,0 +1,27 @@ + +var _ = require('lodash') +var OriginCronJob = require('cron').CronJob +var Leader = require('redis-leader') + +module.exports = function (redis) { + var leader = new Leader(redis) + + return { + CronJob: CronJob + } + + function CronJob (cronTime, onTick) { + if (typeof cronTime !== 'string' && arguments.length === 1) { + onTick = cronTime.onTick + } + + onTick = _.wrap(onTick, function (fn) { + leader.isLeader(function (isLeader) { + if (!isLeader) return + fn() + }) + }) + + return new (OriginCronJob.bind.apply(OriginCronJob, arguments)) + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5cdbca0 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "cron-cluster", + "version": "0.0.1", + "description": "A Cluster plugin for cron using redis", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/*.js | faucet" + }, + "author": "Andy Vanbutsele ", + "license": "ISC", + "dependencies": { + "cron": "^1.0.9", + "lodash": "^3.10.1", + "redis-leader": "^0.1.0" + }, + "devDependencies": { + "faucet": "0.0.1", + "tap": "^1.4.0" + } +} diff --git a/test/cron-cluster.js b/test/cron-cluster.js new file mode 100644 index 0000000..e4c4fbd --- /dev/null +++ b/test/cron-cluster.js @@ -0,0 +1,6 @@ +var test = require('tap').test + +test('Should do something', function (t) { + t.plan(1) + t.equal(1, 1, '1 == 1') +})