前言:
zset是带排序的set集合,其中score属性是zset的排序字段;本文将延迟的时间+系统当前时间,作为元素的score属性的值,在while循环中,每次取zset集合中排在最前面的一个元素,通过判断该元素的score值是否大于或等于当前系统时间,来判定队列中该元素是否已达到延迟的时间。详述见如下:
1、添加对象至延迟队列;
/**
* 将延迟对象推送至队列中
* @param obj
* @param seconds
*/
public void add(Object obj, long seconds) {
this.redisService.zadd(delayQueueKey, obj, getDelayTimeMills(seconds));
}
private long getDelayTimeMills(long seconds) {
long result = System.currentTimeMillis() + seconds * 1000;
return result;
}
2、启动线程监听队列中是否有延迟消息需要处理;
public void startMonitor() {
Runnable runnable = new Runnable() {
@Override
public void run() {
monitorQueue();
}
};
System.out.println("start monitor delay queue.");
new Thread(runnable).start();
System.out.println("finish start monitor delay queue.