使用Quartz.NET安排Cron作业

Kas*_*sem 2 c# jobs quartz-scheduler quartz.net quartz.net-2.0

我正在尝试使用Quartz.NET安排一些工作,但我无法让它工作.我尝试了以下代码,但在达到指定时间时没有任何反应.

    public void Test()
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        IScheduler scheduler = schedulerFactory.GetScheduler();

        IJobDetail jobDetail = JobBuilder.Create<SatellitePaymentGenerationJob>()
            .WithIdentity("TestJob")
            .Build();
        ITrigger trigger = TriggerBuilder.Create()
            .ForJob(jobDetail)
            .WithCronSchedule("0 26 18 * * ?")
            .WithIdentity("TestTrigger")
            .StartNow()
            .Build();
        scheduler.ScheduleJob(jobDetail, trigger);
        scheduler.Start();
    }
Run Code Online (Sandbox Code Playgroud)

更新:

我也试过以下只是为了确保它不是导致问题的Cron表达式.对我来说也不起作用......

IJobDetail jobDetail = JobBuilder.Create<SatellitePaymentGenerationJob>()
                .WithIdentity("TestJob", "TestGroup")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()  
                .ForJob(jobDetail)
                .WithSimpleSchedule(x=> x.RepeatForever().WithIntervalInSeconds(10).WithMisfireHandlingInstructionFireNow())
                .StartAt(new DateTimeOffset(DateTime.UtcNow.AddSeconds(10)))
                .WithIdentity("TestTrigger", "TestGroup")
                .Build();
            scheduler.ScheduleJob(jobDetail, trigger);
            scheduler.Start();
            Console.WriteLine(DateTime.UtcNow.ToLongTimeString());
            Console.WriteLine(trigger.GetNextFireTimeUtc());
Run Code Online (Sandbox Code Playgroud)

请注意,trigger.GetNextFireTimeUtc()返回有效的时间值,但永远不会触发作业.

我哪里做错了?

Ste*_*lan 7

您的示例代码一切正常,也许SatellitePaymentGenerationJob实现中的Execute方法错误,或者作业已执行但未在预期时间内执行.在目前的形状,它将在每天18:26被解雇,这是你想要的吗?

与我的代码(工作)比较:

class Program
{
    static void Main(string[] args)
    {
        Test();
    }

    public static void Test()
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        IScheduler scheduler = schedulerFactory.GetScheduler();

        IJobDetail jobDetail = JobBuilder.Create<SatellitePaymentGenerationJob>()
            .WithIdentity("TestJob")
            .Build();
        ITrigger trigger = TriggerBuilder.Create()
            .ForJob(jobDetail)
            .WithCronSchedule("0 45 20 * * ?")
            .WithIdentity("TestTrigger")
            .StartNow()
            .Build();
        scheduler.ScheduleJob(jobDetail, trigger);
        scheduler.Start();
    }
}

internal class SatellitePaymentGenerationJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Console.WriteLine("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好的,我终于搞定了.显然,问题在于实现`IJob`接口的作业,因为它没有默认的构造函数.我猜我需要内联初始化依赖项(而不是通过构造函数参数来完成).谢谢您的帮助 :) (4认同)