2011-05-19 98 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; 
     }