记录:利用分布式锁(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());
}
}
}
完成 我们来看看执行效果
成功了 啦啦啦 我成功偷懒了 ✌