首页 > 解决方案 > 仅针对特定计数重复 Quartz 作业

问题描述

我需要在特定工作日的特定时间触发工作。这些工作日也是动态的,应该从 db 中获取。此外,作业应该触发或重复特定计数。假设作业 j 应该在每个星期一、星期三、星期五触发,重复计数 15 即 3 * 5 = 15,因此它应该在接下来的 3 周内触发。

我尝试使用下面的 cronexpression,但找不到如何在特定计数后阻止作业触发。

   StringBuilder cronString = new StringBuilder("0 0 12 ? * ");
            if (plandata.Sunday == true)
                cronString.Append("SUN,");
            if (plandata.Monday == true)
                cronString.Append("MON,");
            if (plandata.Tuesday == true)
                cronString.Append("TUE,");
            if (plandata.Wednesday == true)
                cronString.Append("WED,");
            if (plandata.Thursday == true)
                cronString.Append("THU");
            if (plandata.Friday == true)
                cronString.Append("FRI,");
            if (plandata.Saturday == true)
                cronString.Append("SAT,");
            cronString.Append(" *");

            IJobDetail job = JobBuilder.Create<Demo>()
                .Build();
            ITrigger trigger = TriggerBuilder.Create()
                   //.StartAt((DateTime)plandata.StartDate)
                   .StartNow()
                   .WithPriority(1)
                   .WithCronSchedule(cronString.ToString())
                   .Build();

请给我一些建议,以便我可以实现我所需要的。

标签: .netquartz-schedulerquartz.netquart

解决方案


您可以使用 ISimpleTrigger 为每一天创建简单触发器。您不需要为此工作使用任何 cron 触发器。首先,你应该得到一个匹配的日期。

   DateTime today = DateTime.Today;
   // The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
   int daysUntilMonday = ((int)DayOfWeek.Monday - (int)today.DayOfWeek + 7) % 7;
   DateTime nextMonday = today.AddDays(daysUntilMonday);

或者

    DateTime today = DateTime.Today;
   // The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
   int daysUntilWednesday = ((int)DayOfWeek.Wednesday - (int)today.DayOfWeek + 7) % 7;
   DateTime nextWednesday = today.AddDays(daysUntilWednesday);

然后你可以像这样创建一个触发器。

   ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
      .WithIdentity("DEFAULT")
      .StartAt(nextMonday)   // or .StartAt(nextWednesday)
      .WithSimpleSchedule(x => x
           .WithIntervalInHours(168) // 1 week = 168h
           .WithRepeatCount(3))   // Repeat on 3 weeks
           .Build();

这个简单的触发器将在完成重复后自动删除。

有关更多详细信息 - https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/simpletriggers.html


推荐阅读