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