Chạy các nhiệm vụ nền theo lịch trình trong Spring
1. @Scheduled Annotation
Đôi khi trong một ứng dụng bạn cần tạo ra một nhiệm vụ chạy ngầm bên dưới ứng dụng theo một lịch trình đặt sẵn. Chẳng hạn tạo ra các tập tin sitemap, gửi email định kỳ,...
@Scheduled là một Annotation sử dụng để cấu hình một lịch trình (schedule), nó được gắn trên một phương thức, và phương thức này sẽ được chạy theo lịch được cấu hình bởi @Scheduled.
@Scheduled
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
Thuộc tính | Mô tả |
cron | Là một biểu thức cron, mở rộng từ định nghĩa thông dụng UN*X, nó chứa 6 trường "giây, phút, giờ, ngày trong tháng, tháng, ngày của tuần". Giúp chỉ định một lịch trình phức tạp. (Xem thêm phía dưới tài liệu).
|
zone | Một múi giờ mà biểu thức cron sẽ được dùng. Theo mặc định, thuộc tính này là String rỗng (nghĩa là múi giờ địa phương của máy chủ sẽ được sử dụng). |
fixedDelay | Thực thi các phương thức được chú thích (annotated), sau khi hoàn thành nghỉ một khoảng thời gian cố định theo mili giây, sau đó thực thi lượt tiếp theo.
|
fixedDelayString | Thực thi các phương thức được chú thích (annotated), sau khi hoàn thành nghỉ một khoảng thời gian cố định theo mili giây, sau đó thực thi lượt tiếp theo.
|
fixedRate | Thực thi phương thức được chú thích (annotated), với một khoảng thời gian cố định giữa các lần gọi.
|
fixedRateString | Thực thi phương thức được chú thích (annotated), với một khoảng thời gian cố định giữa các lần gọi.
|
initialDelay | Khoảng thời gian tính bằng mili giây tạm dừng trước khi thực thi lần đầu tiên, sử dụng cùng với fixedRate() hoặc fixedDelay().
|
initialDelayString | Khoảng thời gian tính bằng mili giây tạm dừng trước khi thực thi lần đầu tiên, sử dụng cùng với fixedRate() hoặc fixedDelay().
|
2. @EnableScheduling Annotation
Để có thể chạy các tác vụ nền trong một ứng dụng Spring, bạn cần phải cấu hình để bật tính năng lịch trình bằng cách sử dụng @EnableScheduling.
SchedulerConfig.java
package org.o7planning.sbschedule.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@EnableScheduling
public class SchedulerConfig {
// Khai báo các Bean liên quan tới Schedule ở đây nếu cần thiết.
}
3. fixedDelay & fixedRate
Đây là một ví dụ đơn giản nhất, sử dụng @Schedule với thuộc tính fixedDelay. Trong ví dụ này, nhiệm vụ sẽ in ra màn hình Console thời gian hiện tại, sau khi nhiệm vụ kết thúc nó sẽ tạm ngừng fixedDelay giây trước khi thực thi lại nhiệm vụ này.
WriteCurrentTimeSchedule.java
package org.o7planning.sbschedule.schedule;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class WriteCurrentTimeSchedule {
private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss sss");
// initialDelay = 3 second.
// fixedDelay = 2 second.
@Scheduled( initialDelay = 3 * 1000, fixedDelay = 2 * 1000)
public void writeCurrentTime() {
Date now = new Date();
String nowString = df.format(now);
System.out.println("Now is: "+ nowString);
}
}
Bạn có thể cấu hình thời gian trễ cho lần thực thi đầu tiên (initialDelay), sau khi ứng dụng start, nhiệm vụ sẽ chờ hết thời gian trễ trước khi thực thi lần đầu tiên.
// mili giây
@Scheduled(fixedDelay = 2 * 1000, initialDelay = 30 * 1000)
public void writeCurrentTime() {
// Làm gì đó ..
}
fixedDelay vs fixedRate
Bạn chỉ có thể sử dụng hoặc fixedDelay hoặc fixedRate trong @Schedule annotation, bạn không thể sử dụng đồng thời cả hai.
- fixedDelay là khoảng thời gian nghỉ sau khi nhiệm vụ trước đã hoàn thành, sau đó nó mới thực thi lại nhiệm vụ lần tiếp theo.
- fixedRate là khoảng thời gian giữa lần bắt đầu thực thi nhiệm vụ trước và lần bắt đầu thực thi nhiệm vụ tiếp theo, nó không phụ thuộc vào nhiệm vụ trước đã kết thúc hay chưa.
4. Biểu thức cron và zone
@Schedule cho phép bạn thiết lập các lịch trình phức tạp, chẳng hạn thực thi nhiệm vụ vào tất cả các ngày thứ hai lúc 12 giờ trưa. Để thiết lập các lịch trình phức tạp bạn cần sử dụng thuộc tính cron.
Biểu thức cron là đại diện của 6 trường:
second, minute, hour, day of month, month, day(s) of week
Ví dụ:
"0 0 * * * *" // Đầu giờ của tất cả các giờ của tất cả các ngày.
"*/10 * * * * *" // Mỗi 10 giây (số giây chia hết cho 10).
"0 0 8-10 * * *" // 8, 9 và 10 giờ các ngày
"0 0/30 8-10 * * *" // 8:00, 8:30, 9:00, 9:30 và 10 tất cả các ngày
"0 0 9-17 * * MON-FRI" // 9, .. 17 giờ các ngày thứ 2 tới thứ 6 (monday & friday)
"0 0 0 25 12 ?" // Tất cả các ngày giáng sinh, nửa đêm.
Trong đó:
Ký hiệu | Ý nghĩa |
* | Khớp với bất kỳ |
*/X | Tất cả các X (Chia hết cho X) |
? | ("không chỉ định giá trị") - nó hữu ích khi bạn cần chỉ định gì đó trong một trong 2 trường (field), trong đó một trường cho phép còn trường kia thì không. Chẳng hạn, nếu tôi muốn ngày thứ 10 trong tháng, nhưng không quan tâm đó là ngày thứ mấy trong tuần, tôi cần đặt "10" vào trường day-of-month, và đặt "?" vào trường day-of-week. |
"0 0 0 25 12 ?":
Ngày giáng sinh (Ngày 25 tháng 12) lúc 12 giờ đêm (0 giờ), không quan tâm ngày đó là ngày thứ mấy trong tuần.
Thuộc tính zone chỉ định múi giờ. Mặc định giá trị của zone là rỗng, nghĩa là lấy theo múi giờ của Server.
@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
// Làm gì đó ở đây.
}
Bảng dưới đây là danh sách các múi giờ (Time zones) được hỗ trợ bởi Oracle Real-Time Collaboration.
Pacific/Pago_Pago | (-11:00) Pago Pago |
Pacific/Honolulu | (-10:00) Hawaii |
America/Anchorage | (-09:00) Alaska |
America/Vancouver | (-08:00) Canada Pacific Time |
America/Los_Angeles | (-08:00) US Pacific Time |
America/Tijuana | (-08:00) Tijuana |
America/Edmonton | (-07:00) Canada Mountain Time |
America/Denver | (-07:00) US Mountain Time |
America/Phoenix | (-07:00) Arizona |
America/Mazatlan | (-07:00) Mazatlan |
America/Winnipeg | (-06:00) Canada Central Time |
America/Regina | (-06:00) Saskatchewan |
America/Chicago | (-06:00) US Central Time |
America/Mexico_City | (-06:00) Mexico City |
America/Guatemala | (-06:00) Guatemala |
America/El_Salvador | (-06:00) El Salvador |
America/Managua | (-06:00) Managua |
America/Costa_Rica | (-06:00) Costa Rica |
America/Montreal | (-05:00) Canada Eastern Time |
America/New_York | (-05:00) US Eastern Time |
America/Indianapolis | (-05:00) East Indiana |
America/Panama | (-05:00) Panama |
America/Bogota | (-05:00) Bogota |
America/Lima | (-05:00) Lima |
America/Halifax | (-04:00) Canada Atlantic Time |
America/Puerto_Rico | (-04:00) Puerto Rico |
America/Caracas | (-04:00) Caracas |
America/Santiago | (-04:00) Santiago |
America/St_Johns | (-03:30) Newfoundland |
America/Sao_Paulo | (-03:00) Sao Paulo |
Atlantic/Azores | (-01:00) Azores |
Etc./UTC | (00:00) Universal Time |
UTC | (00:00) Universal Time |
Atlantic/Reykjavik | (00:00) Reykjavik |
Europe/Dublin | (00:00) Dublin |
Europe/London | (00:00) London |
Europe/Lisbon | (00:00) Lisbon |
Africa/Casablanca | (00:00) Casablanca |
Africa/Nouakchott | (00:00) Nouakchott |
Europe/Oslo | (+01:00) Oslo |
Europe/Stockholm | (+01:00) Stockholm |
Europe/Copenhagen | (+01:00) Copenhagen |
Europe/Berlin | (+01:00) Berlin |
Europe/Amsterdam | (+01:00) Amsterdam |
Europe/Brussels | (+01:00) Brussels |
Europe/Luxembourg | (+01:00) Luxembourg |
Europe/Paris | (+01:00) Paris |
Europe/Zurich | (+01:00) Zurich |
Europe/Madrid | (+01:00) Madrid |
Europe/Rome | (+01:00) Rome |
Africa/Algiers | (+01:00) Algiers |
Africa/Tunis | (+01:00) Tunis |
Europe/Warsaw | (+01:00) Warsaw |
Europe/Prague | (+01:00) Prague Bratislava |
Europe/Vienna | (+01:00) Vienna |
Europe/Budapest | (+01:00) Budapest |
Europe/Sofia | (+02:00) Sofia |
Europe/Istanbul | (+02:00) Istanbul |
Europe/Athens | (+02:00) Athens |
Asia/Nicosia | (+02:00) Nicosia |
Asia/Beirut | (+02:00) Beirut |
Asia/Damascus | (+02:00) Damascus |
Asia/Jerusalem | (+02:00) Jerusalem |
Asia/Amman | (+02:00) Amman |
Africa/Tripoli | (+02:00) Tripoli |
Africa/Cairo | (+02:00) Cairo |
Africa/Johannesburg | (+02:00) Johannesburg |
Europe/Moscow | (+03:00) Moscow |
Asia/Baghdad | (+03:00) Baghdad |
Asia/Kuwait | (+03:00) Kuwait |
Asia/Riyadh | (+03:00) Riyadh |
Asia/Bahrain | (+03:00) Bahrain |
Asia/Qatar | (+03:00) Qatar |
Asia/Aden | (+03:00) Aden |
Africa/Khartoum | (+03:00) Khartoum |
Africa/Djibouti | (+03:00) Djibouti |
Africa/Mogadishu | (+03:00) Mogadishu |
Asia/Dubai | (+04:00) Dubai |
Asia/Muscat | (+04:00) Muscat |
Asia/Yekaterinburg | (+05:00) Yekaterinburg |
Asia/Tashkent | (+05:00) Tashkent |
Asia/Calcutta | (+05:30) India |
Asia/Novosibirsk | (+06:00) Novosibirsk |
Asia/Almaty | (+06:00) Almaty |
Asia/Dacca | (+06:00) Dacca |
Asia/Krasnoyarsk | (+07:00) Krasnoyarsk |
Asia/Bangkok | (+07:00) Bangkok |
Asia/Saigon | (+07:00) Vietnam |
Asia/Jakarta | (+07:00) Jakarta |
Asia/Irkutsk | (+08:00) Irkutsk |
Asia/Shanghai | (+08:00) Beijing, Shanghai |
Asia/Hong_Kong | (+08:00) Hong Kong |
Asia/Taipei | (+08:00) Taipei |
Asia/Kuala_Lumpur | (+08:00) Kuala Lumpur |
Asia/Singapore | (+08:00) Singapore |
Australia/Perth | (+08:00) Perth |
Asia/Yakutsk | (+09:00) Yakutsk |
Asia/Seoul | (+09:00) Seoul |
Asia/Tokyo | (+09:00) Tokyo |
Australia/Darwin | (+09:30) Darwin |
Australia/Adelaide | (+09:30) Adelaide |
Asia/Vladivostok | (+10:00) Vladivostok |
Australia/Brisbane | (+10:00) Brisbane |
Australia/Sydney | (+10:00) Sydney Canberra |
Australia/Hobart | (+10:00) Hobart |
Asia/Magadan | (+11:00) Magadan |
Asia/Kamchatka | (+12:00) Kamchatka |
Pacific/Auckland | (+12:00) Auckland |
Ví dụ dưới đây, nhiệm vụ được thực thi vào 1h 20 phút các ngày thứ 2, 3, 4, 5.
"0 20 1 * * MON-THU"
CronSchedule.java
package org.o7planning.sbschedule.schedule;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class CronSchedule {
@Scheduled(cron = "0 20 1 * * MON-THU")
public void doSomething() {
System.out.println("Do some thing");
}
}
Các hướng dẫn Spring MVC
- Hướng dẫn lập trình Spring cho người mới bắt đầu
- Cài đặt Spring Tool Suite cho Eclipse
- Hướng dẫn lập trình Spring MVC cho người mới bắt đầu - Hello Spring 4 MVC
- Cấu hình các nguồn dữ liệu tĩnh trong Spring MVC
- Hướng dẫn sử dụng Spring MVC Interceptor
- Tạo ứng dụng web đa ngôn ngữ với Spring MVC
- Hướng dẫn Upload File với Spring MVC
- Ứng dụng Java Web login đơn giản sử dụng Spring MVC, Spring Security và Spring JDBC
- Hướng dẫn sử dụng Spring MVC Security với Hibernate
- Hướng dẫn sử dụng Spring MVC Security và Spring JDBC (XML Config)
- Đăng nhập bằng mạng xã hội trong Spring MVC với Spring Social Security
- Hướng dẫn sử dụng Spring MVC và Velocity
- Hướng dẫn sử dụng Spring MVC với FreeMarker
- Sử dụng Template trong Spring MVC với Apache Tiles
- Hướng dẫn sử dụng Spring MVC và Spring JDBC Transaction
- Sử dụng nhiều DataSource trong Spring MVC
- Hướng dẫn sử dụng Spring MVC, Hibernate và Spring Transaction Manager
- Hướng dẫn sử dụng Spring MVC Form và Hibernate
- Chạy các nhiệm vụ nền theo lịch trình trong Spring
- Tạo một ứng dụng Java Web bán hàng sử dụng Spring MVC và Hibernate
- Ví dụ CRUD đơn giản với Spring MVC RESTful Web Service
- Triển khai ứng dụng Spring MVC trên Oracle WebLogic Server
Show More
Các hướng dẫn Spring Boot
- Cài đặt Spring Tool Suite cho Eclipse
- Hướng dẫn lập trình Spring cho người mới bắt đầu
- Hướng dẫn lập trình Spring Boot cho người mới bắt đầu
- Các thuộc tính thông dụng của Spring Boot
- Hướng dẫn sử dụng Spring Boot và Thymeleaf
- Hướng dẫn sử dụng Spring Boot và FreeMarker
- Hướng dẫn sử dụng Spring Boot và Groovy
- Hướng dẫn sử dụng Spring Boot và Mustache
- Hướng dẫn sử dụng Spring Boot và JSP
- Hướng dẫn sử dụng Spring Boot, Apache Tiles, JSP
- Sử dụng Logging trong Spring Boot
- Giám sát ứng dụng với Spring Boot Actuator
- Tạo ứng dụng web đa ngôn ngữ với Spring Boot
- Sử dụng nhiều ViewResolver trong Spring Boot
- Sử dụng Twitter Bootstrap trong Spring Boot
- Hướng dẫn và ví dụ Spring Boot Interceptor
- Hướng dẫn sử dụng Spring Boot, Spring JDBC và Spring Transaction
- Hướng dẫn và ví dụ Spring JDBC
- Hướng dẫn sử dụng Spring Boot, JPA và Spring Transaction
- Hướng dẫn sử dụng Spring Boot và Spring Data JPA
- Hướng dẫn sử dụng Spring Boot, Hibernate và Spring Transaction
- Tương tác Spring Boot, JPA và cơ sở dữ liệu H2
- Hướng dẫn sử dụng Spring Boot và MongoDB
- Sử dụng nhiều DataSource với Spring Boot và JPA
- Sử dụng nhiều DataSource với Spring Boot và RoutingDataSource
- Tạo ứng dụng Login với Spring Boot, Spring Security, Spring JDBC
- Tạo ứng dụng Login với Spring Boot, Spring Security, JPA
- Tạo ứng dụng đăng ký tài khoản với Spring Boot, Spring Form Validation
- Ví dụ OAuth2 Social Login trong Spring Boot
- Chạy các nhiệm vụ nền theo lịch trình trong Spring
- Ví dụ CRUD Restful Web Service với Spring Boot
- Ví dụ Spring Boot Restful Client với RestTemplate
- Ví dụ CRUD với Spring Boot, REST và AngularJS
- Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication
- Bảo mật Spring Boot RESTful Service sử dụng Auth0 JWT
- Ví dụ Upload file với Spring Boot
- Ví dụ Download file với Spring Boot
- Ví dụ Upload file với Spring Boot và jQuery Ajax
- Ví dụ Upload file với Spring Boot và AngularJS
- Tạo ứng dụng Web bán hàng với Spring Boot, Hibernate
- Hướng dẫn và ví dụ Spring Email
- Tạo ứng dụng Chat đơn giản với Spring Boot và Websocket
- Triển khai ứng dụng Spring Boot trên Tomcat Server
- Triển khai ứng dụng Spring Boot trên Oracle WebLogic Server
- Cài đặt chứng chỉ SSL miễn phí Let's Encrypt cho Spring Boot
- Cấu hình Spring Boot chuyển hướng HTTP sang HTTPS
- Tìm nạp dữ liệu với Spring Data JPA DTO Projections
Show More