全部,
我正在将现有辅助角色代码迁移到 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/