【问题标题】:Azure WebJob doesn't fail properly when async异步时 Azure WebJob 不会正确失败
【发布时间】:2014-11-11 06:27:23
【问题描述】:

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

考虑以下简单示例 ->

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

上面的代码的行为符合我的预期。消息从队列中弹出,抛出异常,WebJobs 仪表板中报告失败,消息被重新排队。这种情况发生了 5 次,然后该消息被存储在毒物队列中。

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

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

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

[11/11/2014 06:13:35 > 0dc4f9: INFO] 正在执行:“Functions.AlwaysFail”,因为在“alwaysfail”上检测到新队列消息。 [2014 年 11 月 11 日 06:13:36 > 0dc4f9:错误] [11/11/2014 06:13:36 > 0dc4f9:ERR] 未处理异常:System.InvalidOperationException:引发错误 [11/11/2014 06:13:36 > 0dc4f9: ERR ] 在 Plmtc.BackgroundWorker.Functions.d__2.MoveNext() [2014 年 11 月 11 日 06:13:36 > 0dc4f9: ERR ] --- 从先前抛出异常的位置结束堆栈跟踪--- [11/11/2014 06:13:36 > 0dc4f9: ERR ] 在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__5(对象状态) [11/11/2014 06:13:36 > 0dc4f9:ERR] 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(对象状态) [11/11/2014 06:13:36 > 0dc4f9:ERR] 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) [11/11/2014 06:13:36 > 0dc4f9:ERR] 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) [11/11/2014 06:13:36 > 0dc4f9:ERR] 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() [11/11/2014 06:13:36 > 0dc4f9: ERR ] 在 System.Threading.ThreadPoolWorkQueue.Dispatch() [11/11/2014 06: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 秒 [11/11/2014 06:13:36 > 0dc4f9: SYS INFO] 状态更改为 PendingRestart

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

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

【问题讨论】:

    标签: azure-webjobs azure-webjobssdk


    【解决方案1】:

    因为方法是async void,WebJobs SDK 无法等待方法完成。将其更改为返回 Task...

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

    更多详情请见this post

    【讨论】:

    • 哇,我不敢相信我错过了。我最近更新了几个函数以使用异步方法,但忘记了进行特定更改。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多