我正在做一个检查网络服务器的一些数据的网络作业。有时 Web 服务器很忙,会在几秒钟后再次尝试。
问题是,如果我只是忽略它并通过该函数,它将从队列中删除消息,我将无法重试调用。
我当前的解决方案(我根本不喜欢)是通过一个异常来增加双端队列数并将消息放回队列中。然而,这似乎非常残酷,需要重新启动 webjob 正在运行的线程。
有没有其他方法来处理这个?
我正在做一个检查网络服务器的一些数据的网络作业。有时 Web 服务器很忙,会在几秒钟后再次尝试。
问题是,如果我只是忽略它并通过该函数,它将从队列中删除消息,我将无法重试调用。
我当前的解决方案(我根本不喜欢)是通过一个异常来增加双端队列数并将消息放回队列中。然而,这似乎非常残酷,需要重新启动 webjob 正在运行的线程。
有没有其他方法来处理这个?
如果 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;
}
}
}
}