Testing Quartz CronTrigger Trigger
-
21-08-2019 - |
Frage
Unter der Annahme, dass ich eine CronTriggerBean
ähnlich wie
<bean id="midMonthCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reminderJobDetail" />
<property name="cronExpression" value="0 0 6 15W * ?" />
</bean>
Was ist der beste Weg, um zu testen, dass diese Bohne wird an seinem angegebenen Datum tatsächlich auslösen, d. auf dem Wochentag am nächsten zum 15. eines jeden Monats um 06.00 Uhr?
Aktualisieren . Dies soll ein Unit-Test sein, so dass ich nicht eine VM gehen zu feuern oder die Systemzeit ändern
Lösung
Nun erstens, gibt es keinen Punkt in der Prüfung CronTriggerBean
selbst. Es ist ein Teil des Federrahmen und bereits getestet.
Ein besserer Test könnte sein, zu testen, ob Ihr Cron-Ausdruck ist das, was Sie erwarten. Eine Möglichkeit ist hier Quartz der CronExpression
Klasse. Bei einem CronExpression
Objekt können Sie rufen getNextValidTimeAfter(Date)
, die das nächste Mal nach dem angegebenen Datum zurückgibt, wenn der Ausdruck anspringt.
Andere Tipps
Ich habe CronMaker nur sicher zu sein, wenn mein Cron-Ausdruck gut gebildet, check it out: http://www.cronmaker.com/
- Sie können jederzeit bis zum 15h Juli warten.
- Das ernstere ... Wenn es wirklich ein wichtiger Teil der Anwendung ist und ich brauche Sie es vollständig getestet haben. Ich würde empfehlen, eine Virtualisierung mit Setups und haben die Anwendung innerhalb eines bestimmten Gastcomputer installiert. Dann könnten Sie mit dem Systemtakt spielen und anderes Datum / Zeit testen, ohne auf sie einen ganzen Monat zu verbringen. Darüber hinaus gibt es nichts, das von Ihnen aufhören sollte Automatisierung solche Tests.
Für diejenigen, die den Quartz Scheduler nicht verwenden, sondern stattdessen den TaskSchedular
direkt verwenden:
CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *");
Date next = generator.next(prev);
Sie können auch die Trigger-Bohne aus Feder erhalten und die getFireTimeAfter
Methode aufrufen zu beenden.
fand ich eine kühle Dokumentation hier über die CronExpression
Prüfung:
http://www.nurkiewicz.com/2012/10/testing -Quarz-cron-expressions.html
Die C # -Implementierung wird so etwas wie dies:
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;
}
Dies ist eine coole Demo. Aber am Ende, ich am Ende mit Einfach vereinbaren.
var trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSimpleSchedule(
x =>
{
x.WithIntervalInMinutes(15);
x.RepeatForever();
}
)
.ForJob("myJob", "group1")
.Build();
Da dies sofort ausgeführt und dann jeder x Zeit.