Skip to content
This repository was archived by the owner on Oct 24, 2024. It is now read-only.

Allow setting delay as a Date #27

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,13 @@ var queue = mongoDbQueue(db, 'queue', { delay : 10 })

This is now the default for every message added to the queue.

If you set `delay` to be a Date it will delay the message until that date.

To delay all messages until January 1st 2077, try this:
```
var queue = mongoDbQueue(db, 'queue', { delay : new Date('2077-01-01') })
```

### deadQueue - Dead Message Queue ###

Default: none
Expand Down
7 changes: 6 additions & 1 deletion mongodb-queue.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,12 @@ Queue.prototype.add = function(payload, opts, callback) {
opts = {}
}
var delay = opts.delay || self.delay
var visible = delay ? nowPlusSecs(delay) : now()
var visible = now()
if(typeof(delay.toISOString) === 'function') {
visible = delay.toISOString()
} else if(typeof(delay) === 'number'){
visible = nowPlusSecs(delay)
}

var msgs = []
if (payload instanceof Array) {
Expand Down
46 changes: 46 additions & 0 deletions test/delay.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,52 @@ setup(function(db) {
)
})

test('delay: check an individual message delay of type Date overrides the queue delay ', function(t) {
var queue = mongoDbQueue(db, 'delay')

async.series(
[
function(next) {
queue.add('I am delayed by 3 seconds', { delay : new Date(Date.now() + 3000) }, function(err, id) {
t.ok(!err, 'There is no error when adding a message.')
t.ok(id, 'There is an id returned when adding a message.')
next()
})
},
function(next) {
// get something now and it shouldn't be there
queue.get(function(err, msg) {
t.ok(!err, 'No error when getting no messages')
t.ok(!msg, 'No msg received')
// now wait 4s
setTimeout(next, 4 * 1000)
})
},
function(next) {
// get something now and it SHOULD be there
queue.get(function(err, msg) {
t.ok(!err, 'No error when getting a message')
t.ok(msg.id, 'Got a message id now that the message delay has passed')
queue.ack(msg.ack, next)
})
},
function(next) {
queue.get(function(err, msg) {
// no more messages
t.ok(!err, 'No error when getting no messages')
t.ok(!msg, 'No more messages')
next()
})
},
],
function(err) {
if (err) t.fail(err)
t.pass('Finished test ok')
t.end()
}
)
})

test('delay: check an individual message delay overrides the queue delay', function(t) {
var queue = mongoDbQueue(db, 'delay')

Expand Down