quartz 防止上一任务未执行完毕,下一时间点重复执行
/**
* 订单监控类
* 定时扫描所有待付款订单,超时自动取消
* 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 防止上一任务未执行完毕,下一时间点重复执行的更多相关文章
- java主线程等待所有子线程执行完毕在执行(常见面试题)
java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...
- ORACLE中查询语句的执行顺及where部分条件执行顺序测试
Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...
- C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗
结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...
- 重复执行用例(pytest-repeat)
前言 平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来.自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,或 ...
- Pytest系列(十三)- 重复执行之pytest-repeat的使用
写在前面 这个插件,可以帮助我们很好的解决自动化测试过程中的一些偶线性bug难以复现的问题,但前提是,当前自动化脚本是独立的,不依赖任何其他脚本.个人觉得还是失败重运行的一种体现,就和TestNG是一 ...
- Java多线程--让主线程等待所有子线程执行完毕
数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...
- Spring整合Quartz定时任务执行2次,Spring定时任务执行2次
Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...
- 关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)
以前看到网上一些小程序,在处理完事物后会自动发送qq消息,但是一直搞不懂是说明原理.也在网上找过一些python登陆qq发送消息的文字,但是都太复杂了.今天偶然看到一篇文章,是用python调用win ...
- C# 本进程执行完毕后再执行下一线程
最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...
随机推荐
- django abstract base class ---- 抽象基类
抽象蕨类用于定义一些同享的列.类本身并不会在数据库端有表与之对应 一.例子: 1.定义一个叫Person 的抽象基类.Student 继承自Person from django.db import m ...
- Linux安装Scala步骤
1.到官方下载tgz的安装包. http://www.scala-lang.org/download/ 注意:在最下面的Other Resources中 2.下载后将压缩包放在/usr/local目录 ...
- 50篇经典珍藏 | Docker、Mesos、微服务、云原生技术干货
概念篇 全方位探(tian)索(keng)Mesos各种存储处理方式 老肖有话说@Mesos User Group第四次约会 技术实践 | Mesos 全方位“烹饪”指南 回顾 JAVA 发展轨迹,看 ...
- apache官方中文hadoop说明文档地址
http://hadoop.apache.org/docs/r1.0.4/cn/quickstart.html
- mysql学习笔记1---mysql ERROR 1045 (28000): 错误解决办法(续:深入分析)
在命令行输入mysql -u root –p,输入密码,或通过工具连接数据库时,经常出现下面的错误信息,详细该错误信息很多人在使用MySQL时都遇到过. ERROR 1045 (28000): Acc ...
- love2d 0.9发布
2013年12月13(有点遗憾,一个星期后才知道),love2d终于发布新版本了, 可以直接从我的百度网盘下载. 主要的更新有:(简单翻译自官方论坛说明) LuaJIT: 默认使用LuaJIT,性能大 ...
- Unix系统编程()发送信号的其他方式:raise和killpg
有时,进程需要向自身发送信号,raise 函数就执行了这一任务. #include <signal.h> int raise(int sig); 在单线程程序中,调用raise相当于对ki ...
- openvpn 移植之buildroot添加相关选项
openvpn 移植第一步,在buildroot 内添加 openssl ,openvpn , 另外还有一个 RSA 的支持,我不确定这个需要程度如何,但是也添加进去了. buildroot 添加相关 ...
- [shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别
一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章. 转自:http://ww ...
- beaglebone black ubuntu display x11 server的配置
Change default resolution on BeagleBone modesetting vs fbdev digiteltlc May 7th, 2014, 03:28 PM Hi ...