2011-05-19 59 views
6

我不知道是否有辦法在SQL Azure中使用計劃任務? 感謝您的幫助。使用Sql Azure的計劃任務?

問題是,我想每天運行一條簡單的單行語句,並希望阻止設置一個輔助角色。

+0

我會去http://www.mygreatwindowsazureidea.com/投票支持此功能! – ryancrawcour 2012-03-21 23:41:59

回答

6

今天沒有SQL Azure與SQL Azure等效。你必須從後臺任務中調用你的單行語句。但是,如果您已經擁有Web角色,則無需創建工作人員角色即可輕鬆派生線程來處理Web角色中的此事。我寫了關於here這個概念的博客。要生成一個線程,可以在OnStart()事件處理程序(Role實例尚未添加到負載均衡器中)或Run()方法中執行此操作(其中Role實例已添加到負載平衡器)。通常在OnStart()中進行設置是個好主意。

一個可能不明顯的警告,無論您是在其自己的工作者角色還是在現有Web角色的後臺線程中執行此調用:如果將角色擴展爲兩個實例,則需要確保每日通話只發生在其中一個實例(否則,最終可能會出現重複,或者執行多次可能成本高昂的操作)。有幾種技術可以用來避免這種情況,例如表格行鎖或Azure存儲區塊租約。對於前者,您可以使用該行來存儲上次執行操作的時間戳。如果你獲得鎖定,你可以檢查操作是否發生在一個設定的時間窗口內(可能是一個小時?)以決定是否有其他實例已經執行了它。如果您未能獲取該鎖,則可以假定另一個實例具有該鎖並正在執行該命令。還有其他技術 - 這只是一個想法。

+0

這聽起來很有趣。 – BitKFu 2011-05-19 12:44:41

+0

嗯。但我只有一個WCF服務角色。 WCF服務角色是否也會過載? – BitKFu 2011-05-19 12:46:34

+1

術語'角色'與'虛擬機模板'同義。所有Windows Azure角色等同於Windows Server 2008 SP2或Windows Server 2008 R2。而且,就像Web角色和工作者角色一樣,WCF Web角色具有OnStart()和Run()。你可以在其中任何一箇中運行你的後臺任務。 – 2011-05-19 12:53:56

3

除了大衛的回答,如果你有很多的計劃任務做,那麼它可能是值得考慮的:

(你可以大衛提到的線程中使用quartz.net,但lokad.cloud需要一個稍微大一點的架構變化)

+0

+1預先構建的調度框架。 Lokad選項是用於構建Windows Azure應用程序的更大解決方案的一部分,如果您只需要安排,則quartz.net解決方案似乎更適合。 – 2011-05-19 17:18:51

2

我希望談論你自己的公司是可以接受的。我們有一個基於網絡的服務,可以讓您做到這一點。您可以點擊此鏈接查看schedule execution of SQL Azure queries的更多詳情。

+1

我試過這個解決方案,太棒了! – ryancrawcour 2012-03-21 23:44:42

2

克服了執行同一任務的多個角色的問題,您可以檢查角色實例ID並確保只有第一個實例執行任務。

using Microsoft.WindowsAzure.ServiceRuntime; 

     String g = RoleEnvironment.CurrentRoleInstance.Id; 
     if (!g.EndsWith("0")) 
     { 
      return; 
     }