gatilho testes Quartz CronTrigger
-
21-08-2019 - |
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
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/
- Você sempre pode esperar até a 15h de Julho.
- 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.