一.場景(什麼時候用到定時任務)
檔案跑批,定時處理資料,和業務解耦的場景
二.目前都有哪些工具可以定時處理資料
1.jdk的timertask:資料量小的情況下,單執行緒的
2.kettle:比較適合邏輯不復雜的資料推送
3.quartz:資料量大的情況下,分散式下的定時任務處理
三.如何整合
1.jar包下載
地址:https://www.jb51.net/softs/539791.html
2.理解幾個核心概念
scheduler任務排程、Job任務、Trigger觸發器、JobDetail任務細節
Job任務:
其實Job是介面,其中只有一個execute方法:
package org.quartz; public abstract interface Job { public abstract void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException; }
我們開發者只要實現此介面,實現execute方法即可。把我們想做的事情,在execute中執行即可。
JobDetail:
任務細節,Quartz執行Job時,需要新建個Job例項,但是不能直接操作Job類,所以通過JobDetail來獲取Job的名稱、描述資訊。
Trigger觸發器:
執行任務的規則;比如每天,每小時等。
一般情況使用SimpleTrigger,和CronTrigger,這個觸發器實現了Trigger介面。
對於複雜的時間表示式來說,比如每個月15日上午幾點幾分,使用CronTrigger
對於簡單的時間來說,比如每天執行幾次,使用SimpleTrigger
scheduler任務排程:
最核心的概念,需要把JobDetail和Trigger註冊到scheduler中,才可以執行。
四.配置示例
1.模擬新建一個工作
package tcc.test.quartz; import com.util.RowList; import jos.engine.core.jdbc.JdbcTemplate; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.util.Date; /** * Copyright (C) @2022 * * @author: tcc * @version: 1.0 * @date: 2022/3/7 * @time: 18:20 * @description:寫業務邏輯 */ public class TccJob implements Job { private static String sql = "select * from sr_main limit 100"; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("hello"+new Date()); JdbcTemplate jdbcTemplate = new JdbcTemplate(); RowList rowList = jdbcTemplate.queryRowList(sql); for(int i=0;i<rowList.size();i++){ System.out.println(rowList.get(i).get("mhzsfz")); } } }
2.配置一個監聽器,模擬初始化任務,處理db資料
package tcc.test.quartz;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
* Application Lifecycle Listener implementation class
* ApplicationContextListener
*
*/
public class ApplicationContextListener implements ServletContextListener {
public static Scheduler scheduler = null;
/**
* Default constructor.
*/
public ApplicationContextListener() {
System.out.println("ApplicationContextListener起來了");
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
//關閉Web應用時,登出定時任務
public void contextDestroyed(ServletContextEvent arg0) {
try {
scheduler.shutdown();
System.out.println("scheduler.shutdown");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
//開啟Web應用時,開啟定時任務
public void contextInitialized(ServletContextEvent arg0) {
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
//在這裡我編寫了三個定時任務
JobDetail updataTheStatus = JobBuilder.newJob(TccJob.class)
.withIdentity("updataTheStatus", "group1")
.build();
JobDetail updateTheRemainer = JobBuilder.newJob(TccJob.class)
.withIdentity("updateTheRemainer", "group2")
.build();
JobDetail deleteYstdayOrder = JobBuilder.newJob(TccJob.class)
.withIdentity("deleteYstdayOrder", "group3")
.build();
//三個觸發器
Trigger trigger1 = updateTheStatus();
Trigger trigger2 = updateTheRemainer();
Trigger trigger3 = deleteYstdayOrder();
//註冊
scheduler.scheduleJob(updataTheStatus, trigger1);
scheduler.scheduleJob(updateTheRemainer, trigger2);
scheduler.scheduleJob(deleteYstdayOrder, trigger3);
scheduler.start();
System.out.println("start");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//下面是定義三個觸發器的靜方法
public static Trigger updateTheStatus() {
//每天的19:18分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 18 19 * * ? "))
.startNow()
.build();
return trigger;
}
public static Trigger updateTheRemainer() {
//每天的19:18分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger2", "group2")
.withSchedule(CronScheduleBuilder.cronSchedule("0 18 19 * * ? "))
.startNow()
.build();
return trigger;
}
public static Trigger deleteYstdayOrder() {
//每天的19:18分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger3", "group3")
.withSchedule(CronScheduleBuilder.cronSchedule("0 18 19 * * ? "))
.startNow()
.build();
return trigger;
}
}
3.在專案的web.xml配置監聽器,初始化ApplicationContextListener
<listener> <listener-class>tcc.test.quartz.ApplicationContextListener</listener-class> </listener>
ServletContextListener:tomcat容器啟動時例項化,容器當機時銷燬
執行結果:
五.線上cron表示式地址 https://cron.qqe2.com/
變態一點的表示式:
每個月第二個週週六上午十點
0 0 10 ? * 6#2 *
秒 分 時 日 月 周 年