我有一个带有 QueueTrigger 的网络作业。我用 try&catch 包装了 process 函数,但似乎 azure 队列正在抛出一个我无法在我的代码中捕获的未处理异常。
如何自动重启webjob?
如何将重试策略添加到 webjob sdk?

这是我在 webjob 日志中看到的异常(它显示错误发生在 webjob sdk 计时器中):

04/18/2015 11:10:52 > 2d2f34: ERR ]
[04/18/2015 11:10:52 > 2d2f34: ERR ] Unhandled Exception: Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (503) Server Unavailable. ---> System.Net.WebException: The remote server returned an error: (503) Server Unavailable.
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.WindowsAzure.Storage.Shared.Protocol.HttpResponseParsers.ProcessExpectedStatusCodeNoException[T](HttpStatusCode expectedStatusCode, HttpStatusCode actualStatusCode, T retVal, StorageCommandBase`1 cmd, Exception ex)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.WindowsAzure.Storage.Queue.CloudQueue.<ExistsImpl>b__1d(RESTCommand`1 cmd, HttpWebResponse resp, Exception ex, OperationContext ctx)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndGetResponse[T](IAsyncResult getResponseResult)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    --- End of inner exception stack trace ---
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult result)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.WindowsAzure.Storage.Queue.CloudQueue.EndExists(IAsyncResult asyncResult)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass1`1.<CreateCallback>b__0(IAsyncResult ar)
[04/18/2015 11:10:52 > 2d2f34: ERR ] --- End of stack trace from previous location where exception was thrown ---
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.Azure.WebJobs.Host.Queues.Listeners.QueueListener.<ExecuteAsync>d__4.MoveNext()
[04/18/2015 11:10:52 > 2d2f34: ERR ] --- End of stack trace from previous location where exception was thrown ---
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.Azure.WebJobs.Host.Timers.TaskSeriesTimer.<RunAsync>d__d.MoveNext()
[04/18/2015 11:10:52 > 2d2f34: ERR ] --- End of stack trace from previous location where exception was thrown ---
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at Microsoft.Azure.WebJobs.Host.Timers.BackgroundExceptionDispatcher.<>c__DisplayClass1.<Throw>b__0()
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
[04/18/2015 11:10:52 > 2d2f34: ERR ]    at System.Threading.ThreadHelper.ThreadStart()
[04/18/2015 11:10:52 > 2d2f34: SYS INFO] Status changed to Failed
[04/18/2015 11:10:52 > 2d2f34: SYS ERR ] Job failed due to exit code -532462766

这是我的代码:
public static async Task  ManualTrigger([QueueTrigger(ConstantVars.TargetjobQueue)] TargetingJob job, TextWriter log)
{
    try
    {
        AddTextWriterToAppender(log);

        _logger.DebugFormat("Starting job");
        _logger.DebugFormat("Job details: {0}", job);

        await ProcessJob(job).ConfigureAwait(false);

        _logger.Debug("Finished job");

        RemoveTextWriterFromAppender();
    }
    catch (Exception e)
    {
        _logger.Error(string.Format("Unhandled exception was caught in ManualTrigger.\n jobParams={0}",job.ToString()),e);
    }
}

最佳答案

正如您所确定的,存储异常发生在您的工作职能之外,因此您无法捕捉到它。但是,webjobs SDK 将根据其自己的内部随机指数退避策略自动处理失败并重试失败的调用。您可以在启动时设置 JobHostConfiguration.Queues.MaxDequeueCount 来控制重试次数。

关于c# - azure webjob 因未处理的异常 : 503 Server Unavailable 而停止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29727269/

10-12 21:24