Запускать запланированное задание sitecore каждый день в одно и то же время - PullRequest
4 голосов
/ 23 июня 2011

Мне нужно запускать запланированное задание sitecore в точное время каждый день. В настоящее время задача запланирована следующим образом:

Schedule: 20100201T235900|20200201T235900|127|23:59:59
Last run: 2011 06 22 01:32:25

Задача занимает около 5 минут, поэтому 'Последний запуск' постепенно проскальзывает и запускается позже и позже.

Моя основная идея заключается в создании запланированной задачи Windows, которая вызывает веб-сервис и сбрасывает время Последний запуск для рассматриваемой задачи.

Есть ли другой способ? Мне не хватает какого-либо свойства конфигурации, которое могло бы достичь этого гораздо проще?

Ответы [ 3 ]

5 голосов
/ 27 июня 2011

Я разработал собственное решение для этого.

Прежде всего, измените вашу задачу так, чтобы она запускалась каждые 1 минуту или около того. Это должно бежать довольно часто. Вместо того, чтобы заставлять задачу запускаться один раз, вы заставляете ее выполнять свою функциональность в удобное для вас время, а затем ждете до следующего дня, прежде чем снова выполнять эту функцию:

В этом примере я заставляю свою задачу запускаться один раз с 03:00 до 04:00:

public void Execute(Item[] itemArray, CommandItem commandItem, ScheduleItem scheduleItem)
{
  if (!IsDue(scheduleItem))
    return;

  // DO MY STUFF!!
}

/// <summary>
/// Determines whether the specified schedule item is due to run.
/// </summary>
/// <remarks>
/// The scheduled item will only run between defined hours (usually at night) to ensure that the
/// email sending will not interfere with daily operations, and to ensure that the task is only run
/// once a day. 
/// Make sure you configure the task to run at least double so often than the time span between 
/// SendNotifyMailsAfter and SendNotifyMailsBefore
/// </remarks>
/// <param name="scheduleItem">The schedule item.</param>
/// <returns>
///     <c>true</c> if the specified schedule item is due; otherwise, <c>false</c>.
/// </returns>
private bool IsDue(ScheduleItem scheduleItem)
{
  DateTime timeBegin;
  DateTime timeEnd;

  DateTime.TryParse("03:00:00", out timeBegin);
  DateTime.TryParse("04:00:00", out timeEnd);



  return (CheckTime(DateTime.Now, timeBegin, timeEnd) && !CheckTime(scheduleItem.LastRun, timeBegin, timeEnd));
}

private bool CheckTime(DateTime time, DateTime after, DateTime before)
{
  return ((time >= after) && (time <= before));
}

Проверьте статью для более подробной информации: http://briancaos.wordpress.com/2011/06/28/run-sitecore-scheduled-task-at-the-same-time-every-day/

2 голосов
/ 23 июня 2011

Попробуйте включить асинхронное выполнение, что должно привести к немедленному обновлению времени «Последний запуск», даже если задача еще выполняется. Кроме того, в качестве последнего аргумента вы можете использовать «1,00: 00: 00» вместо «23:59:59», чтобы он выполнялся каждый 1 день.

РЕДАКТИРОВАТЬ: Другой возможностью является частота работы агента базы данных. Как часто это работает? Если он запускается каждые 10 минут (по умолчанию), то проверка не обязательно будет выполняться в ту минуту, когда вы этого хотите. Только когда он проснется. Попробуйте изменить интервал до 1 минуты или даже меньше.

  <!-- Agent to process schedules embedded as items in a database -->
  <agent type="Sitecore.Tasks.DatabaseAgent" method="Run" interval="00:10:00">
    <param desc="database">master</param>
    <param desc="schedule root">/sitecore/system/tasks/schedules</param>
    <LogActivity>true</LogActivity>
  </agent>
0 голосов
/ 23 июня 2011

Довольно сложно заставить что-то работать в одно и то же время каждый день.В большинстве случаев это происходит потому, что Sitecore думает о времени с точки зрения тиков, а не времени суток.Так что время между повторными циклами приложений - это тики.

Мы проделали то же самое раньше, реализовав запланированную задачу Windows.Наша задача вызывает wget (версия для Windows), и wget делает запрос на специальной странице нашего сайта.У нас есть ограничения по IP на этой странице, поэтому только сервер может получить доступ к ней через запрос через wget.У нас никогда не было проблем с этим, и если нам когда-нибудь понадобится вручную запустить код, мы либо перейдем на страницу с сервера, либо просто войдем на сервер и запустим запланированное задание в это время.

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