3

我开始使用 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' 上检测到新队列消息。[11/11/2014 06:13:36 > 0dc4f9:ERR] [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] 在系统.Threading.QueueUserWorkItemCallback.WaitCallback_Context(对象状态)[11/11/2014 06:13:36 > 0dc4f9: ERR] 在 System.Threading.ExecutionContext。

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

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

4

1 回答 1

10

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

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

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

于 2014-11-11T06:40:53.660 回答