3

我正在做一个检查网络服务器的一些数据的网络作业。有时 Web 服务器很忙,会在几秒钟后再次尝试。

问题是,如果我只是忽略它并通过该函数,它将从队列中删除消息,我将无法重试调用。

我当前的解决方案(我根本不喜欢)是通过一个异常来增加双端队列数并将消息放回队列中。然而,这似乎非常残酷,需要重新启动 webjob 正在运行的线程。

有没有其他方法来处理这个?

4

1 回答 1

5

如果 Webjobs SDK 抛出异常,它们将重试队列触发的函数。重试次数通过此处JobHostConfiguration.Queues.MaxDequeueCount所述的属性进行配置。

如果您不想依赖 SDK 的重试策略,您可以随时在自己的代码中处理异常并重试。只需捕获异常或服务器繁忙时发生的任何事情,然后重试操作直到成功。然而,这正是 SDK 在幕后所做的事情,通过自己执行此操作,您不会获得自动转移到毒物队列功能的功能。

除非函数不能设计为可重入的,否则我建议让 SDK 完成重试工作。如果您仍然决定自己处理,代码如下所示:

public static void WebJobFunction([QueueTrigger("temp")] string message)
{
    int retriesLeft= 5;

    while(true) 
    {
       try
       {
            --retriesLeft;
            DoServerOperation(message);
            break;

        }
        catch(TimeoutException)
        {
            if (retriesLeft == 0) 
            {
               throw;
            }
        }       
    }
}
于 2014-11-03T17:12:30.163 回答