我们先看看以下业务场景:
当订单一直处于未支付状态时,如何在半小时后自动取消?
如何定期检查处于退款状态的订单是否已经退款成功?
为了解决以上问题,最简单直接的办法就是定时去扫表。每个业务都要维护一个自己的扫表逻辑。
使用消息中间件可以实现延迟消息,像RocketMQ就自带这个功能
3.基于Redis
根据Redis的zset、list的特性,我们可以利用Redis来实现一个延迟队列。
方案参考有赞延迟队列:https://tech.youzan.com/queuing_delay/
消息流程:
在项目里的redis-delay-test测试项目中有完整的接入示例
大概流程如下:
<dependency>
<groupId>com.mmc</groupId>
<artifactId>redis-delay-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
@Configuration
public class DelayConfig {
@Autowired
private RedisTemplate redisTemplate;
@Bean
public DelayFacade delayFacade(){
return new DelayFacadeImpl(redisTemplate);
}
@Bean
public RedisDelayService redisDelayService(){
return new RedisDelayServiceImpl(delayFacade());
}
}
public enum TopicEnum {
ORDER,
LOG;
}
@Component
public class OrderTopicRegister extends AbstractTopicRegister {
@Override
public String getTopic() {
return ORDER.name();
}
@Override
public boolean handle(Job job) {
System.out.println("处理订单:"+ JSON.toJSONString(job));
return true;
}
}
目前提供三个api:
@RequestMapping("/testDelay")
public String testDelay(Long id, @RequestParam(required = false) Long delayTime, String topic){
JobParam jobParam=new JobParam();
jobParam.setBody("");
jobParam.setJobId(id);
jobParam.setTopic(topic);
jobParam.setDelayTime(delayTime==null?0:delayTime);
jobParam.setRetries(5);
redisDelayService.syncPutMessage(jobParam);
return "success";
}
https://gitee.com/mmcLine/redis-delay/
只完成了第一版,需要优化的地方还很多。欢迎大家一起来完善。
原文:https://www.cnblogs.com/javammc/p/15113010.html