Domanda

Supponendo che ho un CronTriggerBean simile a

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

Qual è il modo migliore per testare che questo fagiolo attiva effettivamente alla sua data specificata, cioè. il giorno della settimana più vicino al 15 di ogni mese alle 06:00?


Aggiorna :. Questo dovrebbe essere un test di unità, quindi non ho intenzione di accendere una macchina virtuale o di modificare l'orario di sistema

È stato utile?

Soluzione

Bene in primo luogo, non c'è nessun punto nei test CronTriggerBean sé. E 'parte del quadro di primavera, ed è già stato testato.

Un test migliore potrebbe essere quella di verificare che la vostra espressione cron è quello che vi aspettate. Una possibilità è quella di utilizzare CronExpression classe di quarzo. Dato un oggetto getNextValidTimeAfter(Date), è possibile chiamare <=>, che restituisce la prossima volta dopo la data data quando l'espressione scatta mai.

Altri suggerimenti

Ho usato CronMaker solo per essere sicuri che se la mia espressione cron è ben formata, check it out: http://www.cronmaker.com/

  1. Si può sempre aspettare fino alla 15h di luglio.
  2. Essere più grave ... Se è davvero una parte fondamentale della domanda e che è necessario avere testato completamente. Ti consiglio di utilizzare un po 'di virtualizzazione impostazioni e avere l'applicazione installata all'interno di una macchina guest. Poi si potrebbe giocare con l'orologio di sistema e testare diversi data / volte senza spendere un mese intero su di esso. Inoltre non c'è niente che dovrebbe impedirvi di l'automazione tali prove.

Per coloro che non usano lo scheduler quarzo, ma invece utilizzare il TaskSchedular direttamente:

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

È anche possibile ottenere il fagiolo grilletto dalla primavera e invocare il metodo getFireTimeAfter alla fine.

Ho trovato una documentazione fresco qui circa testare la CronExpression: http://www.nurkiewicz.com/2012/10/testing -quartz-cron-expressions.html

L'implementazione C # sarà qualcosa di simile a questo:

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

Questa è una demo fresco. Ma alla fine, io alla fine utilizzare Schedule semplice.

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

Poiché questo viene eseguito immediatamente e poi ogni volta x.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top