node-resque
Version:
an opinionated implementation of resque in node
149 lines (130 loc) • 4 kB
text/typescript
// We'll use https://github.com/tejasmanohar/node-schedule for this example,
// but there are many other excellent node scheduling projects
import * as schedule from "node-schedule";
import { Queue, Scheduler, Worker } from "../src";
/* In your projects:
import { Queue, Scheduler, Worker } from "node-resque";
*/
// ////////////////////////
// SET UP THE CONNECTION //
// ////////////////////////
const connectionDetails = {
pkg: "ioredis",
host: "127.0.0.1",
password: null,
port: 6379,
database: 0,
// namespace: 'resque',
// looping: true,
// options: {password: 'abc'},
};
async function boot() {
// ///////////////////////////
// DEFINE YOUR WORKER TASKS //
// ///////////////////////////
const jobs = {
ticktock: (time, callback) => {
console.log(`*** THE TIME IS ${time} ***`);
return true;
},
};
// /////////////////
// START A WORKER //
// /////////////////
const worker = new Worker(
{ connection: connectionDetails, queues: ["time"] },
jobs,
);
await worker.connect();
worker.start();
// ////////////////////
// START A SCHEDULER //
// ////////////////////
const scheduler = new Scheduler({ connection: connectionDetails });
await scheduler.connect();
scheduler.start();
// //////////////////////
// REGESTER FOR EVENTS //
// //////////////////////
worker.on("start", () => {
console.log("worker started");
});
worker.on("end", () => {
console.log("worker ended");
});
worker.on("cleaning_worker", (worker, pid) => {
console.log(`cleaning old worker ${worker}`);
});
worker.on("poll", (queue) => {
console.log(`worker polling ${queue}`);
});
worker.on("job", (queue, job) => {
console.log(`working job ${queue} ${JSON.stringify(job)}`);
});
worker.on("reEnqueue", (queue, job, plugin) => {
console.log(`reEnqueue job (${plugin}) ${queue} ${JSON.stringify(job)}`);
});
worker.on("success", (queue, job, result) => {
console.log(`job success ${queue} ${JSON.stringify(job)} >> ${result}`);
});
worker.on("failure", (queue, job, failure) => {
console.log(`job failure ${queue} ${JSON.stringify(job)} >> ${failure}`);
});
worker.on("error", (error, queue, job) => {
console.log(`error ${queue} ${JSON.stringify(job)} >> ${error}`);
});
worker.on("pause", () => {
console.log("worker paused");
});
scheduler.on("start", () => {
console.log("scheduler started");
});
scheduler.on("end", () => {
console.log("scheduler ended");
});
scheduler.on("poll", () => {
console.log("scheduler polling");
});
scheduler.on("leader", () => {
console.log("scheduler became leader");
});
scheduler.on("error", (error) => {
console.log(`scheduler error >> ${error}`);
});
scheduler.on("workingTimestamp", (timestamp) => {
console.log(`scheduler working timestamp ${timestamp}`);
});
scheduler.on("transferredJob", (timestamp, job) => {
console.log(`scheduler enquing job ${timestamp} >> ${JSON.stringify(job)}`);
});
// //////////////
// DEFINE JOBS //
// //////////////
const queue = new Queue({ connection: connectionDetails }, jobs);
queue.on("error", function (error) {
console.log(error);
});
await queue.connect();
schedule.scheduleJob("0,10,20,30,40,50 * * * * *", async () => {
// do this job every 10 seconds, cron style
// we want to ensure that only one instance of this job is scheduled in our enviornment at once,
// no matter how many schedulers we have running
if (scheduler.leader) {
console.log(">>> enquing a job");
await queue.enqueue("time", "ticktock", [new Date().toString()]);
}
});
// ////////////////////
// SHUTDOWN HELPERS //
// ////////////////////
const shutdown = async () => {
await scheduler.end();
await worker.end();
console.log("bye.");
process.exit();
};
process.on("SIGTERM", shutdown);
process.on("SIGINT", shutdown);
}
boot();