c# - NoAutomaticTrigger 类型作业的连续 Azure WebJob 停止时的通知

标签 c# azure azure-webjobssdk

全部,

我正在将现有辅助角色代码迁移到 Azure Web 作业。我正在尝试使用 WebJob SDK (1.0),以便与 Azure 网站完全集成。

我的困难是 JobHost 不能很好地处理超出其通常的基于属性的调用选项(队列、Blob 等)的作业

我已经有了标准代码,无法更改该代码来监听 Azure 队列/主题等,因此我无法使用 WebJob 代码来执行此操作。

因此我需要使用WebJob Call方法:

var cancelTokenSource = new CancellationTokenSource();
var onStartMethod = typeof(Program).GetMethod("OnStart", BindingFlags.Static | BindingFlags.Public);

host.CallAsync(onStartMethod, cancelTokenSource.Token)
    .ConfigureAwait(false)
    .GetAwaiter()
    .GetResult();

注意:我正在使用自己的 CallAsync,因为所有建议都是在使用库时使用ConfigureAwait(false),但 JobHost 的内部结构不会这样做,所以我自己复制它的“调用”代码,但使用配置等待。据我所知,取消 token 在 JobHost 中没有执行任何操作。

我的问题是我需要调用 host.RunAndBlock();停止作业退出,这很好,但随后我需要运行一些清理处理。我无法使用 OnStop 方法对“CallAsync”进行新的调用,因为主机已被取消,所以我所能做的就是直接调用我的 OnStop 方法。不幸的是,我失去了通过提供的 TextWriter 类写入网站日志的能力。

我认为我需要的是 JobHost 在 RunAndBlock 中调用我的方法的方法,这样我就可以获取主机关闭时触发的取消 token ,然后执行我的清理代码......但是没有似乎没有办法做到这一点。

我有什么明显的遗漏吗? JobHost 似乎在处理正常情况之外的情况方面确实很差:(

最佳答案

正如维克多所说,你可以使用 Microsoft.Azure.WebJobs.WebJobsShutdownWatcher
这是 Amit 解决方案的实现:WebJobs Graceful Shutdown

所以我找到了一个解决方案:
Program.cs 中没有修改

class Program
{
    static void Main()
    {
        var host = new JobHost();
        host.Call(typeof(Startup).GetMethod("Start"));
        host.RunAndBlock();
    }
}

正常关闭在 Startup.cs 中:

public class Startup
{
    [NoAutomaticTrigger]
    public static void Start(TextWriter log)
    {
        var token = new Microsoft.Azure.WebJobs.WebJobsShutdownWatcher().Token;
        //Shut down gracefully
        while (!token.IsCancellationRequested)
        {
            // Do somethings
        }
    }
}

在 while 循环之后,您还可以停止已启动的任务。

关于c# - NoAutomaticTrigger 类型作业的连续 Azure WebJob 停止时的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27770547/

相关文章:

c# - 可配置的计时器触发器 - Azure Web 作业

Azure 连续 webjob (blob) 仅触发一次

c# - 为什么要将 List 转换为 Array

c# - 如何改变 XNA 中的色调?

c# - 任务执行去哪里了?

azure - azure adf web Activity Rest api中执行输出的长度超出限制(当前约为1M)

json - 每 15 秒将单个消息合并为 1 个输出

azure - Azure DevOps 中有没有办法按区域路径的第一个子层进行分组?

c# - LINQ to SQL 更新 (C#)

azure-webjobs - 更新(重新部署)现有的天蓝色webjob