c# - Azure队列在DeleteMessage上抛出异常

标签 c# .net azure azure-queues

我正在开发一个基于 Azure 的项目进行一些研究,并且在从 CloudQueue 实例删除消息时遇到了一些问题。代码相当简单,所以我有点困惑为什么当我尝试从队列中删除消息时会抛出异常。

以下是为队列生成数据的代码:

foreach (var cell in scheme(cells))
{
    string id = Guid.NewGuid().ToString();
    var blob = sweepItemContainer.GetBlobReference(id);
    using (BlobStream stream = blob.OpenWrite())
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(stream, cell);
    }
    sweepItemQueue.AddMessage(new CloudQueueMessage(id), new TimeSpan(1, 0, 0));
}

以下是使用队列中的数据的代码:

var msgs = sweepItemsQueue.GetMessages(MsgAmt);
foreach (var msg in msgs)
{
     _handleMessage(msg, sweepItemsContainer);
     sweepItemsQueue.DeleteMessage(msg);
     mergeItemsQueue.AddMessage(new CloudQueueMessage(msg.AsString), new TimeSpan(1, 0, 0));
}

我不明白为什么消息不能存在于队列中。除了其他消费者之外,没有其他任何东西会改变队列。但我确信他们无法收到相同的消息(只要时间跨度没有用完),那么这是怎么发生的?

最佳答案

您需要担心两个超时:消息在队列中的生存时间(您在 .AddMessage() 调用中指定的时间)以及设置的可见性超时当您调用 .GetMessages() 时(默认为 30 秒,有一个 overload 允许您指定超时)。当您调用 .GetMessages() 时> 在“visibilityTimeout”期间,所有返回的消息对其他使用者都是不可见的。此期限结束后,您尚未删除的所有消息将对所有其他使用者可见。

要检查这是否是问题所在,我会尝试使用 .GetMessages() 的重载,其最大可见性超时为 2 小时。如果这是问题所在,您可以将此值微调到更合理的数字。另一种选择是一次只检索一条消息。

关于c# - Azure队列在DeleteMessage上抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5561173/

相关文章:

c# - 在 C# 中,我如何使用委托(delegate)来操作我创建的自定义类中的表单?

c# - 在另一个列表中的列表中查找项目?

azure - 如何使用 Azure SDK for Golang 获取网络使用情况/配额?

c# - WPF MediaElement 应用的播放列表

c# - 比较一个字符串到多个字符串

jquery - 无法 POST 到 IHTTPHandler 类,Access-Control-Allow-Origin 不允许来源

c# - 检查应用程序是否在终端服务而不是远程桌面下运行

powershell - Azure Powershell 将 azure 存储帐户复制到另一个 azure 存储帐户

azure - Azure SQL Server 中批量插入的权限问题

C# - 如何为 24 小时时间格式实现 DateTime.TryParse