Frage

Unter der Annahme, dass ich eine CronTriggerBean ähnlich wie

haben
<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

War es hilfreich?

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/

  1. Sie können jederzeit bis zum 15h Juli warten.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top