Azure WebJobs:如何强制函数按时 运行
Azure WebJobs: how to force a function to run on schedule
我有一个连续的网络作业,其中包含一个函数,其 TimerTrigger 配置为每分钟 运行:
public static async Task TestFunction([TimerTrigger("0 * * * * *")] TimerInfo info)
{
Console.WriteLine($"{DateTime.UtcNow:s}: beginning to process the function...");
// Imitate a long processing
await Task.Delay(75 * 1000);
Console.WriteLine($"{DateTime.UtcNow:s}: finished processing the function");
}
假设第一次调用是在 00:00:00。
然后,由于函数 运行 超过一分钟,下一次调用已过期并在 00:01:15 触发。下一个在 00:02:30 等等
我希望该函数能够按计划准确调用,即使它会导致两个函数 运行 并行调用。
Multiple instances section 在 WebJobs SDK 文档中指出:
"The timer trigger automatically ensures that only one instance of the
timer runs, so you don't get more than one function instance running
at a given scheduled time"
有什么办法可以改变这种行为吗?
或者我应该使用其他东西来实现所需的行为吗? (计划的 WebJob、Azure Function 或其他一些服务?)
我已经通过引入队列并将函数拆分为两个:生产者和消费者解决了这个问题。
第一个函数按计划触发,只是将消息放入队列:
public static async Task TestProducer([TimerTrigger("0 * * * * *")] TimerInfo info)
{
var startTime = DateTime.UtcNow;
var message = new BrokeredMessage(startTime);
var queueClient = QueueClient.CreateFromConnectionString("ServiceBusConnString", "queue-name");
await queueClient.SendAsync(message);
}
第二个函数执行实际工作:
public static async Task TestConsumer([ServiceBusTrigger("queue-name")] DateTime startTime)
{
Console.WriteLine($"{DateTime.UtcNow:s}: beginning to process the function for startTime={startTime}");
// Imitate a long processing that depends on a startTime
await Task.Delay(75 * 1000);
Console.WriteLine($"{DateTime.UtcNow:s}: finished processing the function for startTime={startTime}");
}
当第一个函数将新消息加入队列而第二个函数仍在工作时,将调用第二个函数的新实例。
我有一个连续的网络作业,其中包含一个函数,其 TimerTrigger 配置为每分钟 运行:
public static async Task TestFunction([TimerTrigger("0 * * * * *")] TimerInfo info)
{
Console.WriteLine($"{DateTime.UtcNow:s}: beginning to process the function...");
// Imitate a long processing
await Task.Delay(75 * 1000);
Console.WriteLine($"{DateTime.UtcNow:s}: finished processing the function");
}
假设第一次调用是在 00:00:00。 然后,由于函数 运行 超过一分钟,下一次调用已过期并在 00:01:15 触发。下一个在 00:02:30 等等
我希望该函数能够按计划准确调用,即使它会导致两个函数 运行 并行调用。
Multiple instances section 在 WebJobs SDK 文档中指出:
"The timer trigger automatically ensures that only one instance of the timer runs, so you don't get more than one function instance running at a given scheduled time"
有什么办法可以改变这种行为吗?
或者我应该使用其他东西来实现所需的行为吗? (计划的 WebJob、Azure Function 或其他一些服务?)
我已经通过引入队列并将函数拆分为两个:生产者和消费者解决了这个问题。
第一个函数按计划触发,只是将消息放入队列:
public static async Task TestProducer([TimerTrigger("0 * * * * *")] TimerInfo info)
{
var startTime = DateTime.UtcNow;
var message = new BrokeredMessage(startTime);
var queueClient = QueueClient.CreateFromConnectionString("ServiceBusConnString", "queue-name");
await queueClient.SendAsync(message);
}
第二个函数执行实际工作:
public static async Task TestConsumer([ServiceBusTrigger("queue-name")] DateTime startTime)
{
Console.WriteLine($"{DateTime.UtcNow:s}: beginning to process the function for startTime={startTime}");
// Imitate a long processing that depends on a startTime
await Task.Delay(75 * 1000);
Console.WriteLine($"{DateTime.UtcNow:s}: finished processing the function for startTime={startTime}");
}
当第一个函数将新消息加入队列而第二个函数仍在工作时,将调用第二个函数的新实例。