【发布时间】: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