CloudQueueMessage重复

时间:2013-12-31 20:55:02

标签: c# azure

我创建了一个具有主角和两个侦听工作者角色的计划任务:

http://msdn.microsoft.com/en-us/library/windowsazure/hh697709.aspx

我的监听器项目有两个实例。什么阻止两个工作者角色两次获得相同的消息?

这是我的代码:

    public override void Run()
    {
        // This is a sample worker implementation. Replace with your logic.
        //Trace.TraceInformation("CloudCartConnector.TaskRole entry point called", "Information");
        while (true)
        {
            ExecuteTask();
            Thread.Sleep(30000);
            Trace.TraceInformation("Working", "Information");
        }
    }


    private void ExecuteTask()
    {
        try
        {
            CloudQueueMessage message = queue.GetMessage();
            if (message != null)
            {
                JMATask task = GetTask(message.AsString);
                queue.DeleteMessage(message);
                PerformTask(task);
            }
        }
        catch (Exception ex)
        {
            Trace.TraceInformation("Unable to get messages: " + ex.ToString());
        }
    }

1 个答案:

答案 0 :(得分:0)

从队列中获取消息(或消息集)将使消息在一段时间内(NextVisibleTime)对队列中的其他客户端不可见,并且只要您在其中删除消息那个时间窗口,没有其他客户应该看到它。因此,确保在可见性超时内完成工作或者让另一个工作人员获取相同的逻辑消息并再次开始处理它是很重要的。

如果您知道工作人员处理特定类型消息所需的平均时间,那么您可以调用the GetMessage overload,其中TimeSpan指定该可见性超时应该有多长。对于无参数过载,默认值为30秒。

此外,您可以使用UpdateMessage在工作人员角色中处理消息时动态更新可见性超时。这样,如果某些事情可能需要两个小时才能处理,但是在此过程中有各种步骤,您可以在逐步完成步骤时更新可见性超时。这样,如果处理消息失败了10分钟后进入辅助角色,它将重新出现并可以更快地被提取。