Có thể lên lịch phương thức dịch vụ Spring chỉ một lần vào đúng thời gian đã chỉ định không? Ví dụ: thời gian hiện tại là 2 giờ chiều nhưng khi tôi nhấn nút tác vụ, tôi muốn phương thức dịch vụ của tôi bắt đầu lúc 8 giờ tối. Tôi quen thuộc với chú thích @Scheduled và tôi không chắc chắn cách viết biểu thức cron không chạy định kỳ. Hình ảnh này @Scheduled(cron = "0 0 20 * * ?")
kích hoạt mỗi ngày lúc 8 giờ tối.
Bất kỳ đề xuất nào?Tác vụ lập lịch trình mùa xuân - chỉ chạy một lần
Trả lời
Bạn có thể sử dụng một trong các triển khai TaskScheduler của Spring. Tôi đã cung cấp một ví dụ bên dưới với một ví dụ không yêu cầu cấu hình quá nhiều (ConcurrentTaskScheduler bao bọc một trình thực thi được lập lịch trình đơn luồng).
Phương pháp đơn giản nhất là một trong những tên lịch mà phải mất một Runnable và ngày mà thôi. Điều đó sẽ khiến nhiệm vụ chạy một lần sau khi thời gian được chỉ định. Tất cả các phương thức khác đều có khả năng lập lịch các tác vụ để chạy lặp lại.
Tìm hiểu thêm về task execution & scheduling
Ví dụ đơn giản làm việc:
private TaskScheduler scheduler;
Runnable exampleRunnable = new Runnable(){
@Override
public void run() {
System.out.println("Works");
}
};
@Async
public void executeTaskT() {
ScheduledExecutorService localExecutor = Executors.newSingleThreadScheduledExecutor();
scheduler = new ConcurrentTaskScheduler(localExecutor);
scheduler.schedule(exampleRunnable,
new Date(1432152000000L));//today at 8 pm UTC - replace it with any timestamp in miliseconds to text
}
...
executeTaskT() //call it somewhere after the spring application has been configured
Note:
Để kích hoạt hỗ trợ cho @Scheduled và @Async chú thích thêm @EnableScheduling và @EnableAsync với một trong các @Configurationcủa bạnlớp
Cập nhật - hủy nhiệm vụ theo lịch trình
phương pháp lịch TaskScheduler trả về một ScheduledFuture mà là một hành động trì hoãn kết quả mang có thể được hủy bỏ.
Vì vậy, để hủy bỏ nó, bạn cần phải giữ một xử lý cho nhiệm vụ theo lịch trình (tức là giữ đối tượng trả về ScheduledFuture).
Thay đổi mã trên cho hủy nhiệm vụ:
Khai báo ScheduledFuture bên ngoài phương pháp executeTaskT của bạn.
private ScheduledFuture scheduledFuture;
Sửa gọi để lấy hẹn để giữ các đối tượng trở lại như vậy:
scheduledFuture = scheduler.schedule(exampleRunnable, new Date(1432152000000L));
Gọi hủy trên đối tượng scheduledFuture nơi nào đó trong mã của bạn
boolean mayInterruptIfRunning = true; scheduledFuture.cancel(mayInterruptIfRunning);
Tác phẩm này. Tôi đã mở rộng bản ConcurrentTaskScheduler với trình quản lý tác vụ quản lý luồng máy chủ như thế này 'scheduler = new ConcurrentTaskScheduler (workManagerTaskExecutor, Executors.newSingleThreadScheduledExecutor())'. Nó là một loại 'org.springframework.scheduling.commonj.WorkManagerTaskExecutor' và được cung cấp bởi máy chủ JNDI đăng ký. – shx
Tuyệt vời, đã làm việc cho tôi. btw, nếu runnable với các tham số là cần thiết, bạn có thể viết một phương thức chấp nhận tham số và trả về Runnable và sau đó vượt qua phương thức này trong scheduler với tham số scheduler.schedule (createRunnable (param1), new Date (1432152000000L)); –
Có phải @Async bắt buộc phải đạt được nó không? – Angom
Để không tạo ScheduledExecutorService
và ConcurrentTaskScheduler
ở mọi phương thức gọi là thuận tiện để khởi tạo TaskScheduler
khi tạo dịch vụ, ví dụ:
private final TaskScheduler taskScheduler =
new ConcurrentTaskScheduler(Executors.newScheduledThreadPool(10));
@Async
không có nghĩa là chúng tôi chỉ lên lịch công việc và thoát khỏi phương pháp.
- 1. Tác vụ theo lịch trình mùa xuân đang chạy trong môi trường nhóm
- 2. Tại sao bộ lập lịch tác vụ mùa xuân chờ nhiệm vụ trước đó kết thúc?
- 3. Lập lịch nhiệm vụ chạy một lần, sử dụng không gian tên nhiệm vụ Spring
- 4. Tác vụ được lập lịch Sitecore chỉ chạy mỗi giờ
- 5. Mức độ đáng tin cậy của trình lập lịch biểu tác vụ windows để lập lịch để chạy nhiều lần?
- 6. Lập lịch tác vụ trong Spring/Java
- 7. Trình lập lịch tác vụ - Windows 7
- 8. Lập lịch tác vụ mùa xuân so với ScheduledExecutorService của Java
- 9. Sự cố với Trình lập lịch tác vụ khởi chạy tác vụ
- 10. Lập lịch tác vụ Lua
- 11. Bắt đầu từ mùa xuân <tác vụ: theo lịch-nhiệm vụ>
- 12. Thiết lập tác vụ theo lịch .Net
- 13. Làm cách nào để lên lịch một tác vụ để chạy một lần?
- 14. Chạy Microsoft Access như một Tác vụ Theo lịch
- 15. Trình lập lịch biểu tác vụ Windows để thực hiện các tác vụ trong vài giây
- 16. C# bắt đầu một tác vụ được lập lịch
- 17. Chỉ chạy tác vụ @Scheduled trên một nút cụm WebLogic?
- 18. chạy các tác vụ theo thời gian được lập lịch trình java, apache
- 19. Trình lập lịch tác vụ kết thúc công việc đang chạy như thế nào?
- 20. Tác vụ theo lịch trình với nhiều máy chủ - một điểm trách nhiệm
- 21. Kích thước bộ lập lịch biểu mặc định trong khởi động mùa xuân là gì?
- 22. Khởi động mùa xuân Lập trình hồ sơ thiết lập
- 23. Chạy tác vụ theo lịch Windows từ ASP.net
- 24. Làm cách nào để lên lịch các tác vụ một lần từ ứng dụng Perl CGI?
- 25. Làm thế nào để thiết lập task scheduler vào mùa xuân để chạy mỗi 1 phút
- 26. Tác vụ trì hoãn: lập lịch thực hiện lần đầu tiên trong Spring 3
- 27. Mùa xuân - Lập trình tạo tập hợp các hạt
- 28. Tác vụ theo lịch trình với Sql Azure?
- 29. mùa xuân lên lịch tắt máy lỗi
- 30. Singleton mùa xuân được gọi hai lần
u có thể sử dụng lịch trình thạch anh :) –