连续Azure WebJob何时停止NoAutomaticTrigger类型作业的通知

所有,

我正在将现有的Worker Role代码迁移到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的内部工作没有这样做,所以我自己复制了它的“调用”代码但是使用了ConfigureAwait。 据我所知,取消令牌在JobHost中没有做任何事情。

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

我认为我需要的是JobHost在RunAndBlock中调用我的方法的一种方式,所以我可以拿起主机关闭时触发的取消令牌,然后执行我的清理代码….但似乎没有任何方式来做到这一点。

我有一种明显的方法吗? JobHost在处理场景之外似乎非常差,这是常态:(

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

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

这是预料之中的,因为您传递的是您自己的取消令牌,并未被任何人取消。 发送关闭通知或停止/处置主机时,将取消webjobs取消令牌。 如果要从webjob函数外部获取对取消令牌的引用,则必须将其保存在静态变量或类似内容中。

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

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

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