post-image

@Scheduled annotation trong Spring Boot

Spring Boot Starters & Common Configurations

Ở bài viết trước, mình đã giới thiệu qua về khái niệm Cron JobCron Expression. Bài viết này mình sẽ giới thiệu cho mọi người về annotation @Scheduled được sử dụng để cấu hình và cài đặt thực hiện các công việc theo một chu kỳ nhất định. Và để sử dụng được annotation này chúng ta chỉ cần nhớ 2 điều đơn giản như sau:

  • Phải là phương thức không có kiểu trả về (kiểu void). 
  • Phải là phương thức không có tham số.

Làm thế nào để sử dụng @Scheduled trong Spring ?

@Scheduled đã được tích hợp sẵn trong gói thư viện của spring.framework nên chúng ta không cần tải thêm thư viện để sử dụng nó.

Để tiến hành hỗ trợ lập lịch thực hiện các phương thức bằng cách sử dụng @Scheduled thì chúng ta cần phải khai báo @EnableScheduling ở class được đánh dấu với annotation @Configuration hoặc chúng ta có thể khai báo tại ngay class Application.java

DemoApplication.java

@SpringBootApplication @EnableScheduling public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
Code language: PHP (php)

SpringConfigure.java

@Configuration @EnableScheduling public class SpringConfig { ... }
Code language: PHP (php)

Lập lịch thực hiện với thuộc tính Fixed Delay

Chúng ta hãy cùng thử cấu hình @Scheduled với thuộc tính fixedDelay như sau nhé:

@Scheduled(fixedDelay = 1000) public void scheduleFixedDelayTask() { System.out.println("Fixed delay task - " + System.currentTimeMillis() / 1000); }
Code language: JavaScript (javascript)

Trong trường hợp trên, khoảng thời gian từ khi hoàn thành công việc cũ và bắt đầu một công việc mới được gán cố định là 1 giây.

Lập lịch thực hiện với thuộc tính Fixed Rate

Chúng ta hãy xem xét thử ví dụ sau:

@Scheduled(fixedRate = 1000) public void scheduleFixedRateTask() { System.out.println( "Fixed rate task - " + System.currentTimeMillis() / 1000); }
Code language: JavaScript (javascript)

Và với trường hợp trên tác vụ cũng được thực thi 1 giây 1 lần nhưng điểm khác biệt giữa fixedDelayfixedRate đó là fixedDelay thì sẽ hay được sử dụng trong trường hợp công việc bắt buộc phải được thực hiện xong trước khi được chạy lại. Còn fixedRate được sử dụng trong trường hợp các công việc được thực hiện một cách độc lập.

Lưu ý rằng các tác vụ đã lên lịch không chạy song song theo mặc định. Vì vậy, ngay cả khi chúng ta đã sử dụng fixedRate, tác vụ tiếp theo sẽ không được gọi cho đến khi tác vụ trước đó được thực hiện.

Và để có thể chạy được các tiến trình song song chúng ta có thể sử dụng @EnableAsync như sau:

@EnableAsync public class ScheduledFixedRateExample { @Async @Scheduled(fixedRate = 1000) public void scheduleFixedRateTaskAsync() throws InterruptedException { System.out.println( "Fixed rate task async - " + System.currentTimeMillis() / 1000); Thread.sleep(2000); } }
Code language: PHP (php)

Bây giờ tác vụ không đồng bộ này sẽ được gọi mỗi giây, ngay cả khi tác vụ trước đó chưa được thực hiện.

So sánh Fixed Rate và Fixed Delay

  • Thuộc tính fixedDelay đảm bảo rằng có độ trễ n mili giây giữa thời gian kết thúc thực hiện một tác vụ và thời gian bắt đầu thực hiện nhiệm vụ tiếp theo. Thuộc tính này đặc biệt hữu ích khi chúng ta cần đảm bảo rằng chỉ một phiên bản của tác vụ chạy mọi lúc
  • Thuộc tính fixedRate chạy tác vụ đã lên lịch sau mỗi n mili giây.

Lập lịch với Initial Delay

Chúng ta cùng xem xét đoạn code sau:

@Scheduled(fixedDelay = 1000, initialDelay = 1000) public void scheduleFixedRateWithInitialDelayTask() { long now = System.currentTimeMillis() / 1000; System.out.println( "Fixed rate task with one second initial delay - " + now); }
Code language: JavaScript (javascript)

Lưu ý đoạn code trên đang sử dụng cả thuộc tính fixedDelay cũng như thuộc tính InitialDelay. Phương thức này sẽ được thực thi lần đầu tiên với giá trị của InitialDelay, và những lần sau nó sẽ tiếp tục được thực thi với giá trị của fixedDelay.

Lập lịch với Cron Expression

Mình đã giới thiệu về khái niệm cũng như những kí hiệu của Cron Expression ở bài viết trước các bạn có thể tìm xem lại. Ở đây mình sử dụng @Scheduled với biểu thức cron là 0 0 12 * * ? 

@Scheduled(cron = "0 0 12 * * ?") public void scheduleTaskUsingCronExpression() { long now = System.currentTimeMillis() / 1000; System.out.println( "schedule tasks using cron jobs - " + now); }
Code language: JavaScript (javascript)

Phương thức trên sẽ được thực thi vào lúc 12 giờ hàng ngày.

Kết luận

Vậy là ở bài viết này mình đã hướng dẫn mọi người cách sử dụng @Scheduled để lập lịch thực thi một phương thức trong Spring. Mọi người có thể vận dụng vào trong bài toán tự động gửi email định kỳ hay cập nhật lại dữ liệu định kỳ.

Tham khảo: https://www.baeldung.com/spring-scheduled-tasks

Leave a Reply

Your email address will not be published. Required fields are marked *