1.pom.xml文件中引入jar包

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.4</version>
</dependency>

2.添加 RedissionClient的Bean对象

@Autowired
private RedissonClient redissonClient;

3.消息侦听器的使用

a.获取消息发布订阅监听对象rTopic

b.rTopic添加监听事件  String.class为消息类型  onMessage就是延迟处理的方法

c.获取对象持有者RBucket (桶的概念)

d.为桶设置订单编号(id),生存时间(5)和时间单位(TimeUnit.SECONDS 秒)

e.在订单结束后调用此方法 传入订单id

    /*** 新订单来了 设置订单自动取消* @param id 订单id*/public void orderCancel(String id) {RTopic rTopic = redissonClient.getTopic("__keyevent@" + 1 + "__:expired", new StringCodec());rTopic.addListener(String.class, new MessageListener<String>() {@Overridepublic void onMessage(CharSequence channel, String msg) {OrderServeCombo orderServeCombo = orderServeComboService.getById(id);if (ObjectUtils.isEmpty(orderServeCombo)) {log.error("订单不存在,订单编号:{0}", id);}orderServeCombo.setStatus(OrderStatus.CANCEL);orderServeComboService.saveOrUpdate(orderServeCombo);}});RBucket bucket = redissonClient.getBucket("order");bucket.set(id, 5, TimeUnit.SECONDS);}

4.自动取消订单中,若服务器挂掉,上面方法不会执行

是对orderCancel的补充(产生原因:订单即将到期 服务器挂了 即将取消的订单 未做处理)
/*** 处理未付款已过期 状态未取消的订单 是对orderCancel的补充(产生原因:订单即将到期 服务器挂了 即将取消的订单 未做处理)*/private synchronized void dealCancelOrder(){Date now=new DateTime();Date cancelDate = DateUtils.addMinutes(now, -1);List<OrderServeCombo> list= orderServeComboService.list(Wrappers.<OrderServeCombo>lambdaQuery().eq(OrderServeCombo::getStatus,OrderStatus.OBLIGATION).le(OrderServeCombo::getCreateTime,cancelDate));List<LambdaUpdateWrapper<OrderServeCombo>> wrapperList=new ArrayList<>();list.forEach(e->{e.setStatus(OrderStatus.CANCEL);e.setTimeoutTime(DateUtils.addMinutes(e.getCreateTime(),1));e.setUpdateTime(now);});orderServeComboService.updateBatchById(list);}

5.所以要在服务器启动的时候,自动执行方法处理订单已经取消,状态未刷新的订单

@PostConstruct注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行(返回必须是void)。

执行顺序:Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

   @PostConstructpublic void init() {ThreadPoolExecutor threadPoolExecutor =new ThreadPoolExecutor(1,2,5,TimeUnit.MILLISECONDS,new SynchronousQueue<Runnable>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());threadPoolExecutor.execute(new Runnable() {@Overridepublic void run() {/*** 处理 取消订单*/dealCancelOrder();}});}

6.也有可能服务器正常运行redis就是没执行订单过期的方法,如:(3.消息侦听器的使用)中未执行

所以在补充一条:每天一个时间点定时刷新 处理超时未付款订单

/*** 每天1点 处理一下超时未付款订单*/
@Scheduled(cron = "0 0 1 * * ?")
private void autoDealCancelOrder(){dealCancelOrder();
}

最后完美解决。

