Pergunta

Supondo que eu tenho um CronTriggerBean semelhante ao

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

O que é a melhor maneira de teste que este feijão vai realmente gatilho em sua data especificada, i. sobre o dia da semana mais próximo do dia 15 de cada mês às 06:00?


Atualizar :. Isto é suposto ser um teste de unidade, então eu não vou acender uma VM ou alterar a hora do sistema

Foi útil?

Solução

Bem em primeiro lugar, não há nenhum ponto em testar em si CronTriggerBean. É parte do quadro primavera, e já foi testado.

Um teste melhor poderia ser a de teste que a sua expressão cron é o que você espera. Uma opção aqui é usar classe CronExpression de quartzo. Dado um objeto CronExpression, você pode chamar getNextValidTimeAfter(Date), que retorna na próxima vez após a data indicada quando a expressão dispara.

Outras dicas

Eu costumava CronMaker só para ter certeza se a minha expressão cron está bem formado, confira: http://www.cronmaker.com/

  1. Você sempre pode esperar até a 15h de Julho.
  2. Sendo mais sério ... Se é realmente uma parte fundamental da aplicação e você precisa tê-lo testado completamente. Eu recomendaria o uso de alguns virtualização configurações e ter o aplicativo instalado dentro de uma máquina de convidado. Então você pode jogar com o relógio do sistema e testar diferentes datas / horas sem gastar um mês inteiro nele. Além disso não há nada que deve parar de automatização esses testes.

Para aqueles que não usam o programador Quartz, mas sim usar o TaskSchedular diretamente:

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

Você também pode obter o feijão gatilho da primavera e invocar o método getFireTimeAfter ao fim.

Eu encontrei uma documentação legal aqui sobre como testar o CronExpression: http://www.nurkiewicz.com/2012/10/testing -quartz-cron-expressions.html

A C # implementação será algo como isto:

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 é uma demonstração legal. Mas, no final, acabo usando Simples.

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

Uma vez que este é executado imediatamente e depois a cada x tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top