azure-webjobs - 异步时 Azure WebJob 不会正确失败

标签 azure-webjobs azure-webjobssdk

我开始使用 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/

相关文章:

azure - 如果 Web 应用程序出现故障,Azure Webjobs 也会出现故障吗?

azure - Azure 函数参数中的 DocumentClient 绑定(bind)

azure - 当 Azure WebJobs SDK 仪表板连接字符串根本不为空时,为什么我会收到异常“Azure WebJobs SDK 仪表板连接字符串缺失或为空”?

c# - Azure WebJobs SDK 3,尝试添加 BlobTrigger 和相关连接字符串

azure - CloudQueueClient类中 "result segment"的含义

azure - 横向扩展时限制 azure webjob 的实例数量

azure - 禁止在 Azure Webjobs ("Executing: ' xxx' 中进行日志记录,因为在 'yyy' 上检测到新队列消息。”)

azure - 如何按失败筛选 Azure WebJob 函数调用历史记录?

Azure webjobs 与调度程序

azure - 如何为 WebJob 监听器指定特定队列