我需要在每天的确切时间运行sitecore计划任务。 目前,任务按以下方式安排:
Schedule: 20100201T235900|20200201T235900|127|23:59:59
Last run: 2011 06 22 01:32:25
该任务大约需要5分钟才能执行,因此'上次运行'会逐渐滑落,稍后再运行。
我的主要想法是创建一个调用Web服务的Windows计划任务,并重置相关任务的上次运行时间。
还有其他方法吗?我错过了一些可以更容易实现这一目标的配置属性吗?
答案 0 :(得分:5)
我为此开发了自己的解决方案。
首先,将您的任务修改为每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/
答案 1 :(得分:2)
尝试启用异步执行,即使任务仍在运行,也应立即更新“上次运行”时间。另外,对于你的最后一个参数,你可以使用“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>
答案 2 :(得分:0)
很难让每天在同一时间运行某些东西。大部分时间都是因为Sitecore根据刻度而不是时间来考虑时间。因此,应用程序回收之间的时间就是滴答声。
我们之前通过实施Windows计划任务完成了同样的事情。我们的任务调用wget(Windows版本),wget向我们网站上的特殊页面发出请求。我们对该页面有IP限制,因此只有服务器可以通过wget通过请求来访问它。我们从未遇到任何问题,如果我们需要手动运行代码,我们要么从服务器点击页面,要么只登录服务器并在那时运行计划任务。