StorageClientException:指定的消息不存在?

时间:2010-04-27 03:41:06

标签: azure azure-storage

我有一个简单的视频编码工作者角色,从队列中提取消息对视频进行编码,然后将视频上传到存储。一切似乎都在工作,但偶尔在我完成编码和上传后删除消息时我得到一个“StorageClientException:指定的消息不存在。”虽然处理了视频,但我相信消息是重新出现在队列中,因为它没有被正确删除。我将消息visablilty设置为5分钟,所有视频都没有超过2个处理。

  • 是否有可能是另一个实例 工人角色正在处理和 删除邮件?
  • GetMessage()不会阻止 拾起其他工人角色 同样的消息?
  • 我做错了什么 设置我的队列?
  • 可能导致此消息的原因 在删除时找不到?

一些代码......

  //onStart() queue setup
  var queueStorage = _storageAccount.CreateCloudQueueClient();
  _queue = queueStorage.GetQueueReference(QueueReference);
  queueStorage.RetryPolicy = RetryPolicies.Retry(5, new TimeSpan(0, 5, 0));
  _queue.CreateIfNotExist();


 public override void Run()
  {
        while (true)
        {
            try
            {
                var msg = _queue.GetMessage(new TimeSpan(0, 5, 0));
                if (msg != null)
                {
                   EncodeIt(msg);
                   PostIt(msg);
                   _queue.DeleteMessage(msg);
                }
                else
                {
                    Thread.Sleep(WaitTime);
                }
            }
            catch (StorageClientException exception)
            {
                BlobTrace.Write(exception.ToString());
                Thread.Sleep(WaitTime);
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

是否可能花费的时间超过你设定为超时的五分钟?

答案 1 :(得分:1)

如果编码过程花费的时间超过消息隐身超时(在您的情况下为5分钟),则消息将再次显示在队列中。这将导致第二个工作人员开始处理它。但是,当第二个工人完成处理时,第一个工人已经完成了工作,正确地删除了它。这将导致第二个工作人员在删除阶段失败,因为该消息不再存在。

由于Windows Azure队列的轻量级事务模型,会发生这种情况。它保证消息至少会被处理一次(即使工作者无声地失败),但不保证“只进行一次”处理

由于您的编码过程似乎是幂等且轻量级的(因为错误很少出现),我只是建议增加隐身超时明确捕获此异常(通过状态代码)围绕DeleteMessages(可选地记录进程持续时间,以便能够进一步调整不可见性超时)。

答案 2 :(得分:0)

我的开发,制作和舞台都是从同一个队列拉出来的,这导致了一些奇怪的行为。我相信这是罪魁祸首。