[英]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/
對於那些不使用Quartz調度程序的人,而是直接使用TaskSchedular
:
CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *");
Date next = generator.next(prev);
您還可以從spring獲取觸發器bean並調用getFireTimeAfter
方法來完成。
我在這里找到了關於測試CronExpression
的很酷的文檔: http : CronExpression
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.