diff --git a/src/worker.js b/src/worker.js index a479d59..c928915 100644 --- a/src/worker.js +++ b/src/worker.js @@ -35,12 +35,14 @@ export default class Worker extends events.EventEmitter { this.debug = (...msg) => debug(...msg, `id: ${this.id}`); this._checker = false; + this._running = true; this.debug(`Created worker for job type ${this.jobtype}`); this._startJobPolling(); } destroy() { - clearInterval(this._checker); + this._running = false; + this._stopJobPolling(); } toJSON() { @@ -237,6 +239,10 @@ export default class Worker extends events.EventEmitter { } _startJobPolling() { + if (!this._running) { + return; + } + this._checker = setInterval(() => { this._getPendingJobs() .then((jobs) => this._claimPendingJobs(jobs)); diff --git a/test/src/worker.js b/test/src/worker.js index 0c4df54..bfb7b02 100644 --- a/test/src/worker.js +++ b/test/src/worker.js @@ -185,6 +185,27 @@ describe('Worker class', function () { clock.tick(interval); sinon.assert.calledOnce(searchSpy); }); + + it('should not poll once destroyed', function () { + const worker = new Worker(mockQueue, 'test', noop); + + // move the clock a couple times, test for searches each time + sinon.assert.notCalled(searchSpy); + clock.tick(defaults.interval); + sinon.assert.calledOnce(searchSpy); + clock.tick(defaults.interval); + sinon.assert.calledTwice(searchSpy); + + // destroy the worker, move the clock, make sure another search doesn't happen + worker.destroy(); + clock.tick(defaults.interval); + sinon.assert.calledTwice(searchSpy); + + // manually call job poller, move the clock, make sure another search doesn't happen + worker._startJobPolling(); + clock.tick(defaults.interval); + sinon.assert.calledTwice(searchSpy); + }); }); describe('query for pending jobs', function () {