Azure ServiceBus队列.我多次收到同样的消息

Dan*_*kin 4 .net azure azure-servicebus-queues

我调用了client.Send(brokeredMessage);一次,但是我收到了几次消息.对于句柄队列,我使用此代码

private static void HandleQueue(string queueName, MessageHandler messageHandler)
        {
            // Create the queue if it does not exist already
            string connectionString =
                Configuration.GetConnectionString("Microsoft.ServiceBus.ConnectionString",false);

            var namespaceManager =
                NamespaceManager.CreateFromConnectionString(connectionString);

            if (!namespaceManager.QueueExists(queueName))
            {
                namespaceManager.CreateQueue(queueName);
            }

            QueueClient client =
                QueueClient.CreateFromConnectionString(connectionString, queueName);

            while (true)
            {
                BrokeredMessage message = client.Receive();

                if (message != null)
                {
                    try
                    {    
                        messageHandler(message);

                        // Remove message from queue
                        message.Complete();
                    }
                    catch (Exception)
                    {
                        // Indicate a problem, unlock message in queue
                        message.Abandon();
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

问题是BrokeredMessage message = client.Receive();多次调用并返回相同的消息,如果执行messageHandler(message);需要很长时间.我该如何解决?

Abh*_*Lal 11

在您处理消息时,消息将被解锁.设置邮件锁定超时的正确位置位于QueueDescription http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queuedescription.lockduration.aspx

这里允许的最长时间是5分钟,因此如果您需要处理消息的时间更长,那么您可以调用RenewLock该消息继续让其对其他消费者不可见.在Complete完成处理之前,你是正确的,这是不可取的,就好像你处理崩溃,然后你不会再收到消息.

BrokeredMessage.ScheduledEnqueueTimeUtc当消息从队列中显示给消费者时,上述属性用于"延迟".假设您在第1天发送消息并将预定时间设置为第2天,则在Recieve第2天之前,呼叫将不会返回消息.