【问题标题】:How to Schedule a task in windows azure worker role如何在 Windows azure worker 角色中安排任务
【发布时间】:2012-06-05 12:34:44
【问题描述】:

我有一个简单的 Azure Worker 角色正在运行,它每天下午 12 点执行一项任务。以下是完成此操作的代码。

public override void Run()
{
    try
    {
        while (true)
        {
              int time = Convert.ToInt32(DateTime.Now.TimeOfDay);
              if (time == 12)
              {
                   DoSomethingElse();
              }
        }

    }
    catch (Exception ex)
    {
        Log.Add(ex, true);
    }            
}

这里DoSomethingElse()是一种在每天中午12点发送电子邮件的方法,并且每天只触发一次。

我怎样才能实现一个调度程序,在时间是 12 点时触发并执行DoSomethingElse()

我的问题是:这(上面的代码)是最好的方法还是使用任何第 3 方工具。

【问题讨论】:

  • 附带说明,您上面的代码将导致紧密循环,使 CPU 始终以 100% 的速度运行,并可能导致 Azure 重新启动您的辅助角色。您至少需要在其中放置一个睡眠声明。或者使用计时器等待。但是,无论如何,由于多实例,您需要寻找其他调度的答案,例如 Makogon 所说的。

标签: c# azure


【解决方案1】:

这里还有其他几个问题可以解决这个问题(我已经在上面标记了一个)。话虽如此,并且冒着重复其他答案已经陈述的风险:

在您的情况下,Windows Azure 队列上的一条简单消息(延迟到中午才显示)会起作用。这也有助于处理多实例场景:如果您正在运行角色的两个实例,您不希望同一个计划任务运行两次,因此您需要一种方法让其中一个实例执行此代码。这可以通过队列消息轻松处理,或者您可以通过使用诸如 blob 租约(可能只有一个写锁)作为互斥锁在单个实例上运行调度程序代码。这在@smarx 的博文here 中有介绍。

【讨论】:

  • 但我怀疑如果我通过队列消息实现它,同样的问题仍然存在,因为多个实例将同时创建多个队列消息..?
  • 没错,这是一个启动问题。考虑通过 blob 锁的互斥锁。 @smarx 在他的博文 here 中介绍了这一点。
  • Azure 现在有一个简单的调度程序服务,它根据高度可配置的调度调用端点。问题是它不适用于长时间运行的进程。超时时间为 30 秒,不可配置。
  • "这很容易通过队列消息处理" 但是如何确保每天只添加一条队列消息?
【解决方案2】:

您也可以使用 Quartz.Net http://quartznet.sourceforge.net/ 使用上面提到的 blob 租约是确保只有一个实例在托管任务的好方法。

Using Quartz.Net to Schedule Jobs in Windows Azure Worker Roles

【讨论】:

    【解决方案3】:

    Cloud Scheduler 专门处理云中的任务调度。

    我只是遇到了这个,所以我没有尝试过。

    http://getcloudscheduler.com/

    更新:忘记云调度程序!我连续运行了 600 次每日日程安排,最终向我的客户发送了 600 封电子邮件。不要用!!!

    【讨论】:

      【解决方案4】:

      使用Azure Task Scheduler。 Scott Gu here 的精彩教程。

      具体来说,我会查看 Storage Queue 操作类型 - 只需在您的 Worker Role 中注册队列事件。

      (请注意,如果您想比每小时更频繁地安排任务,此服务可能会花钱。)

      【讨论】:

      • 我同意。这是最简单的方法。只需使用 webhook 来触发事件。 Azure 任务计划程序的成本高得离谱。
      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2014-12-29
      相关资源
      最近更新 更多