如何禁用特定队列项的Azure webjob存储队列处理?

时间:2016-10-07 15:32:35

标签: azure azure-webjobs azure-webjobssdk azure-queues

我有一个队列触发的Azure webjob功能:

public void ProcessQueueMessage([QueueTrigger("%MyQueue%")] Item item, TextWriter logger)
    {
       // Do normal processing...
    }

我想根据条件选择性地忽略某些队列项。例如,如果我没有Widget X,我不想继续处理小部件货物,直到我有库存。所以我想暂时忽略/跳过所有Widget X队列项。如下所示:

public void ProcessQueueMessage([QueueTrigger("%MyQueue%")] Item item, TextWriter logger)
{
    if (!HaveStock(WidgetX))
       // Ignore queue item - treat it as if it was not in the queue at all

    // Do normal processing...
}

抛出异常处理失败似乎不是我的选择,因为它会使消息中毒。

我可以将VisibilityTimeout设置为某个任意高的值,然后抛出异常,但是当我想执行处理时(而不是等待超时)我必须对队列项进行单独的进程扫描使用较高的VisibilityTimeout并将超时设置为较低的值(甚至不确定是否可行)。但是我正在尝试避免扫描这些队列项的进程,因为我希望尽可能将逻辑保留在队列触发函数中。

我有哪些选择?

更新:我认识到我想要完成的事情首先与队列触发函数的目的不一致,因为队列触发事件的原因是在出现消息时执行某些操作,并且如果我想要选择性处理我可以自己实现队列轮询和消息处理过程。但我正在尝试利用触发处理提供的更高级别的抽象。

1 个答案:

答案 0 :(得分:4)

我想说;让Queue成为队列,让FIFO成为FIFO。

如果你想用队列处理条件消息处理,我建议两个选项。

<强> 1。使用Azure Service Bus主题

对于选择性FIFO过滤器,将Azure队列替换为Azure服务总线主题可以是候选者。

请参阅教程以获取提示: https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-service-bus/#topics

<强> 2。使用辅助队列

与poisoned-queue类似,将忽略的一个发送到辅助队列,稍后在另一个逻辑中处理它们。我推荐这个,因为我们可以很容易地理解流程。

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
_secondaryQueue= queueClient.GetQueueReference(storageQueueName);
_secondaryQueue.CreateIfNotExists();

public static void ProcessQueueMessage([QueueTrigger("%MyQueue%")] Item item, TextWriter logger)
{
    // send to secondary queue.
    await _secondaryQueue.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(item)));
}