【问题标题】:Why does my continuous azure webjob run the function twice?为什么我的连续 azure webjob 会两次运行该功能?
【发布时间】:2016-05-10 21:33:53
【问题描述】:

我创建了我的第一个连续运行的天蓝色网络作业;

我不太确定这是代码问题,但为了完整起见,这里是我的代码:

static void Main()
{
   var host = new JobHost();
   host.CallAsync(typeof(Functions).GetMethod("ProcessMethod"));
   host.RunAndBlock();
}

对于函数:

[NoAutomaticTrigger]
public static async Task ProcessMethod(TextWriter log)
{
   log.WriteLine(DateTime.UtcNow.ToShortTimeString() + ": Started");
   while (true)
   {
       Task.Run(() => RunAllAsync(log));
       await Task.Delay(TimeSpan.FromSeconds(60));
   }
   log.WriteLine(DateTime.UtcNow.ToShortTimeString() + "Shutting down..");
}

请注意,异步任务会触发它自己的任务。这是为了确保它们以相同的间隔非常准确地启动。工作本身就是下载一个 url,解析并在数据库中输入一些数据,但这与我遇到的多实例问题无关。

我的问题是,一旦它运行了大约 5 分钟,就会调用第二个 ProcessMethod,这使我有两个会话同时做同样的事情。第二种方法说它是“从仪表板开始”,即使我 100% 确信我没有点击任何东西来启动它。

有人经历过类似的事情吗?

【问题讨论】:

  • 接受的答案是您的问题吗?我看到了同样的情况,除了我的实例数设置为 1... 这是针对一个已经按预期工作了好几个月的网络作业。

标签: azure azure-webjobs azure-webjobssdk


【解决方案1】:

从 Azure 门户中 WebApp 的“缩放”选项卡将实例计数更改为 1。默认情况下,它设置为 2 个实例,这会导致它运行两次。

【讨论】:

    【解决方案2】:

    我无法解释为什么它会被调用两次,但我认为使用 CRON 计划 (https://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/#CreateScheduledCRON) 而不是连续 WebJob 触发作业会更好。

    此外,您似乎没有使用 WebJobs SDK,因此您可以完全跳过它。您的 WebJob 可以像直接完成工作的 Main 一样简单。没有 JobHost,没有异步,而且通常更容易正确。

    【讨论】:

    • 同意。以上不是您要使用的模式。这将导致仪表板中的单个函数调用具有不断增长的日志输出量,并且永远不会完成。相反,如果您不使用 WebJobs SDK 的任何其他功能,请按照 David 的建议进行操作,或者您可以使用 SDK TimerTrigger,它可以让您像这样运行重复性工作(示例 here)。
    • 很棒的输入。我确实计划比一分钟更频繁地运行这项工作,afaik 不包括 cron,尽管 TimerTrigger 可能是我正在寻找的更多。感谢您的意见。
    • cron 实际上可以达到每秒一次。但是,它确实有一个限制,如果作业花费的时间比调用之间的间隔长(例如,它每 20 秒运行一次,运行需要 30 秒),则可能会错过一些调用。
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多