Testing Quartz CronTrigger trigger

前端 未结 6 1850
北荒
北荒 2020-12-30 06:04

Assuming that I have a CronTriggerBean similar to



        
相关标签:
6条回答
  • 2020-12-30 06:10

    Well firstly, there's no point in testing CronTriggerBean itself. It's part of the spring framework, and has already been tested.

    A better test might be to test that your cron expression is what you expect. One option here is to use Quartz's CronExpression class. Given a CronExpression object, you can call getNextValidTimeAfter(Date), which returns the next time after the given Date when the expression will fire.

    0 讨论(0)
  • 2020-12-30 06:21

    I used CronMaker only to be sure if my cron expression is well formed, check it out: http://www.cronmaker.com/

    0 讨论(0)
  • 2020-12-30 06:24

    I found a cool documentation here about testing the CronExpression: http://www.nurkiewicz.com/2012/10/testing-quartz-cron-expressions.html

    The C# implementation will be something like this:

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

    This is a cool demo. But at the end, I end using Simple Schedule.

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

    Because this is executed immediately and then every x time.

    0 讨论(0)
  • 2020-12-30 06:25

    You also can get the trigger bean from spring and invoke the getFireTimeAfter method to finish.

    0 讨论(0)
  • 2020-12-30 06:30
    1. You can always wait until the 15h of July.
    2. Being more serious... If it's really a key part of the application and I you need to have it tested fully. I would recommend using some virtualization setups and have the application installed within some guest machine. Then you could play with the system clock and test different date/times without spending a whole month on it. Moreover there's nothing that should stop you from automating such tests.
    0 讨论(0)
  • 2020-12-30 06:31

    For those who don't use the Quartz scheduler, but instead use the TaskSchedular directly:

    CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *");
    Date next = generator.next(prev);
    
    0 讨论(0)
提交回复
热议问题