Biểu thức cron mùa xuân cho mỗi ngày 1: 01: sáng


202

Tôi đang cố gắng để mã của mình thực thi theo một lịch trình cố định, dựa trên biểu thức cron Spring. Tôi muốn mã được thực thi mỗi ngày vào lúc 1: 01: sáng. Tôi đã thử biểu hiện sau đây, nhưng điều này không kích thích tôi. Có gì sai với cú pháp ở đây?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}



biểu thức cron của tôi 0 0 0 1 JAN MON đã hoạt động cho đến năm ngoái. Ngày 1 tháng 1 trở đi ngừng làm việc nói biểu thức cron không hợp lệ. Mặc dù điều này được dự định cho tần số rất ít nhưng chúng tôi có thể chạy máy chủ tc. sau jan 1 thì không. Khi tôi đổi thành 0 0 7? * CN nó bắt đầu làm việc. Tôi tò mò muốn biết lý do tại sao 0 0 0 1 JAN MON ngừng hoạt động vì nó vẫn tốt trong năm ngoái.
spandey

0 0 0 1 JAN MON có thể là biểu hiện sai, cũng vậy, nó cũng hoạt động và máy chủ tc không bao giờ phàn nàn
spandey

Câu trả lời:


573

Hãy thử với:

@Scheduled(cron = "0 1 1 * * ?")

Dưới đây bạn có thể tìm thấy các mẫu ví dụ từ diễn đàn mùa xuân:

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0 8,10 * * *" = 8 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

Biểu thức cron được biểu thị bằng sáu trường:

second, minute, hour, day of month, month, day(s) of week

(*) có nghĩa là phù hợp với bất kỳ

*/X có nghĩa là "mọi X"

?("không có giá trị cụ thể") - hữu ích khi bạn cần chỉ định một cái gì đó trong một trong hai trường trong đó ký tự được phép, nhưng không phải là trường khác. Ví dụ: nếu tôi muốn kích hoạt bắn vào một ngày cụ thể trong tháng (ví dụ: ngày 10), nhưng tôi không quan tâm ngày nào trong tuần xảy ra, tôi sẽ đặt "10" trong ngày- lĩnh vực của tháng và "?" trong lĩnh vực ngày trong tuần.

PS: Để làm cho nó hoạt động, hãy nhớ bật nó trong ngữ cảnh ứng dụng của bạn: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/schedcing.html#schedcing- chú thích-hỗ trợ


15
Định dạng này cũng được ghi lại vào mùa xuân tại đây - docs.spring.io/spring/docs/3.0.x/api/org/springframework/ Kẻ
chrismarx

1
Tôi đoán cron mùa xuân cũng có thể cung cấp giây cung cấp nhưng cron unix bình thường dựa trên phút ... vì trong trang unix man phút là đơn vị thời gian nhỏ nhất có thể được cấu hình.
nanosoft

8
tầm quan trọng của "?" tính cách? Có phải nó chỉ áp dụng cho trường "ngày (tuần) trong tuần" không? Nó sẽ hoạt động / làm điều gì đó khác đi nếu chúng ta thay thế '?' với '*' trong ví dụ Ngày Giáng sinh?
bắt giữ

1
@encrest hãy xem tại đây: stackoverflow.com/questions/11499740/ trên
gipinani


90

Đối với lịch trình của tôi, tôi đang sử dụng nó để bắn vào lúc 6 giờ sáng mỗi ngày và ký hiệu của tôi là:

0 0 6 * * *

Nếu bạn muốn 1: 01: am thì hãy đặt nó thành

0 1 1 * * *

Hoàn thành mã cho bộ lập lịch

@Scheduled(cron="0 1 1 * * *")
public void doScheduledWork() {
    //complete scheduled work
}

** RẤT QUAN TRỌNG

Để chắc chắn về tính chính xác về thời gian bắn của trình lập lịch biểu của bạn, bạn phải đặt giá trị vùng như thế này (Tôi đang ở Istanbul):

@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
    //complete scheduled work
}

Bạn có thể tìm thấy các giá trị múi giờ hoàn chỉnh từ đây .

Lưu ý: Phiên bản khung công tác Spring của tôi là: 4.0.7.RELEASE


1
Tôi không biết tại sao câu trả lời của bạn chỉ có 12 thậm chí đó là câu trả lời đúng duy nhất ở đây!

2
Cảm ơn bạn rất nhiều @MoayadAbuJaber. Điểm số không quan trọng, nếu các nhà phát triển có thể khắc phục vấn đề của họ bằng câu trả lời của tôi thì đủ rồi, chúc mừng.
Bahadir Tasdemir

Tôi có thể sử dụng vùng với sheduler xml config <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>??
chia sẻ

3
giơ ngón tay cái để đề cập đến múi giờ
Forhad

2
Cảm ơn, @Forhad. Nếu bạn là nhà phát triển và xử lý bất kỳ vấn đề nào liên quan đến ngày và thời gian, bạn phải biết chi tiết về dấu thời gian, múi giờ và chuyển đổi. Nếu không, dữ liệu của bạn sẽ vô nghĩa
Bahadir Tasdemir

22

Bạn có thể sử dụng chú thích phương pháp của bạn với @Scheduled(cron ="0 1 1 * * ?").

0 - là trong vài giây

1- 1 phút

1 - giờ trong ngày.


12

Một cái gì đó thiếu từ câu trả lời của gipinani

@Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")

Điều này sẽ thực hiện tại 1.01 và 13.01. Nó có thể được sử dụng khi bạn cần chạy công việc mà không có mẫu nhiều lần trong ngày.

Và thuộc tính vùng rất hữu ích khi bạn triển khai trong các máy chủ từ xa. Điều này đã được giới thiệu với mùa xuân 4.


2
Lưu ý rằng sự hỗ trợ của các chữ viết tắt (cho múi giờ) chỉ dành cho khả năng tương thích JDK 1.1.x và nên sử dụng tên đầy đủ - theo javadoc
slashron

6

Một điều tôi đã nhận thấy là: mùa xuân CronTrigger không phải là cron. Bạn có thể kết thúc với 7 tham số trong biểu thức cron hợp lệ (bạn có thể xác thực trên cronmaker.com) và sau đó mùa xuân không chấp nhận nó. Hầu hết các trường hợp bạn chỉ cần xóa tham số cuối cùng và mọi thứ hoạt động tốt.


1
"CronTrigger không phải là thạch anh"
Sandy Simonton

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.