Azure 触发的 Web 作业 - 检测 Web 作业何时停止

Azure Triggered Webjob - Detecting when webjob stops

我正在开发一个使用 TimerTrigger.

的触发式网络作业

在 webjob 停止之前,我需要处理一些对象,但我不知道如何触发 "webjob stop"。

有一个 NoAutomaticTrigger 函数,我知道我可以使用 WebJobsShutdownWatcher class 来处理 webjob 何时停止但是触发作业我需要一些帮助...

我看过 Extensible Triggers and Binders with Azure WebJobs SDK 1.1.0-alpha1

创建一个使用 WebJobsShutdownWatcher class 在 webjob 停止之前触发操作的自定义触发器 (StopTrigger) 是个好主意吗?

好的答案在问题中:

是的,我可以使用 WebJobsShutdownWatcher class,因为它有一个 Register 函数,该函数在取消标记被取消时调用,换句话说,当网络作业停止时。

static void Main()
{
    var cancellationToken = new WebJobsShutdownWatcher().Token;
    cancellationToken.Register(() =>
    {
        Console.Out.WriteLine("Do whatever you want before the webjob is stopped...");
    });

    var host = new JobHost();
    // The following code ensures that the WebJob will be running continuously
    host.RunAndBlock();
}

编辑(基于马修评论):

如果您使用触发函数,您可以将 CancellationToken 参数添加到您的函数签名中。当主机自动关闭时,运行时将取消该令牌,从而允许您的函数接收通知。

public static void QueueFunction(
        [QueueTrigger("QueueName")] string message,
        TextWriter log,
        CancellationToken cancellationToken)
{
    ...
    if(cancellationToken.IsCancellationRequested) return;
    ...
}

I was recently trying to figure out how to do this without the WebJobs SDK which contains the WebJobShutdownWatcher, this is what I found out.

底层运行时所做的(以及上面引用的 WebJobsShutdownWatcher 检查的内容)是在环境变量 %WEBJOBS_SHUTDOWN_FILE% 指定的位置创建一个本地文件。如果这个文件存在,它本质上是运行时向 webjob 发出的信号,它必须在可配置的等待时间内关闭(连续作业默认为 5 秒,触发作业默认为 30 秒),否则运行时将终止作业。

最终效果是,如果您没有使用包含上述 WebJobsShutdownWatcher 的 Azure WebJobs SDK,您仍然可以通过监视关闭文件来实现 Azure Web 作业的正常关闭间隔比配置的等待时间短。

此处介绍了其他详细信息,包括如何配置等待时间:https://github.com/projectkudu/kudu/wiki/WebJobs#graceful-shutdown