分布式锁(redisson)完成延迟触发功能

记录:利用分布式锁(redisson)完成延迟触发功能

今天遇到一个延迟任务 上网查了很多资料 最终选择利用redisson的过期时间来完成。redisson 是Java操作redis的一个api 还支持各种 过期以及异步操作等,功能挺强大(主要是我想偷懒)
记录下自己写的。

1.利用redisson下的封装类RedissonClient调用getMapCache方法 缓存映射名称:它能够保留插入元素的顺序,并且可以指明每个元素的过期时间(专业一点叫元素淘汰机制)。另外还为每个元素提供了监听器,提供了4种不同类型的监听器。有:添加、过期、删除、更新四大事件。当然这里我用“过期”来实现延迟发送 。好了我直接上代码了

1.设置过期时间和监听类

/**
 * @author raito
 * @desc
 * @date 2020-05-14
 */
@Slf4j
@Service
public class RedissonBusinessApiImpl implements RedissonBusinessApi {

    @Autowired
    private RedissonClient redissonClient;

    @Autowired
     private MessageListener messageListener;

    /**
     * redis延迟消息
     *
     * @param num   唯一标识
     * @param msg   消息
     * @param miute 延迟时间
     */
    @Override
    public void redissonDelay(String num, String msg, Long miute) {
        //设置缓存映射的标识 这个标识自定义
        RMapCache<String, String> rMapCache = redissonClient.getMapCache("redisMessage");
        //设置缓存的时间和数据信息 TimeUnit.MILLISECONDS这个是 设置时间单位
        rMapCache.put(num, msg, miute, TimeUnit.MILLISECONDS);
        //监听方法触发类 redis过期就执行这个 messageListene类里的方法
        rMapCache.addListener(messageListener);
    }

2.设置监听的接收实现类

/**
 * @author raito
 * @desc 接收过期时间并执行方法
 * @date 2020-05-14
 */
@Slf4j
@Component
public class MessageListener implements EntryExpiredListener<String, String> {

    @Autowired
    private RedisCacheUtil redisCacheUtil;

    @Override
    public void onExpired(EntryEvent<String, String> entryEvent) {
        //设置锁 ----》防止重复执行方法  我默认的是3 秒 
        if (redisCacheUtil.setTimeOutLock(entryEvent.getKey(), UUID.randomUUID().toString())) {
            log.info("有收到延迟消息通知:{}", entryEvent.getKey());
            log.info("当前时间:{},收到数据key:{},value:{}", new Date().toString(), entryEvent.getKey(), entryEvent.getValue());
        }
    }
}

完成 我们来看看执行效果
在这里插入图片描述成功了 啦啦啦 我成功偷懒了 ✌

你可能感兴趣的:(Java)