JAVA RedissonClient之自动取消订单相关推荐

  1. 三小时未付款自动取消订单实现

    电商系统中,有这样的需求,用户下单三小时未支付就自动取消,具体如何实现的呢? 一.实现方案 通常实现方案有以下方式: 方式一 使用定时任务不断轮询取消,此种方式实现简单,但是存在一个问题,定时任务设置 ...

  2. 使用PHP+Redis实现延迟任务,实现自动取消订单功能

    简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本 ...

  3. php redis zset 延迟队列_用PHP+Redis实现延迟任务,实现自动取消订单

    简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本 ...

  4. 虾皮系统老出现服务器错误,Shopee卖家须知:虾皮系统什么状况会自动取消订单?...

    系统自动取消订单 虾皮系统什么状况会自动取消订单? ● 对卖家而言 以下三种状况,虾皮系统会自动取消订单: 1.卖家在设定的出货天数内,未申请超商寄件编号或是黑猫取件,系统将于该出货天数的隔天自动取消 ...

  5. 秒杀情况下,用户下单扣除库存创建订单之后,迟迟不付款,时间到了自动取消订单(思路)

    秒杀情况下,用户下单扣除库存创建订单之后,迟迟不付款,时间到了自动取消订单 解决方案1. 使用redis实现 1.下单之后把生成分布式全局唯一id,把订单id放进redis中,设置一个过期时间 2.定 ...

  6. Laravel自动取消订单

    最近的业务需要做15分钟内未完成支付就自动取消订单的功能,类似的功能还有很多,例如:订单完成后自动确认收货.完成付款5分钟后发送短信通知等等,这些看起来就像定时任务,即多久后去做什么事. 实现上述功能 ...

  7. php 超时支付取消订单,php利用workerman的定时器实现延时操作(订单支付不成功后一定时间未支付自动取消订单)...

    延时操作个人目前接触最多的场景是用户下单后一定时间未支付自动取消订单,传统的做法是采用定时任务定时扫描数据库超时订单或者利用客户端的请求每次请求去检测一次是否有超时订单,这些方法我始终感觉不是很好,所 ...

  8. tp5.1 PHP + Redis实现自动取消订单

    PHP + Redis实现自动取消订单 业务场景 Redis 开启 keyspace notifications tp5.1 代码实现 后台运行脚本   简单定时任务解决方案:使用redis的keys ...

  9. PHP+Redis实现延迟任务 实现自动取消订单,自动完成订单

    简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本 ...

最新文章

  1. C#中读写INI配置文件
  2. 6.求级数e = 1 + 1/1! + 1/2! + 1/3! + …… 1/n! 要求: 求n项(n由键盘输入)或最后一项小于10-6结束。
  3. ajax 获取java数据_如何使用Ajax从服务端获取数据
  4. kotlin sealed 中_Kotlin sealed class
  5. Redis 的应用场景
  6. 二叉搜索树的插入与删除(C语言)
  7. Lambda表达式Java教程
  8. mysql主从1594错误_3分钟解决MySQL主从1594错误
  9. PowerPC处理器数字仿真测试软件工具——天目全数字实时仿真软件SkyEye
  10. Linux使用ntpdate和ntpd进行时间同步
  11. Numpy系列(七)求解线性方程组、计算逆矩阵求解线性方程组
  12. linux scp 使用简单说明
  13. moodle 定义html文件,设置Moodle
  14. IDEA集成docker-maven-plugin配置CA安全证书
  15. 要多大内存才满足_什么是延迟满足能力?“延迟满足”能力对孩子有多重要家长要清楚...
  16. 工业机器人 郝卫东_川崎焊接机器人控制系统设计开发
  17. 注册.io域名有什么好处?
  18. 自上而下的因果关系:数学结构与观察者
  19. 电脑配件 - 电脑组成以及性能指标分析 - 学习/实践
  20. 最全随机抽样算法(从N个数中抽取M个等)集合

热门文章

  1. 重启光猫显示dns服务器,光猫如何查dns服务器地址
  2. 我为什么这么讨厌你一行行地讲代码?
  3. DPDK中文-DPDK工具(pdump)
  4. 1+X大数据应用开发(java)理论题库/初级测验一(全图片记录 )
  5. 【Unity3D学习记录#2】Android调用Unity界面 与 信息交互
  6. idle怎么运行空格行_我是怎么教小小朋友做数独的?解四宫格数独的几个方法...
  7. 大数据:告诉你茶饮项目“未来”发展趋势!
  8. python separator_Python 必知的 20 个骚操作!
  9. 恢复删除陌陌聊天记录方法
  10. 使用element-ui的upload组件上传代码包时遇到的问题及总结