使用redis和线程池实现需求截止时间到期处理
文章目录
业务需求
使用redis和线程池实现延迟到期订单。
业务:新增需求,设置截止日期,根据截止日期改变该需求的状态为已截止
实现步骤:
- 在新增需求接口中发送延迟消息(延迟时间为:截止时间和当前时间的时间差+当前时间) 以set类型存储(已截图展示)number为该需求的code编码。
- 实现CommandLineRunner方法,在程序启动时执行run方法。在run方法中另开线程,阻塞获取消息(如果没有获取到截止的消息则循环每秒检查一次,直到获取到消息),每次只获取一条消息,如果获取到了,则返回该需求的编码。
- 如果编码存在,则调用redisDelayQueueHandle.execute(code)方法,在该方法中改变该需求的状态为已截止
一、实现步骤
1.引入库
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.18.0</version>
</dependency>
2.发生延时消息
@Transactional(rollbackFor = Exception.class)
@Override
public void add(DemandDTO demandDTO) {
//TODO 需求插入的实现,获取需求的code,和截止时间
// 发送延迟消息
long seconds = LocalDateTimeUtil.between(LocalDateTime.now(), demandDTO.getCloseTime(), ChronoUnit.SECONDS);
redisDelayedQueue.addMessage("supplyDemandExpire", demandDTO.getCode(), seconds);
}
3.基于redis的zset实现延迟队列RedisDelayedQueue
/**
* @description 基于redis的zset实现延迟队列
*/
@Component
public