Azure 触发的 Webjob - 检测 webjob 何时停止

Posted

技术标签:

【中文标题】Azure 触发的 Webjob - 检测 webjob 何时停止【英文标题】:Azure Triggered Webjob - Detecting when webjob stops 【发布时间】:2016-05-11 23:57:39 【问题描述】:

我正在开发一个使用TimerTrigger 的触发式网络作业。

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

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

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

创建一个使用WebJobsShutdownWatcher 类在网络作业停止之前触发操作的自定义触发器 (StopTrigger) 是否是个好主意?

【问题讨论】:

【参考方案1】:

好的答案就在问题中:

是的,我可以使用 WebJobsShutdownWatcher 类,因为它有一个 Register 函数,当取消令牌被取消时调用,换句话说,当 web 作业停止时。

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();

编辑(基于 Matthew 评论):

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

public static void QueueFunction(
        [QueueTrigger("QueueName")] string message,
        TextWriter log,
        CancellationToken cancellationToken)

    ...
    if(cancellationToken.IsCancellationRequested) return;
    ...

【讨论】:

如果您需要管理的资源在该范围内,您可以在主机级别使用WebJobsShutdownWatcher。请注意,您还可以将CancellationToken 参数添加到您的函数签名中(如this sample)。当主机自动关闭时,运行时将取消该令牌,从而允许您的函数接收通知。 @mathewc,“在主机级别”是什么意思?。 我的意思是在你的 Main() 中。如果您还想在当前正在执行的函数中得到通知,可以使用CancellationToken 参数技术。 非常好的例子,比其他的简单得多。 @mathewc 有什么方法可以在自动缩减期间使用 WebJobsShutdownWatcher 当我的一些实例停止但不是整个网络作业时【参考方案2】:

我最近试图弄清楚如何做到这一点没有 包含 WebJobShutdownWatcher 的 WebJobs SDK,这就是我 发现了。

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

最终效果是,如果您不使用包含上述 WebJobsShutdownWatcher 的 Azure WebJobs SDK,您仍然可以通过在小于配置的等待时间。

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

【讨论】:

以上是关于Azure 触发的 Webjob - 检测 webjob 何时停止的主要内容,如果未能解决你的问题,请参考以下文章

Azure webjob 似乎不尊重 MaxDequeueCount 属性

在 Azure WebJob 中动态启用/禁用触发功能

使用 WebJob 将 Web 应用程序发布到 Azure 时卡住

使 Azure Webjob 计时器触发器不作为单例运行

部署到 Azure Web App 后找不到 webjob?

将 WebJob 部署到 Azure 时出错?