2009-06-29 26 views
13

Giả sử rằng tôi có một CronTriggerBean tương tự nhưTesting Quartz CronTrigger kích hoạt

<bean id="midMonthCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="reminderJobDetail" /> 
    <property name="cronExpression" value="0 0 6 15W * ?" /> 
</bean> 

cách tốt nhất để kiểm tra là gì mà đậu này sẽ thực sự kích hoạt tại thời điểm nhất định của nó, tức vào các ngày trong tuần gần nhất với 15 mỗi tháng vào lúc 6 giờ sáng?


Cập nhật: Đây được coi là một thử nghiệm đơn vị, vì vậy tôi sẽ không để cháy lên một VM hoặc thay đổi thời gian hệ thống.

Trả lời

17

Trước tiên, không có điểm nào trong việc tự mình kiểm tra CronTriggerBean. Đó là một phần của khung công tác mùa xuân và đã được thử nghiệm.

Một thử nghiệm tốt hơn có thể là để kiểm tra rằng biểu thức cron của bạn là những gì bạn mong đợi. Một lựa chọn ở đây là sử dụng lớp CronExpression của Quartz. Với đối tượng CronExpression, bạn có thể gọi getNextValidTimeAfter(Date), trả về lần sau sau Ngày đã cho khi biểu thức sẽ kích hoạt.

+0

Chỉ cần làm rõ - Tôi không đề nghị bạn thay đổi mã của bạn để sử dụng CronExpression, nhưng thử nghiệm đơn vị của bạn nên sử dụng nó. – skaffman

+0

Thú vị, tôi sẽ xem xét nó. –

3
  1. Bạn luôn có thể đợi cho đến ngày 15 tháng 7.
  2. Nghiêm trọng hơn ... Nếu đó thực sự là một phần quan trọng của ứng dụng và tôi cần phải thử nghiệm đầy đủ. Tôi khuyên bạn nên sử dụng một số thiết lập ảo hóa và cài đặt ứng dụng trong một số máy khách. Sau đó, bạn có thể chơi với đồng hồ hệ thống và kiểm tra ngày/giờ khác nhau mà không cần chi tiêu cả tháng. Hơn nữa, không có gì có thể ngăn bạn khỏi việc tự động tự động hóa các thử nghiệm như vậy.
+0

Cảm ơn câu trả lời. Điều này được coi là một thử nghiệm đơn vị, vì vậy tôi sẽ không cháy một máy ảo hoặc thay đổi thời gian hệ thống. –

1

Bạn cũng có thể lấy hạt kích hoạt từ mùa xuân và gọi phương thức getFireTimeAfter để hoàn tất.

7

tôi đã sử dụng CronMaker chỉ để chắc chắn rằng nếu biểu hiện cron của tôi là cũng được hình thành, check it out: http://www.cronmaker.com/

2

Đối với những người không sử dụng scheduler thạch anh, nhưng thay vì sử dụng TaskSchedular trực tiếp:

CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *"); 
Date next = generator.next(prev); 
0

tôi tìm thấy một tài liệu mát mẻ ở đây về kiểm tra CronExpression: http://www.nurkiewicz.com/2012/10/testing-quartz-cron-expressions.html

C# thực hiện sẽ là một cái gì đó như này:

void Run() 
{ 
    //var collection = findTriggerTimesRecursive(new CronExpression("0 0 17 L-3W 6-9 ? *"), DateTime.UtcNow); 
    var collection = findTriggerTimesRecursive(new CronExpression("0 0/15 * 1/1 * ? *"), DateTime.UtcNow); 
    Console.WriteLine(DateTime.UtcNow); 
    foreach (var item in collection) 
    { 
     Console.WriteLine(item); 
    } 
} 

public List<DateTimeOffset> findTriggerTimesRecursive(CronExpression expr, DateTimeOffset from, int max = 10) 
{ 
    var times = new List<DateTimeOffset>(); 
    var next = expr.GetNextValidTimeAfter(from); 

    while (next != null && times.Count < max) 
    { 
     times.Add(next.Value); 
     from = next.Value; 
     next = expr.GetNextValidTimeAfter(from); 
    } 

    return times; 
} 

Đây là bản trình diễn tuyệt vời. Nhưng cuối cùng, tôi kết thúc bằng Simple Schedule.

var trigger = TriggerBuilder.Create() 
    .WithIdentity("trigger3", "group1") 
    .WithSimpleSchedule(
     x => 
     { 
      x.WithIntervalInMinutes(15); 
      x.RepeatForever(); 
     } 
    ) 
    .ForJob("myJob", "group1") 
    .Build(); 

Bởi vì điều này được thực hiện ngay lập tức và sau đó mỗi lần x.