异步时,Azure WebJob不会正常失败

Gad*_*t27 3 azure-webjobs azure-webjobssdk

我开始使用WebJobs来处理一些后台任务,我遇到了有关错误处理和重试的问题.看来,如果我的任何函数都是异步的,那么即使我在函数中抛出异常,该函数也总是在仪表板中报告成功.

请考虑以下简单示例 - >

    public static void AlwaysFail([QueueTrigger("alwaysfail")] string message)
    {
        throw new Exception("Induced Error");
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码表现得像我期望的那样.消息从队列中弹出,抛出异常,在WebJobs仪表板中报告失败,消息被重新排队.这发生了5次,然后消息存储在毒性队列中.

但是,如果我尝试类似的功能,但使其像下面的那样异步 - >

    public async static void AlwaysFail([QueueTrigger("alwaysfail")] string message)
    {
        throw new Exception("Induced Error");
    }
Run Code Online (Sandbox Code Playgroud)

结果不如预期.消息从队列中弹出,抛出异常,但仪表板报告成功,不重试任何内容.此外,在这些情况下,似乎虽然仪表板报告成功,但异常是使用一个超出此世界退出代码的进程崩溃,等待60秒,然后重新启动,如下面的日志所示 - >

[11/11/2014 06:13:35> 0dc4f9:INFO]执行:'Functions.AlwaysFail'因为'alwaysfail'上检测到新队列消息.[11/11/2014 06:13:36> 0dc4f9:错误] [11/11/2014 06:13:36> 0dc4f9:错误]未处理的异常:System.InvalidOperationException:诱导错误[11/11/2014 06:13 :36> 0dc4f9:ERR]在Plmtc.BackgroundWorker.Functions.d__2.MoveNext()[11/11/2014 06:13:36> 0dc4f9:ERR] ---从前一个位置抛出异常的堆栈跟踪结束 - 系统中的System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__5(对象状态)[11/11/2014 06:13:36> 0dc4f9:ERR]中的[11/11/2014 06:13:36> 0dc4f9:ERR] .Threading.QueueUserWorkItemCallback.WaitCallback_Context(对象状态):在System.Threading.ExecutionContext.RunInternal [2014年11月11日六时13分36秒> 0dc4f9 ERR](的ExecutionContext的ExecutionContext,ContextCallback回调,对象的状态,布尔preserveSyncCtx)[11/System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)[11/1114 06:13在System.Threading.Q ueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()[2014年11月11日6点13分36秒> 0dc4f9:ERR]在System.Threading.ThreadPoolWorkQueue.Dispatch()[2014年11月11日6点13分36秒> 0dc4f9 :ERR]在System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()[11/11/2014 06:13:36> 0dc4f9:SYS ERR]作业因退出代码失败-532462766 [11/11/2014 06:13:36> 0dc4f9:SYS INFO]过程落下去,等待60秒[2014年11月11日6时13分36秒> 0dc4f9:SYS INFO]状态改变为PendingRestart

唯一的方法是我可以让仪表板中的async函数失败,编写一个将POCO类作为参数但只在消息中包含一个简单字符串的函数.在这些情况下,在到达任何函数代码之前,在消息/参数绑定期间发生故障.

有没有成功使用异步函数来响应队列触发器而没有这些问题的人?

Ant*_*Chu 10

因为该方法是async void,WebJobs SDK无法等待方法完成.改变它以返回Task......

public async static Task AlwaysFail([QueueTrigger("alwaysfail")] string message)
{
    throw new Exception("Induced Error");
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此帖子.