2011-09-02 27 views
5

Tôi đang cố gắng gọi thứ gì đó cứ 3 tháng một lần (hàng quý) trong Quartz.NET (sử dụng cả phiên bản ổn định và mới nhất 2 là bản beta có cùng kết quả).Quartz.Net - Cứ 3 tháng

Tôi tạo trình kích hoạt cron với 0 30 8 3 */3 ? * được gọi 3 tháng một lần vào lúc 8.30 sáng vào ngày thứ ba của tháng xảy ra.

Vì vậy, về mặt kỹ thuật kể từ ngày 2 tháng 9 hôm nay, tôi hy vọng nó sẽ kích hoạt vào ngày mai. Tuy nhiên, thời gian chạy tiếp theo cho thấy là tháng tới. Tại sao vậy?

Cập nhật: Theo câu trả lời tôi nhận được tôi tạo ra phương pháp sau đây - có thể có ích cho ai đó:

public static string CalculateMonthsWithInterval(int startMonth, int interval) 
     { 
      var months = new List<string>(); 
      var monthNames = new [] {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; 

      var monthSelector = startMonth % interval; 

      for (var i = 0; i < 12; i++) 
      { 
       if (i % interval == monthSelector) 
       { 
        months.Add(monthNames[i]); 
       } 
      } 

      return string.Join(",", months.ToArray()); 
     } 

Ps: Tôi không sử dụng chỉ số hàng tháng trời vì một số lý do nó không hoạt động tốt với thạch anh của tôi (v2 BETA). Ngoài ra nó dễ dàng hơn để đọc ở cấp DB.

Ví dụ cuộc gọi - Định kỳ 3 tháng dựa trên NgàyBắtđầu:

var cronMonths = CronUtils.CalculateMonthsWithInterval((startDate.Month - 1), 3); 

Trả lời

8

Vâng, tôi nghĩ đó là vì lịch trình sẽ xác minh mà tháng có thể được chia cho 3, vì tất cả tháng trong thạch anh được dựa 0 (theo: http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06), tháng sẽ được lên lịch sẽ là tháng 1, tháng 4, tháng 7 và tháng 10.

0 mod 3 = 0 -> JAN 
1 mod 3 = 1 -> FEB 
... 
8 mod 3 = 2 -> SEP 
9 mod 3 = 0 -> OCT 

Các thạch anh lên lịch sẽ phân tích biểu hiện cron của bạn và giữ chỉ những nơi mô đun của họ 3 bằng 0.

Nếu bạn muốn nó được 1 tháng trước đó (Ba, Sáu, Chín và tháng Mười) bạn sẽ phải đặt nó là:

0 30 8 3 MAR,JUN,SEP,DEC ? *

+0

làm thế nào bạn sẽ làm cho nó kích hoạt mỗi 3 tháng sau đó? – Luke

+1

Vâng, như tôi đã nói trong câu trả lời của tôi: 0 30 8 3 MAR, JUN, SEP, DEC? * –

+1

Điều này sẽ diễn ra 3 tháng một lần, bắt đầu từ 2011-09-03 08:30:00 –

5

Một trang tốt để tạo ra biểu thức cron: http://www.cronmaker.com/

định dạng Cron:

0 0 12 1 1/3 ? * 

Thực thi mỗi:

1. Saturday, April 1, 2017 12:00 PM 
2. Saturday, July 1, 2017 12:00 PM 
3. Sunday, October 1, 2017 12:00 PM 
4. Monday, January 1, 2018 12:00 PM 
5. Sunday, April 1, 2018 12:00 PM 
+1

điều gì sẽ xảy ra nếu chúng tôi cung cấp ngày 31. Sẽ bỏ qua nếu ngày không tồn tại? –

Các vấn đề liên quan