所有,
我正在将现有的工作人员角色代码迁移到Azure Web作业。我试图使用WebJob SDK(1.0),以便与Azure网站完全集成。
我很难做到的是,JobHost不能很好地处理通常基于属性的调用选项(队列,Blob等)之外的作业。
我已经有了无法更改以收听Azure队列/主题等的标准代码,因此无法使用WebJob代码执行此操作。
因此,我需要使用WebJob调用方法:
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似乎在处理超出正常水平的场景时真的很差:(
最佳答案
正如胜利者所说,您可以使用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循环之后,您还可以停止已启动的任务。