当计划的WebJob运行很长时间时会发生什么

时间:2015-04-09 15:26:30

标签: azure azure-web-sites azure-webjobs

如果计划运行Azure WebJob但先前运行的实例尚未完成,会发生什么?它会再次运行WebJob,以便两个一次运行吗?它不会运行WebJob并开始计时吗?我无法在任何地方找到这种行为。我有一份工作,我想每小时运行,但有时可能需要一个多小时才能完成,但我从不希望其中两个一次运行。

2 个答案:

答案 0 :(得分:7)

据我了解,计划的webjobs只是触发使用Azure Scheduler运行的webjobs,如果您在管理门户中打开Azure Scheduler,您可以看到webjobs甚至更详细地配置它们。 (您也可以看到日志,它可以为您提供问题的简单答案)。

如果你想看看你的预定webjob上的内容是否由Kudu作为Triggered webjob运行,如果你查看Kudu源代码,你会看到在作业启动时创建了一个lockfile,如果你试图开始另一个job a ConflictException is thrown if there is already a lock file

Azure计划程序使用catches the ConflictException and gives you the "Error_WebJobAlreadyRunning" warning调用您的作业调用您的作业,它将告诉您:"由于作业已在运行,因此无法启动新的运行。"

答案 1 :(得分:-1)

我发现阻止WebJob执行的最好方法是使用预定的WebJob对要使用内置队列完成的工作进行排队,然后创建一个连续运行的单独WebJob,每当出现新的队列消息时执行该WebJob设置BatchSize = 1.这有效地防止了任何作业同时执行。

以下是WebJob中的一些示例代码,用于对消息进行排队。

class Program
{
  static void Main()
  {
    var host = new JobHost();
    host.Call(typeof(Functions).GetMethod("QueueSomething"));
  }
}
public class Functions
{
  [NoAutomaticTrigger]
  public static void QueueSomething([Queue("myqueue")] ICollector<string> message, TextWriter log)
  {
    //do some work here to create a message to pass to the other WebJob so it can execute your task
    string x = "serialize some data or instructions to pass";
    
    //if I want to pass it a couple of things to do use ICollector above and add this to the queue too
    string x2 = "some additional task to do";
    

  //Add the json to the WebJobs queue
  message.Add(x);
  message.Add(x2);
}

以下是连续运行的WebJob中的代码。这会监视“myqueue”,然后在出现新消息时调用DoSomething()。关键是BatchSize属性阻止此WebJob读取和处理另一条消息,直到第一条消息完成为止。

class Program
{
    static void Main()
    {
        JobHostConfiguration config = new JobHostConfiguration();

        //Read and process one message at a time
        config.Queues.BatchSize = 1;
        var host = new JobHost(config);
        host.RunAndBlock();
    }
}

public class Functions
{
    public static void DoSomething([QueueTrigger("myqueue")] string message, TextWriter log)
    {
     //Read and deserialize your message and then do some work with it
     string d = JsonConvert.DeserializeObject(message);
    }
}

希望有所帮助。