【问题标题】:Notification of when continuous Azure WebJob is stopping for NoAutomaticTrigger type jobs通知 NoAutomaticTrigger 类型作业的连续 Azure WebJob 何时停止
【发布时间】:2015-07-01 13:36:11
【问题描述】:

全部,

我正在将现有的辅助角色代码迁移到 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 的内部没有这样做,所以我自己复制它的“调用”代码,但使用配置等待。据我所知,取消令牌在 JobHost 中没有任何作用。

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

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

有没有我想念的明显方式? JobHost 似乎在处理超出其规范的情况方面真的很差:(

【问题讨论】:

    标签: c# azure azure-webjobssdk


    【解决方案1】:

    正如维克多所说,你可以使用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 循环之后,您还可以停止已启动的任务。

    【讨论】:

      【解决方案2】:

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

      这是意料之中的,因为您传递的是自己的取消令牌,没有被任何人取消。当shutdown notification is sent 或主机停止/处置时,webjobs 取消令牌被取消。如果您想从 webjob 函数外部获取对取消令牌的引用,则必须将其保存在静态变量或类似的变量中。

      如果您想使用自己的取消令牌,可以使用Microsoft.Azure.WebJobs.WebJobsShutdownWatcher 来获取关闭通知。

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

      对此没有开箱即用的解决方案,但您可以从正在运行的网络作业(如果有)调用清理功能。如果您需要在函数之外进行清理并且还需要日志记录,那么您只能控制台日志记录 - 写入控制台。日志将显示在 WebJobs 仪表板的 webJob 页面上。我很好奇,如果你需要在函数之外进行清理,那是什么场景?

      【讨论】:

      • 我的情况是,我使用自己的 Azure 服务总线适配器代码订阅队列/主题的作业开始(即我不能使用内置机制来执行此操作),然后我需要阻止等待消息出现,然后当 WebJob 停止时,我需要拦截它并调用我的取消订阅逻辑。我发现很难解决(a)如何获取 WebJob 在关机时使用的取消令牌(这不会在任何地方暴露)或(b)拦截关机,因为没有引发我可以挂钩的事件.
      • 您可以通过代码blog.amitapple.com/post/2014/05/webjobs-graceful-shutdown查看WebJobs何时停止/重新启动
      猜你喜欢
      • 2015-04-14
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多