Skip to content

Instantly share code, notes, and snippets.

@mbabineau
Last active December 12, 2015 09:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mbabineau/4752943 to your computer and use it in GitHub Desktop.
Save mbabineau/4752943 to your computer and use it in GitHub Desktop.
Redis-backed delay queue as a Grails service
import redis.clients.jedis.Jedis
/**
* Handles the delaying of queued messages for later retrieval.
* See http://blog.mikebabineau.com/2013/02/09/delay-queues-in-redis/
*/
class DelayQueueService {
def redisService
/**
* Queue a message for later retrieval. Messages are unique per queue and
* are deleted upon retrieval. If a given message already exists, it is
* updated with the new delay.
*
* @param queue Queue name
* @param message
* @param delay Time in seconds the message should be delayed
*/
def queueMessage(String queue, String message, Integer delay) {
def time = (System.currentTimeMillis() / 1000) + delay
redisService.withRedis { Jedis redis ->
redis.zadd(queue, time, message)
}
}
/**
* Retrieve messages that are no longer delayed. Deletes messages on read.
*
* @param queue Queue name
*/
def getMessages(String queue) {
def startTime = 0
def endTime = System.currentTimeMillis() / 1000
redisService.withRedis { Jedis redis ->
def t = redis.multi()
def response = t.zrangeByScore(queue, startTime, endTime)
t.zremrangeByScore(queue, startTime, endTime)
t.exec()
response.get()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment