Giới thiệu về Tùy chỉnh Tác vụ Định kỳ
Trong Spring Framework, annotation @Scheduled được sử dụng để tạo các tác vụ định kỳ một cách dễ dàng. Tuy nhiên, để có thể tùy chỉnh sâu hơn về cách các tác vụ này được thực thi, chẳng hạn như cấu hình pool thread riêng, chúng ta có thể sử dụng interface SchedulingConfigurer.
Interface SchedulingConfigurer cho phép bạn can thiệp vào quá trình cấu hình của bộ lập lịch tác vụ (task scheduler), từ đó bạn có thể:
- Cấu hình một pool thread tùy chỉnh để thực thi các tác vụ định kỳ.
- Thay thế bộ lập lịch mặc định bằng các framework khác như Quartz nếu cần.
- Định nghĩa các chiến lược thực thi nâng cao.
Cách triển khai SchedulingConfigurer
Để bắt đầu, chúng ta cần tạo một lớp cấu hình và implements interface SchedulingConfigurer. Trong phương thức configureTasks, chúng ta sẽ định nghĩa và cấu hình bộ lập lịch tùy chỉnh.
Dưới đây là một ví dụ về cách cấu hình một ThreadPoolTaskScheduler với kích thước pool và tiền tố tên thread được định nghĩa.
@Configuration
public class CustomScheduleConfig implements SchedulingConfigurer {
/**
* Phương thức này được gọi để cấu hình bộ lập lịch tác vụ.
* Chúng ta sẽ tạo một scheduler tùy chỉnh và gán nó cho registrar.
*
* @param registrar Đối tượng chứa cấu hình scheduler.
*/
@Override
public void configureTasks(ScheduledTaskRegistrar registrar) {
// Tạo một instance của ThreadPoolTaskScheduler
ThreadPoolTaskScheduler customScheduler = new ThreadPoolTaskScheduler();
// Cấu hình kích thước pool thread
customScheduler.setPoolSize(8);
// Đặt tiền tố cho tên thread để dễ dàng nhận diện
customScheduler.setThreadNamePrefix("my-custom-scheduler-");
// Khởi tạo scheduler
customScheduler.initialize();
// Gán scheduler tùy chỉnh vào registrar
registrar.setScheduler(customScheduler);
}
}
Cách sử dụng
Sau khi đã cấu hình bộ lập lịch tùy chỉnh, bạn cần thực hiện hai bước đơn giản:
- Thêm annotation
@EnableSchedulingvào lớp chính (main application class) của bạn để kích hoạt tính năng lập lịch. - Sử dụng annotation
@Scheduledtrên các phương thức bạn muốn thực thi định kỳ.
Ví dụ về một phương thức được lập lịch:
@Scheduled(cron = "0 * * * * ?")
public void executePeriodicTask() {
System.out.println("Tác vụ định kỳ đang chạy vào: " + LocalDateTime.now() + " bởi thread: " + Thread.currentThread().getName());
}
Kết quả mong đợi
Khi ứng dụng được khởi động, bạn sẽ thấy các log tương tự như sau, cho thấy các tác vụ đang được thực thi bởi các thread có tên được định nghĩa trong cấu hình tùy chỉnh.
2024-08-16 10:15:00.123 INFO my-custom-scheduler-3 ... - Tác vụ định kỳ đang chạy vào: 2024-08-16T10:15:00.123 bởi thread: my-custom-scheduler-3
2024-08-16 10:16:00.456 INFO my-custom-scheduler-1 ... - Tác vụ định kỳ đang chạy vào: 2024-08-16T10:16:00.456 bởi thread: my-custom-scheduler-1
2024-08-16 10:17:00.789 INFO my-custom-scheduler-5 ... - Tác vụ định kỳ đang chạy vào: 2024-08-16T10:17:00.789 bởi thread: my-custom-scheduler-5