import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Tuple;
import java.util.Set;
@Service
@Slf4j
public class DelayTaskServiceImpl implements DelayTaskService {
@Autowired
private JedisPool jedisPool;
@Override
public void sendMsg(String key, double score, String member) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.zadd(key, score, member);
log.info("sendMsg - 发送数据到 WORK-QUEUE key为{},score为{},member为{}", key, score, member);
} finally {
this.returnToPool(jedis);
}
}
@Override
public void onMessage(String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
while (true) {
Set<Tuple> tuples = jedis.zrangeWithScores(key, 0, -1);
if (tuples != null && tuples.size() > 0) {
Tuple tuple = (Tuple) tuples.toArray()[0];
long currentTimeMillis = System.currentTimeMillis();
// log.info("onMessage-{}的超时时间为{},当前时间为{}", tuple.getElement(), (long) tuple.getScore(), currentTimeMillis);
if (currentTimeMillis >= tuple.getScore()) {
//删除超时元素
String element = tuple.getElement();
// log.info("onMessage- WORK-QUEUE 有超时元素:" + element);
Long zrem = jedis.zrem(key, element);
if (zrem != null && zrem > 0) {
//删除成功,执行业务操作
log.info("onMessage- 超时工单:" + element + " 移除队列成功");
//具体的业务操作。。。
}
} else {
log.info("onMessage-{}未到超时时间", tuple.getElement());
break;
}
}else {
log.info("onMessage-当前任务队列为空");
break;
}
}
} finally {
this.returnToPool(jedis);
}
}
/**
* 关闭jedis链接,将活动的redis推入的连接池中
*
* @param jedis
*/
private void returnToPool(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
利用Redis做延时任务的一个实例
最新推荐文章于 2023-07-27 17:27:13 发布