所有,

我正在将现有的工作人员角色代码迁移到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循环之后,您还可以停止已启动的任务。

10-06 10:31