写一个最简单的版本,因为我们是一个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关闭订单相关推荐

  1. Redis分布式锁 Spring Schedule实现任务调度

    一看到标题就知道,这一篇博客又是总结分布式工作环境中集群产生的问题,个人觉得分布式没有那么难以理解,可能也是自己见识比较浅,对我来说,分布式只是一种后端业务演进时的一种工作方式,而真正实现这种工作方式 ...

  2. Spring Schedule配置及初始化

    打开applicationContext,然后在现在的配置加一个标签,takst:annotaion-driven,这里的driven有好几个,我们选择这一个<task:annotation-d ...

  3. Spring Schedule定时关单快速入门

    首先讲一下Spring Schedule的一个介绍,然后是Spring Schedule的一个快速入门,这里面我们会列一个表格,然后领着大家来看一下,然后是Spring Schedule Cron的生 ...

  4. 面试官:怎么不用定时任务实现关闭订单?

    Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 来源:juejin.cn/post/ 6987233263660040206 一.定时任务关闭订单(最low) 二.rocketmq ...

  5. 谷粒商城笔记+踩坑(23)——定时关闭订单

    导航: 谷粒商城笔记+踩坑汇总篇 目录 1.定时关单 1.0.业务流程 1.1.创建交换机.队列以及之间的绑定 1.2.在订单创建成功时向MQ中 延时队列发送消息 1.3.在订单的关闭之后时向MQ发送 ...

  6. 使用Redisson优雅关闭订单

    在支付系统中,订单通常是具有时效性的,例如在下单30分钟后如果还没有完成支付,那么就要取消订单,不能再执行后续流程.说到这,可能大家的第一反应是启动一个定时任务,来轮询订单的状态是否完成了支付,如果超 ...

  7. php微信支付分取消订单,微信支付PHP开发教程五关闭订单

    重要:本文最后更新于2019-06-01 08:22:14,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. 前面我们已经完成了微信支付的正常下单,并且能够正常收款.如果用户在支付过程 ...

  8. java微信支付超时_Java微信支付之关闭订单

    本文实例为大家分享了java微信支付之关闭订单的具体代码,供大家参考,具体内容如下 一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超 ...

  9. 微信撤销订单java,Java微信支付开发之关闭订单

    一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口 注意:订单生成后不能马上调用关单 ...

最新文章

  1. 迪杰斯特拉算法。简单理解。内含示例
  2. 结构体struct 联合体 union
  3. python 教程 第十三章、 特殊的方法
  4. 分段路由SR应用场景—Vecloud
  5. 485有时候从机接收指令没反应_原创案例丨秒杀一辆12年爱唯欧启动无反应
  6. Python学习进程
  7. Django(part38)--制作登录界面
  8. Spring中解决事务以及异步注解失效
  9. RTX5 | 时间延时
  10. 我参与的一个项目的继续总结:技术篇
  11. vuedraggable嵌套块拖拽_Vue.Draggable拖拽效果
  12. 未来 10 年,物联网将成为主流!
  13. 遗传算法导论(转载)
  14. PHP中的预定义常量、预定义变量、魔术常量
  15. 1.恶意软件中的防双开
  16. 关于vs2015各版本的卸载
  17. limeSurvey资料
  18. 远程桌面无法复制粘贴问题
  19. php 485通讯协议 编程,485通讯协议程序怎么写(51单片机的485通信程序案例)
  20. Win10smb2.0共享至android速度慢问题解决

热门文章

  1. JavaScript 的性能优化:加载和执行
  2. java实现多线程断点续传,上传下载 分享
  3. 如何嵌入Live Messenger?
  4. 微信中禁止网页下拉出现网页由XXX提供 【亲测有效】
  5. nginx部署下SSE实现心跳功能
  6. 一次完整的http的请求过程与https的实现
  7. 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇...
  8. MySQL 学习笔记 二
  9. WordPress解析之数据库
  10. 打开MSN提示Windows Live Communication Platform遇到问题需要关闭错误的解决方法