日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java订单超时取消设计_quartz框架和关闭超时订单

發布時間:2025/3/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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框架和关闭超时订单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。