Code ví dụ Java đặt lịch với Quartz Scheduler

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

Code ví dụ Java đặt lịch với Quartz Scheduler

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

Code ví dụ Java đặt lịch với Quartz Scheduler

Cấu trúc Project

Code ví dụ Java đặt lịch với Quartz Scheduler

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 method withIntervalInHourswithIntervalInMinutes. Hoặc giới hạn số lần lặp với withRepeatCount
  • 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:

Code ví dụ Java đặt lịch với Quartz Scheduler

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ụng CronScheduleBuilder
  • 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/

stackjava.com