簡體   English   中英

測試Quartz CronTrigger觸發器

[英]Testing Quartz CronTrigger trigger

假設我有一個類似的CronTriggerBean

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

測試這個bean實際上會在指定日期觸發的最佳方法是什么, 在每個月的15號最接近的工作日上午6點?


更新 :這應該是一個單元測試,所以我不會啟動VM或更改系統時間。

首先,測試CronTriggerBean本身沒有意義。 它是彈簧框架的一部分,並且已經過測試。

更好的測試可能是測試您的cron表達式是否符合預期。 這里的一個選擇是使用Quartz的CronExpression類。 給定一個CronExpression對象,您可以調用getNextValidTimeAfter(Date) ,它將在表達式觸發的給定Date之后返回下一次。

我只使用CronMaker來確定我的cron表達是否形成良好,請查看: http ://www.cronmaker.com/

  1. 您可以一直等到7月15日。
  2. 更嚴肅......如果它真的是應用程序的關鍵部分,我需要完全測試它。 我建議使用一些虛擬化設置,並在某些客戶機中安裝應用程序。 然后你就可以玩系統時鍾並測試不同的日期/時間,而不花一整個月的時間。 此外,沒有任何東西可以阻止你自動化這些測試。

對於那些不使用Quartz調度程序的人,而是直接使用TaskSchedular

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

您還可以從spring獲取觸發器bean並調用getFireTimeAfter方法來完成。

我在這里找到了關於測試CronExpression的很酷的文檔: httpCronExpression

C#實現將是這樣的:

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;
}

這是一個很酷的演示。 但最后,我結束使用簡單計划。

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

因為這是立即執行然后每x次執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM