Spring Schedule关闭订单
写一个最简单的版本,因为我们是一个Schedule,不需要返回值,closeOrderTaskV1,第一个版本,那如果其实我们不是TOMCAT集群的话,我们这一个方法就OK了,但是我们是TOMCAT集群,所以呢,需要创建一个分布式锁,那第一个版本是没有分布式锁的,非常简单,我们一起来写一下,首先加上@Schedule这么一个注解,这个包是annotation里面的scheduled的,千万不要加错,然后括号里面写一下,我们需要它每一分钟执行一次,等于什么呢,用引号引一下,cron="0 */1 * * * ?",每个一分钟的整数倍,然后填充一下他的逻辑/*** 没有分布式锁,运行起来来看日志。*/
// @Scheduled(cron="0 */1 * * * ?")//每1分钟(每个1分钟的整数倍)public void closeOrderTaskV1(){int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));iOrderService.closeOrder(hour);}public class PropertiesUtil {private static Properties props;static {String fileName = "mmall.properties";props = new Properties();try {props.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName),"UTF-8"));} catch (IOException e) {log.error("配置文件读取异常",e);}}public static String getProperty(String key){String value = props.getProperty(key.trim());if(StringUtils.isBlank(value)){return null;}return value.trim();}public static String getProperty(String key,String defaultValue){String value = props.getProperty(key.trim());if(StringUtils.isBlank(value)){value = defaultValue;}return value.trim();}}从配置文件=里面获取这个配置,如果key不存在也是两个小时,那这里面的逻辑就是说,我们获取两个小时,也就是说每一分钟我都会执行一下,这个定时任务会关闭,以当前时间为准,两个小时之前下单,但是呢,未付款的订单,那为了验证方便呢,我们加一行日志,关闭订单定时任务启动,说明我们写的Spring Schedule定时任务,是生效的,因为我们的频率比较高,每一分钟要执行一次,@Overridepublic void closeOrder(int hour) {Date closeDateTime= DateUtils.addHours(new Date(),-hour);List<Order> orderList = orderMapper.selectOrderStatusByCreateTime(Const.OrderStatusEnum.NO_PAY.getCode(),DateTimeUtil.dateToStr(closeDateTime));for(Order order : orderList){List<OrderItem> orderItemList = orderItemMapper.getByOrderNo(order.getOrderNo());for(OrderItem orderItem : orderItemList){//使用写独占锁,一定要用主键where条件,防止锁表。同时必须是支持MySQL的Innodb。Integer stock = productMapper.selectStockByProductId(orderItem.getProductId());//考虑到已生成的订单里的产品,被删除的情况if(stock == null){continue;}Product product = new Product();product.setId(orderItem.getProductId());product.setStock(stock+orderItem.getQuantity());productMapper.updateByPrimaryKeySelective(product);}orderMapper.closeOrderCloseByOrderId(order.getId());log.info("关闭订单OrderNo:{}",order.getOrderNo());}}这个时候根据订单状态和createTime,开始找到orderList,那orderList我们一共找了755个,找到这订单的OrderItemList,根据productId拿他的库存,现在表里的库存是995个,这个 时候stock就是995加1,现在我们是单击来关闭没有问题,那如果我们再启动一个TOMCAT,现在我们要聚焦在分布式任务调度上,这样就造成了一个问题,什么问题,这个定时任务我只希望,在TOMCAT集群环境下,一个服务执行就可以了,并不需要大家都来执行它,并且如果大家一起执行的话,也浪费了MYSQL和服务器的一个性能,因为其他机器不需要执行,只执行一台就行,第二个就很容易造成数据错乱,因为大家都在执行SQL语句,那接下来我们就讲使用redis实现分布式锁的一个原理,来解决这一个问题
Spring Schedule关闭订单相关推荐
- Redis分布式锁 Spring Schedule实现任务调度
一看到标题就知道,这一篇博客又是总结分布式工作环境中集群产生的问题,个人觉得分布式没有那么难以理解,可能也是自己见识比较浅,对我来说,分布式只是一种后端业务演进时的一种工作方式,而真正实现这种工作方式 ...
- Spring Schedule配置及初始化
打开applicationContext,然后在现在的配置加一个标签,takst:annotaion-driven,这里的driven有好几个,我们选择这一个<task:annotation-d ...
- Spring Schedule定时关单快速入门
首先讲一下Spring Schedule的一个介绍,然后是Spring Schedule的一个快速入门,这里面我们会列一个表格,然后领着大家来看一下,然后是Spring Schedule Cron的生 ...
- 面试官:怎么不用定时任务实现关闭订单?
Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 来源:juejin.cn/post/ 6987233263660040206 一.定时任务关闭订单(最low) 二.rocketmq ...
- 谷粒商城笔记+踩坑(23)——定时关闭订单
导航: 谷粒商城笔记+踩坑汇总篇 目录 1.定时关单 1.0.业务流程 1.1.创建交换机.队列以及之间的绑定 1.2.在订单创建成功时向MQ中 延时队列发送消息 1.3.在订单的关闭之后时向MQ发送 ...
- 使用Redisson优雅关闭订单
在支付系统中,订单通常是具有时效性的,例如在下单30分钟后如果还没有完成支付,那么就要取消订单,不能再执行后续流程.说到这,可能大家的第一反应是启动一个定时任务,来轮询订单的状态是否完成了支付,如果超 ...
- php微信支付分取消订单,微信支付PHP开发教程五关闭订单
重要:本文最后更新于2019-06-01 08:22:14,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. 前面我们已经完成了微信支付的正常下单,并且能够正常收款.如果用户在支付过程 ...
- java微信支付超时_Java微信支付之关闭订单
本文实例为大家分享了java微信支付之关闭订单的具体代码,供大家参考,具体内容如下 一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超 ...
- 微信撤销订单java,Java微信支付开发之关闭订单
一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口 注意:订单生成后不能马上调用关单 ...
最新文章
- 迪杰斯特拉算法。简单理解。内含示例
- 结构体struct 联合体 union
- python 教程 第十三章、 特殊的方法
- 分段路由SR应用场景—Vecloud
- 485有时候从机接收指令没反应_原创案例丨秒杀一辆12年爱唯欧启动无反应
- Python学习进程
- Django(part38)--制作登录界面
- Spring中解决事务以及异步注解失效
- RTX5 | 时间延时
- 我参与的一个项目的继续总结:技术篇
- vuedraggable嵌套块拖拽_Vue.Draggable拖拽效果
- 未来 10 年,物联网将成为主流!
- 遗传算法导论(转载)
- PHP中的预定义常量、预定义变量、魔术常量
- 1.恶意软件中的防双开
- 关于vs2015各版本的卸载
- limeSurvey资料
- 远程桌面无法复制粘贴问题
- php 485通讯协议 编程,485通讯协议程序怎么写(51单片机的485通信程序案例)
- Win10smb2.0共享至android速度慢问题解决
热门文章
- JavaScript 的性能优化:加载和执行
- java实现多线程断点续传,上传下载 分享
- 如何嵌入Live Messenger?
- 微信中禁止网页下拉出现网页由XXX提供 【亲测有效】
- nginx部署下SSE实现心跳功能
- 一次完整的http的请求过程与https的实现
- 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇...
- MySQL 学习笔记 二
- WordPress解析之数据库
- 打开MSN提示Windows Live Communication Platform遇到问题需要关闭错误的解决方法