Quartz 實現定時任務
阿新 • • 發佈:2019-01-05
Quartz 是一個功能強大的作業排程工具,相當於資料庫中的 Job、Windows 的計劃任務、Unix/Linux 下的 Cron,但 Quartz 可以把流程控制的更精細。而且 Quartz1.✘ 版本可以和 Spring 進行結合。
本文使用的 Quartz:
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
參考教程:
https://blog.csdn.net/yangshangwei/column/info/17954
https://blog.csdn.net/u010377605/article/details/77801896/
Quartz 中的 Log 功能依賴於 slf4j:
-
org.slf4j:slf4j-api
-
org.slf4j:slf4f-simple
-
定義一個簡單的 Job 類:
import org.quartz.*; import java.util.Date; public class ExampleJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { JobKey key = jobExecutionContext.getJobDetail().getKey(); System.out.println("Instance: "+key+"------------------"); System.out.println("Date: " + new Date()); JobDataMap properties = jobExecutionContext.getJobDetail().getJobDataMap(); System.out.println("float: " + properties.getFloat("float")); System.out.println("Previous Fire Time: " + jobExecutionContext.getPreviousFireTime());// 上次執行時間 System.out.println("Current Fire Time: " + jobExecutionContext.getFireTime());// 本次執行時間 System.out.println("Next Fire Time: " + jobExecutionContext.getNextFireTime());// 下一次執行時間 } }
- 定義了屬性和 Get Set 函式的 Job 類:
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; /** * 具體執行的任務 */ public class ClassJob implements Job { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobKey key = context.getJobDetail().getKey(); System.out.println("Instance " + key + ",姓名:" + name + ",年齡:" + age); } }
- 使用示例:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* 依賴於:
* org.slf4j:slf4j-api
* org.slf4j:slf4f-simple
*
* 教程:
* https://blog.csdn.net/yangshangwei/column/info/17954
*/
public class Console {
public static void main(String[] args) {
try {
testJob();
testClassJob();
} catch (Exception e) {
e.printStackTrace();
}
}
// 測試使用quartz實現的排程任務
public static void testJob() throws SchedulerException, InterruptedException {
// 建立排程者工廠
SchedulerFactory sfc = new StdSchedulerFactory();
// 通過工廠建立一個排程者
Scheduler scheduler = sfc.getScheduler();
//----------Quartz 2.3.0的寫法---------------//
JobDetail myJob = newJob(ExampleJob.class)
.withIdentity("myJob", "job-group")
.usingJobData("float", 3.14f)
.build();
Trigger trigger = newTrigger()
.withIdentity("mytrigger", "trigger-group")
.startAt(new Date())
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(3)
.repeatForever())
.build();// 排程任務,每隔一定時間執行
Date startDate = scheduler.scheduleJob(myJob, trigger);
System.out.println(myJob.getKey() + " will start at:" + startDate);
// 開始執行排程程式
scheduler.start();
Thread.sleep(10000);// 等待一定時間
scheduler.shutdown();// 關閉排程程式
SchedulerMetaData metaData = scheduler.getMetaData();
System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
System.out.println("Test end------>");
}
public static void testClassJob() throws SchedulerException, InterruptedException {
SchedulerFactory sfc = new StdSchedulerFactory();
Scheduler scheduler = sfc.getScheduler();
JobDetail myJob = newJob(ClassJob.class)
.withIdentity("myJob", "job-group")
.usingJobData("name", "User")
.usingJobData("age",12)
.build();
Trigger trigger = newTrigger()
.withIdentity("mytrigger", "trigger-group")
.startAt(new Date())
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(3)
.repeatForever())
.build();
Date startDate = scheduler.scheduleJob(myJob, trigger);
System.out.println(myJob.getKey() + " will start at:" + startDate);
scheduler.start();
Thread.sleep(10000);// 等待一定時間
scheduler.shutdown();// 關閉排程程式
SchedulerMetaData metaData = scheduler.getMetaData();
System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
System.out.println("Test end------>");
}
}