2011-06-23 84 views
4

我需要在每天的確切時間運行sitecore計劃任務。 目前任務計劃通過以下方式:每天在同一時間運行sitecore計劃任務

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

任務大約需要5分鐘來執行這樣「最後運行」逐漸滑落,並越來越晚運行。

我的主要想法是創建一個窗口計劃任務,調用Web服務,並重置上次運行時間爲有問題的任務。

還有別的辦法嗎?我是否缺少一些可以實現這一點更容易的配置屬性?

回答

0

這很難讓事情每天都在同一時間運行。大多數情況下,這是因爲Sitecore根據蜱而不是時間來考慮時間。因此,應用程序回收之間的時間是滴答聲。

我們之前通過實施Windows計劃任務完成了同樣的任務。我們的任務調用wget(Windows版本),wget向我們網站上的特殊頁面發出請求。我們在該頁面上有IP限制,所以只有服務器可以通過wget通過請求來打它。我們從來沒有遇到任何問題,如果我們需要手動運行代碼,那麼我們要麼從服務器上點擊頁面,要麼登錄到服務器,並在那時運行計劃任務。

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> 
+0

全部設置爲異步執行和他們仍然向前爬。不幸的是,這個問題似乎並沒有很好的解決方案。 – Bryan

+0

應該能夠保持滑動到最低限度,請參閱上面的編輯一個更多的想法。 – techphoria414

+0

我剛剛檢查並將DB Agent設置爲每10分鐘運行一次,但我猜即使將其降至1分鐘之類。日程安排可能每天都在進行。 – marto

5

我已經爲此開發了我自己的解決方案。

首先,將您的任務修改爲每隔1分鐘左右運行一次。它必須頻繁運行。 而不是強制任務運行一次的,你讓你的任務執行它在你喜歡的時間功能,然後等待,直到第二天再次執行功能之前:

在這個例子中,我強迫我的任務運行一次

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

檢查文章的詳細信息::上午03時00和凌晨04:00之間 我的計劃任務http://briancaos.wordpress.com/2011/06/28/run-sitecore-scheduled-task-at-the-same-time-every-day/

+0

爲什麼不能在03:00:00和04:00:00之間每分鐘運行一次任務? –

+0

@KristianNissen'IsDue'方法的return語句中的第二個'CheckTime'調用查看'scheduleItem。LastRun'的日期,所以如果任務已經在時間窗口內執行過一次,它將不會再次運行。 – dthrasher

+0

使用Sitecore 8.1,每次運行命令時都會更新上次運行,即使您的邏輯未執行也是如此。這可以通過映射到像「上次執行」這樣的新字段來解決。 –