我开始使用 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] Executing: 'Functions.AlwaysFail' because New queue message detected on 'alwaysfail'. [11/11/2014 06:13:36 > 0dc4f9: ERR ] [11/11/2014 06:13:36 > 0dc4f9: ERR ] Unhandled Exception: System.InvalidOperationException: Induced Error [11/11/2014 06:13:36 > 0dc4f9: ERR ] at Plmtc.BackgroundWorker.Functions.d__2.MoveNext() [11/11/2014 06:13:36 > 0dc4f9: ERR ] --- End of stack trace from previous location where exception was thrown --- [11/11/2014 06:13:36 > 0dc4f9: ERR ] at System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__5(Object state) [11/11/2014 06:13:36 > 0dc4f9: ERR ] at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) [11/11/2014 06:13:36 > 0dc4f9: ERR ] at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) [11/11/2014 06:13:36 > 0dc4f9: ERR ] at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) [11/11/2014 06:13:36 > 0dc4f9: ERR ] at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() [11/11/2014 06:13:36 > 0dc4f9: ERR ] at System.Threading.ThreadPoolWorkQueue.Dispatch() [11/11/2014 06:13:36 > 0dc4f9: ERR ] at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() [11/11/2014 06:13:36 > 0dc4f9: SYS ERR ] Job failed due to exit code -532462766 [11/11/2014 06:13:36 > 0dc4f9: SYS INFO] Process went down, waiting for 60 seconds [11/11/2014 06:13:36 > 0dc4f9: SYS INFO] Status changed to PendingRestart
我可以让仪表板中的异步函数失败的唯一方法是编写一个将 POCO 类作为参数但只在消息中包含一个简单字符串的函数。在这些情况下,在到达任何函数代码之前,在消息/参数绑定(bind)期间发生故障。
有人成功使用异步函数响应队列触发器而没有这些问题吗?
最佳答案
因为方法是 async void
,WebJobs SDK 无法等待方法完成。将其更改为返回 Task
...
public async static Task AlwaysFail([QueueTrigger("alwaysfail")] string message)
{
throw new Exception("Induced Error");
}
见 this post了解更多详情。
关于azure-webjobs - 异步时 Azure WebJob 不会正确失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26858897/