Lập lịch trình chạy tự động với @Scheduled annotation trpng Spring boot

Để lập lịch trình chạy một công việc theo định kỳ trong spring boot chúng ta có thể sử dụng @EnableScheduling@Scheduled annotation. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về cách sử dụng và thực hành thông qua những ví dụ để có thể hiểu rõ hơn.

@EnableScheduling annotation trong spring boot

@EnableScheduling annotation được sử để đảm bảo rằng backgroud task excutor được khởi tạo. Nếu ứng khởi chạy không được chú thích với @EnableScheduling chúng ta sẽ không thể lập lịch chạy task định kỳ được chú thích bởi @Scheduled. 

Nội bộ @EnableScheduling sẽ import SchedulingConfiguration sử dụng để cấu hình tự động trong spring boot.

@SpringBootApplication
@EnableScheduling
public class SchedulingApplication {

	public static void main(String[] args) {
		SpringApplication.run(SchedulingApplication.class, args);
	}

}

@Scheduled annotation trong spring boot

@EnableScheduling cho phép ứng dụng của chúng ta có thể lập lịch trình chạy các task theo định, giờ đây chúng ta có thể sử dụng @Scheduled annotation để đánh dấu các method sẽ được chạy theo lịch được lập sẵn.

SchedisedAnnotationBeanPostProcessor sẽ được tạo bởi SchedulingConfiguration sẽ quét tất cả các bean đã khai báo để biết sự hiện diện của các @Scheduled annotation.

@Scheduled với fixedRate

Thuộc tính fixedRate dùng để chỉ định một khoảng thời gian cố định mà công việc sẽ được thực hiện định kỳ.

Ví dụ tạo bộ in thời gian hiện tại mỗi 5000 milliseconds

@Component
public class ScheduleTaskFixedRate {

    private static final Logger log = LoggerFactory.getLogger(ScheduleTaskFixedRate.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }

}
2020-12-25 11:31:07.014  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:07
2020-12-25 11:31:12.013  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:12
2020-12-25 11:31:17.014  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:17
2020-12-25 11:31:22.013  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:22
2020-12-25 11:31:27.013  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:27
2020-12-25 11:31:32.013  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:32
2020-12-25 11:31:37.013  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:37
2020-12-25 11:31:42.013  INFO 13160 --- [   scheduling-1] c.deft.scheduling.ScheduleTaskFixedRate  : The time is now 11:31:42
.....

@Scheduled với fixedDelay

Thuộc tính fixedDelay được dùng để chỉ định khoảng thời gian giữa cách nhau giữa 2 lần chạy task. Chúng ta cần phân biệt rõ giữa fixedDelay và fixedRate để không nhầm lẫn:

  • fixedDelay – Khoảng cách giữa 2 lần chạy task được tính từ thời gian kết thức task đầu tiên cho đến thời gian của lần chạy task tiếp theo.
  • fixedRate – Khoảng cách giữa 2 lần chạy task, cứ mỗi fixedRate time là task tiếp theo sẽ được chạy bất kể task trước có xong hay chưa.

@Component
public class ScheduleTaskFixedDelay {

    private static final Logger log = LoggerFactory.getLogger(ScheduleTaskFixedRate.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedDelay = 5000)
    public void fixedDelayTask() {
        log.info("Method executed at every 5 seconds", dateFormat.format(new Date()));
    }

}

@Scheduled với Cron expression

Cron Expression cung cấp cơ chế lập lịch linh hoạt hơn thông qua biểu thức theo chuẩn cron.

+-------------------- second (0 - 59)
|  +----------------- minute (0 - 59)
|  |  +-------------- hour (0 - 23)
|  |  |  +----------- day of month (1 - 31)
|  |  |  |  +-------- month (1 - 12)
|  |  |  |  |  +----- day of week (0 - 6) (Sunday=0 or 7)
|  |  |  |  |  |
|  |  |  |  |  |  
*  *  *  *  *  *  

Ví dụ lập task chạy mỗi 5s với cron

@Component
public class ScheduleTaskCron {

    private static final Logger log = LoggerFactory.getLogger(ScheduleTaskFixedRate.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron = "*/5 * * * * ?")
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }

}

Các bạn có thể tham khảo một số mẫu ví dụ về biểu thức cron:

  • “0 0 * * * *” – Chạy mỗi khi 0p 0s mỗi ngày.
  • “*/10 * * * * *” – Chạy mỗi 10p.
  • “0 0 8-10 * * *” –  Chạy mỗi 8, 9 và 10h mỗi ngày.
  • “0 0 6,19 * * *” – 6:00 AM và 7:00 PM mỗi ngày.
  • “0 0/30 8-10 * * *” – 8:00, 8:30, 9:00, 9:30, 10:00 và 10:30 mỗi ngày.
  • “0 0 9-17 * * MON-FRI” – Trong khoảng 9h đến 5h các ngày từ thứ 2 đến thứ 6
  • “0 0 0 25 12 ?” – Mỗi ngày Giáng sinh vào lúc nửa đêm

Kết bài

Như vậy là chúng ta đã biết cách tạo mỗi lập lịch trình để thực thi công việc nhất định. Đây là một trong số những công việc mà những dự án lớn rất cần thiết. Ví dụ như một số tác vụ thường dùng như ngân hàng quét tất cả các thông mà người dùng đăng ký tài khoản nhưng chưa được xử lý đưa lên bảng tin cho ngày hôm sau để nhân viên xử lý.

Sau cùng, mã nguồn được mình công khai trên gitlab: scheduling 

Nguồn tham khảo

https://spring.io/guides/gs/scheduling-tasks/

https://howtodoinjava.com/spring-boot/enable-scheduling-scheduled-job-example/

https://javahowtos.com/guides/107-spring/321-difference-between-fixedrate-and-fixeddelay-parameter-in-scheduled-in-spring.html

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html

1 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x