/**
* 订单监控类
* 定时扫描所有待付款订单,超时自动取消
* Created by huangbaidong
* 2017/3/29.
*/
@Component
public class OrderMonitorJob { @Resource
private RedisUtil redisUtil; @Resource
private BsdOrderService bsdOrderService; @Resource
private BsdDFKOrderCacheManager bsdDFKOrderCacheManager; private boolean isLock = false; /**
* 待付款订单定时扫描类
* 定时扫描所有待付款订单,超时自动取消
*/
public void paymentTimeoutScan() {
if(!isLock) {
//加锁,防止定时器重复执行,
isLock = true;
try {
List<BsdDFKOrderCacheEntity> orders = bsdDFKOrderCacheManager.getAll();
if (BlankUtil.isNotEmpty(orders)) { List<String> removeIds = new ArrayList<>();//需要移除的订单 for (BsdDFKOrderCacheEntity order : orders) { if (Dictionary.ORDER_STATUS_DFK == order.getOrderStatus()) {
boolean isExpire = false;
if (order.isHasPromotion() == 1) {
//如果是有促销规则的订单,1小时未支付,自动取消订单
if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasRulePayTimeout) {
isExpire = true;
}
} else {
//如果是没有促销规则的订单,24小时未支付,自动取消订单
if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasNotRulePayTimeout) {
isExpire = true;
}
}
if (isExpire) { //1、自动取消订单(操作人ID传0)
bsdOrderService.cancel(order.getId(), 0l); //2、记录过期的订单,将订单从缓存中清除
removeIds.add(order.getId().toString()); System.out.println("------>订单[" + order.getCode() + "]超时未付款自动取消订单");
}
} else {
//不是待付款状态的订单,记录从缓存中清除
removeIds.add(order.getId().toString());
}
} //将不是待支付状态的订单,以及过期的未支付的订单从缓存中删除
if (BlankUtil.isNotEmpty(removeIds)) {
bsdDFKOrderCacheManager.removeFromCache(removeIds);
}
}
} finally {
//运行完后释放锁
isLock = false;
}
}
} }
/**
* 订单监控类
* 定时扫描所有待付款订单,超时自动取消
* Created by huangbaidong
* 2017/3/29.
*/
@Component
public class OrderMonitorJob { @Resource
private RedisUtil redisUtil; @Resource
private BsdOrderService bsdOrderService; @Resource
private BsdDFKOrderCacheManager bsdDFKOrderCacheManager; private boolean isLock = false; /**
* 待付款订单定时扫描类
* 定时扫描所有待付款订单,超时自动取消
*/
public void paymentTimeoutScan() {
if(!isLock) {
//加锁,防止定时器重复执行,
isLock = true;
try {
List<BsdDFKOrderCacheEntity> orders = bsdDFKOrderCacheManager.getAll();
if (BlankUtil.isNotEmpty(orders)) { List<String> removeIds = new ArrayList<>();//需要移除的订单 for (BsdDFKOrderCacheEntity order : orders) { if (Dictionary.ORDER_STATUS_DFK == order.getOrderStatus()) {
boolean isExpire = false;
if (order.isHasPromotion() == ) {
//如果是有促销规则的订单,1小时未支付,自动取消订单
if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasRulePayTimeout) {
isExpire = true;
}
} else {
//如果是没有促销规则的订单,24小时未支付,自动取消订单
if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasNotRulePayTimeout) {
isExpire = true;
}
}
if (isExpire) { //1、自动取消订单(操作人ID传0)
bsdOrderService.cancel(order.getId(), 0l); //2、记录过期的订单,将订单从缓存中清除
removeIds.add(order.getId().toString()); System.out.println("------>订单[" + order.getCode() + "]超时未付款自动取消订单");
}
} else {
//不是待付款状态的订单,记录从缓存中清除
removeIds.add(order.getId().toString());
}
} //将不是待支付状态的订单,以及过期的未支付的订单从缓存中删除
if (BlankUtil.isNotEmpty(removeIds)) {
bsdDFKOrderCacheManager.removeFromCache(removeIds);
}
}
} finally {
//运行完后释放锁
isLock = false;
}
}
} }

quartz 防止上一任务未执行完毕,下一时间点重复执行的更多相关文章

  1. java主线程等待所有子线程执行完毕在执行(常见面试题)

    java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...

  2. ORACLE中查询语句的执行顺及where部分条件执行顺序测试

    Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...

  3. C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗

    结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...

  4. 重复执行用例(pytest-repeat)

    前言 平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来.自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,或 ...

  5. Pytest系列(十三)- 重复执行之pytest-repeat的使用

    写在前面 这个插件,可以帮助我们很好的解决自动化测试过程中的一些偶线性bug难以复现的问题,但前提是,当前自动化脚本是独立的,不依赖任何其他脚本.个人觉得还是失败重运行的一种体现,就和TestNG是一 ...

  6. Java多线程--让主线程等待所有子线程执行完毕

    数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...

  7. Spring整合Quartz定时任务执行2次,Spring定时任务执行2次

    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...

  8. 关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)

    以前看到网上一些小程序,在处理完事物后会自动发送qq消息,但是一直搞不懂是说明原理.也在网上找过一些python登陆qq发送消息的文字,但是都太复杂了.今天偶然看到一篇文章,是用python调用win ...

  9. C# 本进程执行完毕后再执行下一线程

    最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...

随机推荐

  1. [Jobdu] 题目1384:二维数组中的查找

    题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含 ...

  2. Openstack 03 - Nova Compute

    1.前言 非常早之前就開始着手写Openstack 系列的博客了,在写了总体架构和Keystone之后,准备写Nova,可是每次写到一半,自己心里就认为不踏实,由于似乎我并没有真正理解Nova,或者说 ...

  3. hdoj4864 Task (贪心)

    题目来源: 2014 Multi-University Training Contest 1--by FZU 题意:有N个机器和m个工作.机器和工作都有一个时间xi和价值yi,一个工作仅仅有满足xi和 ...

  4. print()函数的end 参数

    print()函数含end参数时:结束的时候已什么结尾,后面的参数可以是任何形式 [print() 默认以'\n'  结尾] 输出结果:  print()函数不含end参数时: 输出结果:

  5. 如何利用dex2jar反编译APK

    工具/原料 电脑 dex2jar JD-GUI 方法/步骤 1 下载dex2jar和JD-GUI,在参考资料中添加了这两个工具的百度网盘下载地址供读者下载使用(笔者亲测) 2 找到我们准备测试用的ap ...

  6. 06、Windows 10 技术预览

    随着 Windows 10 发布的,未来 Windows 平台都是统一开发模型,可以只写一个 Appx 包,就可以同时部署到 Windows/ Windowsw Phone/ Tablet /xbox ...

  7. 根据返回值动态加载select

    // 路由 if (return_routeChoice != null && return_routeChoice != "") { for (var i = 0 ...

  8. java中Keytool的使用总结 (加密 密钥(key)和证书(certificates))

    http://blog.chinaunix.net/uid-17102734-id-2830223.html

  9. FreeRTOSConfig 配置文件详解

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的配置文件 FreeRTOSConfig.h 中每个选项的作用.初学的话 ...

  10. aix 常用命令

    官网上的介绍: AIX 常用命令汇总 http://www.ibm.com/developerworks/cn/aix/library/au-dutta_cmds.html 我们先SSH 到AIX 系 ...