每天在同一时间运行sitecore计划任务

每天在同一时间运行sitecore计划任务,sitecore,sitecore6,Sitecore,Sitecore6,我需要在每天的准确时间运行sitecore计划任务。 目前,任务的计划方式如下: Schedule: 20100201T235900|20200201T235900|127|23:59:59 Last run: 2011 06 22 01:32:25 执行该任务大约需要5分钟,因此“最后一次运行”会逐渐滑动,运行时间会越来越晚 我的主要想法是创建一个windows计划任务,该任务调用Web服务,并重置相关任务的上次运行时间 还有别的办法吗?我是否缺少一些可以轻松实现这一点的配置属性?尝试启用异

我需要在每天的准确时间运行sitecore计划任务。 目前,任务的计划方式如下:

Schedule: 20100201T235900|20200201T235900|127|23:59:59
Last run: 2011 06 22 01:32:25
执行该任务大约需要5分钟,因此“最后一次运行”会逐渐滑动,运行时间会越来越晚

我的主要想法是创建一个windows计划任务,该任务调用Web服务,并重置相关任务的上次运行时间


还有别的办法吗?我是否缺少一些可以轻松实现这一点的配置属性?

尝试启用异步执行,这将导致“上次运行”时间立即更新,即使任务仍在运行。另外,对于您的最后一个参数,您可以使用“1.00:00:00”而不是“23:59:59”使其每1天执行一次

编辑:另一种可能性是DatabaseAgent的频率。它多久运行一次?如果它仅每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>

主人
/sitecore/系统/任务/时间表
真的

让某些东西每天在同一时间运行是相当困难的。大多数情况下,这是因为Sitecore以滴答声来考虑时间,而不是一天中的时间。因此,应用程序回收之间的时间间隔就是滴答声


我们以前也做过同样的事情,实现了一个Windows计划任务。我们的任务调用(Windows版本)和wget向我们站点上的特殊页面发出请求。我们对该页面有IP限制,因此只有服务器可以通过wget请求访问该页面。我们从来没有遇到过任何问题,如果我们需要手动运行代码,我们可以从服务器上点击页面,或者直接登录到服务器,然后运行计划的任务。

我已经为此开发了自己的解决方案

首先,将任务修改为每1分钟左右运行一次。它必须经常运行。 与其强制任务运行一次,不如让任务在您喜欢的时间执行其功能,然后等到第二天再执行该功能:

在本例中,我强制我的任务在凌晨3:00到凌晨4: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));
}
public void Execute(Item[]itemArray,CommandItem CommandItem,ScheduleItem ScheduleItem)
{
如果(!IsDue(scheduleItem))
返回;
//做我的事!!
}
/// 
///确定指定的计划项目是否应运行。
/// 
/// 
///计划项目将仅在定义的小时(通常在夜间)之间运行,以确保
///电子邮件发送不会干扰日常操作,并确保任务只运行
///一天一次。
///请确保将任务配置为运行频率至少为两次之间的时间跨度的两倍
///SendNotifyMailsAfter和SendNotifyMailsBefore
/// 
///附表项目。
/// 
///如果指定的计划项目到期,则为true;否则,错误。
/// 
专用布尔IsDue(ScheduleItem ScheduleItem)
{
日期时间开始;
日期时间结束;
DateTime.TryParse(“03:00:00”,超时开始);
DateTime.TryParse(“04:00:00”,超时结束);
return(CheckTime(DateTime.Now,timeBegin,timeEnd)&&!CheckTime(scheduleItem.LastRun,timeBegin,timeEnd));
}
private bool CheckTime(日期时间、日期时间之后、日期时间之前)
{

返回((时间>=之后)和(当我所有的计划任务都设置为异步执行时,它们仍然会向前爬行。不幸的是,似乎没有一个很好的解决方案来解决这个问题。应该能够将下滑降至最低,请参阅上面的编辑了解更多想法。我刚刚检查了,DB代理设置为每10分钟运行一次,但我猜即使我将其降低到大约1分钟。日程安排可能每天都会下滑。为什么不在03:00:00到04:00:00之间每分钟运行一次任务?@KristianNissen方法返回语句中的第二个
CheckTime
调用查看
scheduleItem.LastRun
日期,因此如果任务已经执行过一次在时间窗口中,它不会再次运行。使用Sitecore 8.1,每次运行命令时都会更新上次运行,即使您的逻辑没有执行。这可以通过映射到新字段(如“Last Executed”)来解决。