全部,
我正在将现有的 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 类写入网站日志的能力。
我认为我需要一种让 JobHost 在 RunAndBlock 中调用我的方法的方法,这样我就可以拿起主机关闭时触发的取消令牌,然后执行我的清理代码....但似乎没有任何方式来做到这一点。
我有什么明显的失踪方式吗?JobHost 似乎在处理超出其规范的情况方面真的很差:(