Pregunta

Suponiendo que tengo una CronTriggerBean similar a

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

¿Cuál es la mejor manera de probar que este frijol en realidad desencadenar en su fecha especificada, es decir. en el día de la semana más cercano al 15 de cada mes a las 6 am?


Actualizar . Esto se supone que es una prueba de la unidad, así que no voy a encender una máquina virtual o cambiar la hora del sistema

¿Fue útil?

Solución

Bueno en primer lugar, no hay ningún punto en la prueba CronTriggerBean sí. Es parte del marco de primavera, y ya ha sido probado.

Una prueba podría ser mejor para probar que su expresión cron es lo que espera. Una opción es usar CronExpression clase de cuarzo. Dado un objeto getNextValidTimeAfter(Date), puede llamar <=>, que devuelve la próxima vez después de la fecha dada cuando la expresión se disparará.

Otros consejos

He utilizado CronMaker sólo para estar seguro de si mi expresión cron está bien formado, echa un vistazo: http://www.cronmaker.com/

  1. Siempre se puede esperar hasta la 15h de julio.
  2. Al ser más serio ... Si realmente es una parte clave de la aplicación y que es necesario tener que probó plenamente. Yo recomendaría el uso de algunos virtualización configuraciones y tienen la aplicación instalada dentro de algún equipo invitado. Posteriormente, se podría jugar con el reloj del sistema y probar diferentes tiempos fecha / sin gastar un mes entero en él. Por otra parte no hay nada de que debe usted dejar de automatización este tipo de pruebas.

Para aquellos que no utilizan el programador de cuarzo, pero en lugar de utilizar el TaskSchedular directamente:

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

También puede obtener el grano de disparo desde la primavera e invocar el método getFireTimeAfter para terminar.

He encontrado una documentación fresco aquí sobre cómo probar la CronExpression: http://www.nurkiewicz.com/2012/10/testing -cuarzo-cron-expressions.html

El C # aplicación será algo como esto:

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

Esta es una demostración fresca. Pero al final, termino usando Simples.

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

Debido a que este se ejecuta inmediatamente y luego cada x tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top