문제

내가 가지고 있다고 가정합니다 CronTriggerBean 비슷하다

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

이 콩이 실제로 지정된 날짜에 트리거 될 것을 테스트하는 가장 좋은 방법은 무엇입니까? 평일 오전 6시에 가장 가까운 곳에서?


업데이트: 이것은 단위 테스트로 여겨지므로 VM을 발사하거나 시스템 시간을 변경하지 않을 것입니다.

도움이 되었습니까?

해결책

먼저, 테스트에는 아무런 의미가 없습니다 CronTriggerBean 그 자체. 그것은 스프링 프레임 워크의 일부이며 이미 테스트되었습니다.

더 나은 테스트는 Cron 표현이 당신이 기대하는 것임을 테스트하는 것입니다. 여기서 한 가지 옵션은 쿼츠를 사용하는 것입니다 CronExpression 수업. 주어진 a CronExpression 객체, 당신은 호출 할 수 있습니다 getNextValidTimeAfter(Date), 표현이 발사 될 주어진 날짜 이후 다음에 반환됩니다.

다른 팁

Cronmaker를 사용하여 Cron 표현이 잘 형성되었는지 확인하고 확인하십시오.http://www.cronmaker.com/

  1. 항상 7 월 15 시간까지 기다릴 수 있습니다.
  2. 더 진지하다 ... 그것이 실제로 응용 프로그램의 핵심 부분이라면 그것을 완전히 테스트해야한다면. 나는 일부를 사용하는 것이 좋습니다 가상화 일부 게스트 머신 내에 애플리케이션을 설치하고 응용 프로그램을 설치하십시오. 그런 다음 시스템 시계를 사용하여 한 달 내내 보내지 않고 다른 날짜/시간을 테스트 할 수 있습니다. 또한 당신을 막아야 할 것은 없습니다 자동화 그런 테스트.

석영 스케줄러를 사용하지 않고 대신 사용하는 사람들을 위해 TaskSchedular 곧장:

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

또한 스프링에서 트리거 콩을 가져 와서 getFireTimeAfter 완료 방법.

테스트에 대한 멋진 문서를 찾았습니다 CronExpression: http://www.nurkiewicz.com/2012/10/testing-quartz-cron-expressions.html

C# 구현은 다음과 같습니다.

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

이것은 멋진 데모입니다. 그러나 결국, 나는 간단한 일정을 사용하여 끝납니다.

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

이것은 x 시간마다 즉시 실행되기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top