Last active
December 12, 2015 09:39
-
-
Save mbabineau/4752943 to your computer and use it in GitHub Desktop.
Redis-backed delay queue as a Grails service
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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