测试石英CronTrigger触发
-
21-08-2019 - |
题
假设我具有类似于
一个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)
,其下一次当表达式将触发指定日期之后返回。
其他提示
我用CronMaker只以确保如果我的cron表达式是公形成,检查出来: http://www.cronmaker.com/
- 您总是可以等到7月的15小时。
- 会被更严重......如果它真的该应用程序的重要组成部分,我需要有它的全面测试。我会建议使用一些虚拟化设置,并有一些来宾机器内安装的应用程序。然后,你可以与系统时钟发挥并没有整整一个月在花费测试不同的日期/时间。而且没有什么应该从阻止你的自动化这样的测试。 醇>
对于那些谁不使用Quartz调度,而是直接使用TaskSchedular
:
CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *");
Date next = generator.next(prev);
您还可以得到从弹簧触发豆并调用getFireTimeAfter
方法来完成。
我发现了一个凉爽文档这里有关测试CronExpression
:
http://www.nurkiewicz.com/2012/10/testing石英-时钟守护expressions.html
在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();
由于这立即执行,然后每×时间。
不隶属于 StackOverflow