Code ví dụ Java đặt lịch với Quartz Scheduler.
(Xem thêm: Code ví dụ Java đặt lịch với Timer, TimerTask)
(Xem thêm: Code ví dụ Spring Boot tạo lịch với annotation @Scheduled)
1. Quartz Scheduler là gì?
Quartz là một thư viện, một framework mã nguồn mở cho phép bạn lên lịch các công việc theo một thời gian định nghĩa trước (bao lâu thì lặp lại 1 lần, chạy trong những thời gian nào…)
2. Cài đặt Quartz
Trong bài này mình sẽ thực hiện cài đặt bản 2.2:
2.1 Cài đặt qua file .jar
Các bạn download file Quartz 2.2.3.tar.gz và giải nén, sau đó import các file .jar
vào trong project java
2.2 Cài quartz qua maven
Trường hợp sử dụng maven, các bạn thêm dependency sau đây vào file pom.xml
<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>
3. Code ví dụ
Các công nghệ sử dụng:
Tạo Maven Project
Cấu trúc Project
Thư viện sử dụng:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>stackjava.com</groupId> <artifactId>QuartzExample</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties> <dependencies> <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> </dependencies> </project>
Tạo Job (Task, Công việc)
package stackjava.com.quartzexample; import java.util.Date; import org.quartz.*; public class MyJob implements Job{ public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("Run my Job: "+ new Date()); } }
- Để tạo Job trong quartz, ta implement interface
org.quartz.Job
- Method execute chính là công việc mà Job thực hiện, ở đây công việc của mình thực hiện là in ra màn hình thời gian hiện tại.
Demo1.java
package stackjava.com.quartzexample; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class Demo1 { public static void main(String[] args) throws SchedulerException { Trigger trigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "group1") .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build(); JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("jobName", "group1").build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
- Trigger: thực hiện định nghĩa lịch chạy cho Job. Trong ví dụ này mình tạo lịch đơn giản với
SimpleScheduleBuilder
để thực hiện lặp lại 5 giây một lần và thực hiện mãi mãi. Các bạn có thể thực hiện lặp lại theo giờ, theo phút… với các methodwithIntervalInHours
,withIntervalInMinutes
. Hoặc giới hạn số lần lặp vớiwithRepeatCount
- JobDetail: Sử dụng để định nghĩa thể hiện của Job. Ở đây mình link tới job là class
MyJob.java
- Scheduler: Đây là API chính dùng để giao tiếp với scheduler (cho biết trigger nào gắn với Job nào)
Demo:
Demo2.java
package stackjava.com.quartzexample; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class Demo2 { public static void main(String[] args) throws SchedulerException { Trigger trigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 1-30 * * * ?")).build(); JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("jobName", "group1").build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
- Với
SimpleScheduleBuilder
thì ta chỉ có thể lên lịch một cách đơn giản. Nhưng với những trường hợp phức tạp (chạy vào thời gian nào, trong khoảng nào, loại trừ những thời gian nào…) thì ta cần phải sử dụngCronScheduleBuilder
CronScheduleBuilder
sử dụng cú pháp cron expression để định nghĩa lịch chạy.- Trong ví dụ này mình định nghĩa lịch chạy là
"0/5 1-30 * * * ?"
tức là cứ 5s lặp lại một lần, và chỉ chạy trong phút thứ 1 đến phút thứ 30 của các giờ.
(Xem lại: Cron expression là gì? Hướng dẫn cú pháp cron expression)
Demo:
Code ví dụ Java đặt lịch với Quartz Scheduler
Okay, Done!
Download code ví dụ trên tại đây.
References:
http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/