Повторите задание Кварц только для определенного количества

Мне нужно запустить работу в определенное время в определенные дни недели. эти рабочие дни также являются динамическими и должны быть получены из базы данных. Также задание должно запускаться или повторяться для определенного количества. допустим, задание j должно срабатывать на каждый понедельник, ср, пт для счетчика повторений 15, т. е. для 3 * 5 = 15, поэтому оно должно срабатывать в течение следующих 3 недель.

я попытался использовать выражение кроны, как показано ниже, но не смог найти способ остановить запуск задания после определенного подсчета.

   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();

Пожалуйста, предложите мне что-нибудь, чтобы я смог достичь того, что мне нужно.

2 ответа

Расписание cron не имеет концепции запуска только определенное количество раз. Может быть, вам повезет больше с другими методами планирования.

EndAt может быть более полезным и выглядит как доступный независимо от планировщика.

Вы можете создать простой триггер для каждого дня с помощью ISimpleTrigger. Вам не нужно использовать какой-либо триггер хрон для этой работы. Прежде всего, вы должны получить соответствующую дату.

   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

Другие вопросы по тегам