我当前正在使用 WebJobs SDK 来使用队列中发出的消息。
我的方法作为带有 [Microsoft.Azure.WebJobs.QueueTrigger(...)] 属性的一个参数,并且可以正常触发。 在某些情况下,该方法可以处理消息,但有时,我希望它拒绝该消息,直到关键资源可用。
在这种情况下,我尝试抛出异常,但与引用文献所述相反,队列触发器立即再次触发(显然没有等待租用时间)。
有没有办法优雅地推迟消息处理? 仅卡住等待关键资源的线程是否安全?
任何提示将不胜感激。
请您参考如下方法:
我认为在当前版本中您无法推迟消息。
可能的解决方法
您可以延迟重新添加相同的消息,为了避免重复,您可以将 MaxDequeueCount
设置为 1
,这将发送失败异常后消息直接发送到poison队列:
JobHostConfiguration configuration = new JobHostConfiguration();
configuration.Queues.MaxDequeueCount = 1;
和消息处理器 - 延迟重新添加消息并抛出异常:
public static void ProcessMessage([QueueTrigger("resource-heavy-queue")] string message, [Queue("resource-heavy-queue")] CloudQueue originalQueue)
{
if ( /*Resource unavaliable*/)
{
var messageToReAdd = new CloudQueueMessage(message);
originalQueue.AddMessage(messageToReAdd, null, TimeSpan.FromSeconds(10));
throw new ResourcesNotAvailableException();
}
}
通过这种方式,您可以为您的资源实现某种退避策略。不幸的是,您必须手动处理一些问题:
- 处理有害消息 - 如果您不断重新添加相同的消息,则可能会陷入无限循环,因此您必须扩展消息模型以携带
NumberOfRetries
并在每次重新添加时递增它添加它 - 每次重新添加后,消息
Id
和InsertionTime
都会有所不同,因此您不能依赖它们。