业务中经常有一些场景是要延迟执行的,所以需要有延迟的消息触发到程序,然后程序自动执行。
这个项目是为了简化项目中用到延迟场景的使用。
使用者不再需要关心延迟消息的实现和触达,只需要关注自己业务实现。
- 
redisson实现延迟队列 (已实现✅)
 - 
rocketmq实现延迟队列 (未实现)
 
所有实现了DelayQueueExecutor的实现类都会在服务启动后,会添加到DelayQueueExecutorFactory中进行管理。
再由执行器启动器DelayQueueExecutorRunner统一执行。
spring:
  redis:
    cluster:
      nodes: ${redis.nodes}
    database: 1
    timeout: 30000
    password: ${redis.password}
    enableTransactionSupport: false/**
 * 该执行器实现类会在服务启动后,会添加到`DelayQueueExecutorFactory`中进行管理。
 *
 * 不需要在单独调用,只需要实现execute()的业务即可
 */
@Component
public class PkFinishDelayQueueExecutor implements DelayQueueExecutor<PkFinishDelayMessage> {
    //注入延迟队列持有者
    @Resource
    private DelayQueueHolder redisDelayQueueHolder;
    @Override
    public String queueName() {
        return "PkFinishQueue";
    }
    @Override
    public void execute(PkFinishDelayMessage delayMessage) {
        //TODO 处理业务逻辑
        Long pkId = delayMessage.getPkId();
    }
    @Override
    public PkFinishDelayMessage task() throws InterruptedException {
        return redisDelayQueueHolder.task(this.queueName());
    }
}public class Test {
    @Autowired
    private DelayQueueHolder redisDelayQueueHolder;
    @Test
    public void testAddJob() {
        PkFinishDelayMessage message = new PkFinishDelayMessage();
        //30分钟后,会通过PKFinishDelayQueueExecutor.execute()执行
        redisDelayQueueHolder.addJob(message, 30 * 60, TimeUnit.SECONDS, "PK_TIMEOUT");
    }
}