Quartz筆記
最近碰到了一個場景,需要能夠在指定時間執行任務,比如每周周六周日的3點開啟一個服務,那麼總不能說,把以後的每個周六周日的日期列出來讓程式執行吧,是以就百度了一下找到了這麼一個開源架構,Qartz,這個東西上手還是蠻簡單的,是以打算記錄下來
配置
maven的話,比較容易,就添加上項目依賴就好了
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
emmm,maven倉庫能搜到的最新的是2.3.0的,但是官網都沒出教程= =是以我還是選擇了2.2.1,慫一點總沒錯,況且需要功能不多。
配置檔案
這個比較簡單,就在resources檔案夾裡面放一個名字叫
quartz.properties
的檔案,然後裡面寫幾句話:
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount =
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
那麼第一個就是名字,第二個是最大線程數,就跟那個,線程池一樣的東西,第三個是存儲方式,他好像是可以把任務存到資料庫,也可以存到RAM,我們最終的希望還是存到資料庫的,但是RAM是新手教程的方式,是以我就先試試RAM,後面再轉JDBC。
運作
這應該是我碰到的最簡單的運作方式了
public class Scheduler implements Runnable{
private static org.quartz.Scheduler scheduler;
@Override
public void run() {
try {
// Grab the TaskHandler instance from the Factory
scheduler = StdSchedulerFactory.getDefaultScheduler();
// and start it off
scheduler.start();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
獲得一個預設的Scheduler,然後start就行了
然後你就能看到這個:
就啟動完成啦
建立一個任務
他的一個任務是叫做,job,顧名思義,就是任務,比如該咋幹活,然後啥的,主要是一個任務流程問題,那麼我們看一下内部。
public interface Job {
void execute(JobExecutionContext var1) throws JobExecutionException;
}
内部非常簡單,一個execute就行啦,是以我們需要做的,就是實作這個任務
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("fin's job");
}
}
我們就建立了一個job,那麼當要執行這個任務的時候,就會執行execute了!是以說我們隻需要定義好這個execute,就能正确執行我們想要的東西了。
那麼這個job怎麼放到任務裡,他有個builder模式,名稱為
org.quartz.JobBuilder
,那麼我們可以通過這個來構造一個job
JobDetail就是我們需要執行的一個任務了,他是通過JobBuilder類的newJob靜态方法,将我們執行個體化的Job給建構出來,然後build後生成我們需要的JobDetail對象。
Job傳值
job的builder可以使用
usingJobData
方法來進行傳值,那麼這個東西在架構中被稱作:JobDataMap,還是很明顯,意思是任務資料map,usingJobData可以了解成Map.put(),前面是key,後面是value。
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.usingJobData("name","finQQ")
.build();
那麼我們怎麼獲得這個值。
隻需要這句話:
Map map = jobExecutionContext.getJobDetail().getJobDataMap();
System.out.println(map.get("name") + "'s job");
這樣就獲得了我們需要的資料。同樣,builder裡面還有很多函數可以供我們選擇。
觸發器
剛剛Job是做什麼,那麼Trigger就是什麼時候做,我們最需要的就是這個Trigger
建立Trigger也是通過所謂的TriggerBuilder來建立
Trigger trigger = TriggerBuilder.newTrigger()
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds()
.repeatForever())
.build();
上面就是建立一個觸發器。
- startNow 現在開始
- withSchedule 日程表,這個就是決定我們什麼時候做什麼的,有SimpleSchedule還有CronSchedule,這個就是建立一個每40秒循環一次然後循環到死的普通日程表
- build 建構開始
Schedule
Cronschedule應該是我需要的那種,是以晚點會專門研究一下。。
最後一步
添加我們的job和trigger到工作區
效果
可以看到,每隔40秒就列印出了一個消息,下一篇我會根據實際應用寫一下我的使用