利用Redis做延时任务的一个实例

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();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值