Quartz Scheduler là một thư viện giúp chúng ta có thể lên lịch để chạy một tác vụ nào đó vào một thời điểm nào đó. Bằng cách định nghĩa thời gian hoặc sử dụng Cron Expression mà chúng ta thường sử dụng để tạo các Cron Job trong Linux, Quartz Scheduler sẽ giúp chúng ta trigger các tác vụ mà chúng ta muốn vào một thời gian cụ thể hoặc trong một số trường hợp cụ thể. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu về Quartz Scheduler trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
với Quartz Scheduler dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> |
Để làm việc với Quartz Scheduler, các bạn cần nắm 3 khái niệm cơ bản:
Quartz Job: khái niệm này dùng để định nghĩa tác vụ mà chúng ta muốn chạy. Chúng ta sẽ implement interface org.quartz.Job để định nghĩa tác vụ này.
Quartz Trigger dùng để định nghĩa thời gian mà chúng ta sẽ chạy tác vụ trên. Như mình đã nói ở trên, chúng ta có thể chỉ định rõ thời gian để chạy tác vụ hoặc sử dụng Cron Expression để định nghĩa thời gian theo ngày, theo tháng, theo năm.
Scheduler: mặc định thì Quartz Job và Quartz Trigger không liên quan gì với nhau cả, để có thể dùng Quartz Trigger trigger Quartz Job chạy, chúng ta cần sử dụng đối tượng Scheduler để làm điều này.
Bây giờ chúng ta sẽ thử implement một Quartz Job:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class QuartzJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello from Huong Dan Java"); } } |
một Quartz Trigger:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.huongdanjava.quartz; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; public class QuartzExample { public static void main(String[] args) { Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("huongdanjavaTrigger", "group") .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) .repeatForever() ) .build(); } } |
Ở phần Trigger này, method withIdentity() dùng để phân biệt Trigger này với các trigger khác trong trường hợp các bạn có nhiều Trigger cùng đang chạy, nếu các bạn không khai báo thì một giá tri random sẽ được generated.
Ở đây mình đang sử dụng SimpleSchedulerBuilder giúp chúng ta có thể set thời gian để Trigger chạy, có lặp lại hay không?
Như mình đã nói, chúng ta còn có thể sử dụng Cron Expression để build Trigger. Ví dụ như sau:
1 2 3 4 5 6 |
Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("huongdanjavaTrigger", "group") .withSchedule( CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); |
Để build Trigger này, các bạn cần có chút hiểu biết về Cron Expression nhé! Ở đây, mình đang set cho Trigger chạy sau mỗi một 5s một lần.
và sử dụng Scheduler để chạy tác vụ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package com.huongdanjava.quartz; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class QuartzExample { public static void main(String[] args) throws SchedulerException { Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("huongdanjavaTrigger", "group") .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) .repeatForever() ) .build(); JobDetail job = JobBuilder.newJob(QuartzJob.class) .withIdentity("huongdanjavaJob", "group") .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } } |
Kết quả khi chạy ví dụ này như sau:
Các bạn sẽ thấy, cứ sau mỗi 5s, ứng dụng của chúng ta sẽ chạy tác vụ in dòng chữ “Hello from Huong Dan Java” ra console.
Dân gian
Thanks bạn!
Hoàng
Mình thấy trong spring boot có @Scheduled và spring boot quartz , và cái bạn đang giới thiệu, vậy chúng có khác biệt nhiều không và nên sử dụng cái nào
Chiến
Thanks bạn!