java订单超时取消设计_quartz框架和关闭超时订单
Quartz
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標準的Java組件或 EJBs。Quartz的最新版本為Quartz 2.3.0。Quartz 是一個完全由 Java 編寫的開源作業調度框架,為在 Java 應用程序中進行作業調度提供了簡單卻強大的機制。
Quartz 可以與 J2EE 與 J2SE 應用程序相結合也可以單獨使用。
Quartz 允許程序開發人員根據時間的間隔來調度作業。
Quartz 實現了作業和觸發器的多對多的關系,還能把多個作業與不同的觸發器關聯。Scheduler:調度容器
Job:Job接口類,即被調度的任務
JobDetail:Job的描述類,job執行時的依據此對象的信息反射實例化出Job的具體執行對象。
Trigger:觸發器,存放Job執行的時間策略。用于定義任務調度時間規則。
JobStore: 存儲作業和調度期間的狀態
Calendar:指定排除的時間點(如排除法定節假日)
Quartz框架的使用思路job - 任務 - 你要做什么事?
Trigger - 觸發器 - 你什么時候去做?
Scheduler - 任務調度 - 你什么時候需要去做什么事?
Job
Job 是一個接口,只有一個方法void execute(JobExecutionContext context),開發者實現接口來定義任務。JobExecutionContext類提供了調度上下文的各種信息。Job 運行時的信息保存在JobDataMap實例中。
JobDetailImpl 類 / JobDetail 接口
JobDetailImpl類實現了JobDetail接口,用來描述一個 job,定義了job所有屬性及其 get/set 方法。
Trigger
是一個類,描述觸發Job執行的時間觸發規則。主要有SimpleTrigger和CronTrigger這兩個子類。當僅需觸發一次或者以固定時間間隔周期執行,SimpleTrigger是最適合的選擇;而CronTrigger則可以通過Cron表達式定義出各種復雜時間規則的調度方案:如每早晨9:00執行,周一、周三、周五下午5:00執行等;
Calendarorg.quartz.Calendar和java.util.Calendar不同,它是一些日歷特定時間點的集合(可以簡單地將org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一個日歷時間點,無特殊說明后面的Calendar即指org.quartz.Calendar)。
一個Trigger可以和多個Calendar關聯,以便排除或包含某些時間點。假設,我們安排每周星期一早上10:00執行任務,但是如果碰到法定的節日,任務則不執行,這時就需要在Trigger觸發機制的基礎上使用Calendar進行定點排除。
Scheduler調度器,代表一個Quartz的獨立運行容器,好比一個『大管家』,這個大管家應該可以接受Job, 然后按照各種Tigger去運行,Trigger和JobDetail可以注冊到Scheduler中,兩者在Scheduler中擁有各自的組及名稱,組及名稱是Scheduler查找定位容器中某一對象的依據,Trigger的組及名稱必須唯一,JobDetail的組和名稱也必須唯一(但可以和Trigger的組和名稱相同,因為它們是不同類型的)。
Scheduler定義了多個接口方法,允許外部通過組及名稱訪問和控制容器中Trigger和JobDetail。
Scheduler 可以將 Trigger 綁定到某一 JobDetail 中,這樣當 Trigger 觸發時,對應的 Job 就被執行。可以通過 SchedulerFactory創建一個 Scheduler 實例。
Scheduler 擁有一個 SchedulerContext,它類似于 ServletContext,保存著 Scheduler 上下文信息,Job 和 Trigger 都可以訪問 SchedulerContext 內的信息。
SchedulerContext 內部通過一個 Map,以鍵值對的方式維護這些上下文數據,SchedulerContext 為保存和獲取數據提供了多個 put() 和 getXxx() 的方法。可以通過Scheduler# getContext()獲取對應的SchedulerContext實例;
ThreadPoolScheduler 使用一個線程池作為任務運行的基礎設施,任務通過共享線程池中的線程提高運行效率。
quartz Cron表達式Cron 表達式是一個字符串,分為 6 或 7 個域,每一個域代表一個含義
Cron 有如下兩種語法格式:
(1)Seconds Minutes Hours Day Month Week Year
(2)Seconds Minutes Hours Day Month Week
corn 從左到右(用空格隔開):秒 分 小時 月份中的日期 月份 星期中的日期 年份
字段含義:
Cron表達式范例周一至周五的上午10:15觸發 0 15 10 ? * 2-6
表示在每月的1日的凌晨2點調整任務 0 0 2 1 * ?
表示在每月的1日的凌晨2點調整任務 0 0 2 1 * ?
朝九晚五工作時間內每半小時 0 */30 9-16/1 * * ?
每天上午10點,下午2點,4點 0 0 10,14,16 * * ?
表示每個星期三中午12點 0 0 12 ? * 4
在每天下午2點到下午2:59期間的每1分鐘觸發 0 * 14 * * ?
在每天下午2點到下午2:05期間的每1分鐘觸發 0 0-5/1 14 * * ?
在每天下午2點到下午2:55期間的每5分鐘觸發0 0-55/5 14 * * ?
在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發 0 0-55/5 14,18 * * ?
注意:“?”字符只在日期域和星期域中使用。它被用來指定“非明確的值”。
例如:
想在每月的20日觸發調度0 0 0 20 * ?,只能使用如下寫法:0 0 0 20 * ?。其中最后一位只能用?,而不能使 用*,因為*表示不管星期幾都會觸發恰好與20沖突。
scheduled定時任務器案例
1. scheduled基于配置方式
job類
public class JobDemo {
@Scheduled(cron="*/1 * * * * ?")
public void method(){
System.out.println(new Date());
}
}
applicationContext-task.xml
xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task.xsd">
測試類
public class ScheduledTest {
public static void main(String[] args) throws IOException {
new ClassPathXmlApplicationContext("classpath:applicationContext-task.xml");
System.in.read();
}
}
scheduled基于注解方式
job類
@Component
@EnableScheduling //告訴spring這是個定時任務類public class JobDemo {
@Scheduled(cron="*/1 * * * * ?")
public void method(){
System.out.println(new Date());
}
}
applicationContext-task.xml
xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task.xsd">
測試類
public class ScheduledTest {
public static void main(String[] args) throws IOException {
new ClassPathXmlApplicationContext("classpath:applicationContext-task.xml");
System.in.read();
}
}
Quartz框架的使用
修改ego的pom.xml
... ...
2.2.2
.......
org.quartz-scheduler
quartz
${quartz.version}
修改ego-order-web的pom.xml
......
org.quartz-scheduler
quartz
job類
public class JobDemo implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println(new Date()+"------------------------------------");
}
}
測試類
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
/*** job:任務類 做什么事* trigger:觸發器 什么時候做* scheduled:任務調度容器 什么時候做什么事*/
//創建job對象JobDetail job = JobBuilder.newJob(JobDemo.class).build();
//創建trigger對象CronTrigger trigger = TriggerBuilder.newTrigger().withSchedule(
CronScheduleBuilder.cronSchedule("*/1 * * * * ?")).build();
//創建scheduled對象Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job, trigger);
//啟動scheduler.start();
}
}
Spring整合Quartz框架
job類
public class JobDemo2{
public void execute(){
System.out.println(new Date()+"------------------------------------");
}
}
applicationContext-task.xml
xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task.xsd">
測試類
public class QuartzTest2 {
public static void main(String[] args) throws IOException {
new ClassPathXmlApplicationContext("classpath:applicationContext-task.xml");
System.in.read();
}
}
ego項目關閉超時2天未付款的訂單
1、 在訂單系統中導入相關的依賴
2、 定義joba) 掃描訂單表修改訂單的狀態為關閉狀態,訂單的結束時間、關閉時間、修改時間為當前時間
把訂單中商品的庫存數量加回去
掃描條件:狀態是未付款 并且 創建時間 <= 當前之間 – 2天 并且 付款方式為在線支付的訂單
3、 定義觸發a) 理論上需要實時觸發(性能問題)
b) 1分鐘觸發一次
job類
public class OrderQuartz {
@Autowired
private OrderService orderService;
/*** 關閉超時訂單*/
public void closeTimeOutOrder(){
//1、查詢超時訂單 List tbOrderList = orderService.listOvertimeOrder();
//2、關閉超時訂單:status、updatetime、endtime、closetime for (TbOrder tbOrder : tbOrderList) {
tbOrder.setStatus(6);
tbOrder.setUpdateTime(new Date());
tbOrder.setEndTime(new Date());
tbOrder.setCloseTime(new Date());
orderService.closeTimeOutOrder(tbOrder);
//3、把訂單中商品的庫存數量加回去List orderItemList = orderService.listOrderItem(tbOrder.getOrderId());
for (TbOrderItem tbOrderItem : orderItemList) {
orderService.addItemNum(tbOrderItem.getItemId(),tbOrderItem.getNum());
}
}
}
}
service
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private TbOrderMapper tbOrderMapper;
@Autowired
private TbOrderItemMapper tbOrderItemMapper;
@Autowired
private TbItemMapper tbItemMapper;
@Override
public List listOvertimeOrder() {
return tbOrderMapper.listOvertimeOrder();
}
@Override
public void closeTimeOutOrder(TbOrder tbOrder) {
tbOrderMapper.updateByPrimaryKeySelective(tbOrder);
}
@Override
public List listOrderItem(String orderId) {
TbOrderItemExample tbOrderItemExample = new TbOrderItemExample();
Criteria criteria = tbOrderItemExample.createCriteria();
criteria.andOrderIdEqualTo(orderId);
return tbOrderItemMapper.selectByExample(tbOrderItemExample);
}
@Override
public void addItemNum(String itemId, Integer num) {
TbItem item = tbItemMapper.selectByPrimaryKey(Long.parseLong(itemId));
//原庫存+numitem.setNum(item.getNum()+num);
tbItemMapper.updateByPrimaryKeySelective(item);
}
mapper層
1.接口添加List listOvertimeOrder();
2.xml配置文件中添加查詢語句
SELECT
*
FROM
tb_order
WHERE
create_time <= DATE_SUB(NOW(), INTERVAL 2 DAY)
AND STATUS = 1
applicationContext-task.xml
xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task.xsd">
總結
以上是生活随笔為你收集整理的java订单超时取消设计_quartz框架和关闭超时订单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows winrar 指令_【转
- 下一篇: zabbix如何添加图表显示内容_Zab