Windows Service Bus LockDuration属性的值

时间:2014-05-11 15:13:46

标签: c# azure servicebus azureservicebus

HY,

我对LockDuration属性有疑问。我有这个接收功能:

// Use the MessagingFactory to create a queue client for the orderqueue.
QueueClient queueClient = factory.CreateQueueClient("orderqueue");

// Receive messages from the queue with a 10 second timeout.
while (true)
{
    // Receive a message using a 10 second timeout
    BrokeredMessage msg = queueClient.Receive(TimeSpan.FromSeconds(10));

    if (msg != null)
    {
        // Deserialize the message body to an order data contract.
        Order order = msg.GetBody<Order>();
        // Output the order.
        Console.WriteLine("{0} {1} {2} {3} {4} ${5}",
        order.OrderNumber,
        order.Customer.FirstName,
        order.Customer.LastName,
        order.ShipTo.City,
        order.ShipTo.Province,
        order.Total);
        // Update the database
        try
        {
            // Add the order to the database.
            OrdersData.AddOrder(order);
            // Mark the message as complete.
            msg.Complete();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception: {0}", ex.Message);
            // Something went wrong, abandon the message.
            msg.Abandon();
        }
    }
    else
    {
        // No message has been received, we will poll for more messages.
        Console.WriteLine("Polling, polling, polling...");
    }
}

如果我收到上述示例中的消息。如果一切正常,我用Complete()函数删除消息。如果出现问题我会调用Abondon()函数,因此消息将被解锁。所以我的烦恼:

当我使用peeklock recevie模式时,有QueueDescription.LockDuration属性和SubscriptionDescription.LockDuration属性来设置消息的锁定持续时间。您可以将其更改为5分钟。在某处我读到你应该仔细设置这个探测器的值。为什么我不应该将它设置为5分钟,因为如果abandom()函数出现错误,则无论如何都会解锁消息(参见代码示例中的catch块)。

祝你好运

1 个答案:

答案 0 :(得分:2)

决定锁定持续时间的主要考虑因素是:

1)如果发生故障,你会读到多长时间?

2)处理邮件需要多长时间?

假设您将锁定持续时间设置为5分钟,然后锁定消息并且处理器死亡。这意味着5分钟后下一个接收器将可以使用该消息。如果没有失败,您完成甚至放弃了该消息,那么它将立即可用。

假设您需要大约1分钟来处理消息,您可以将锁定持续时间设置为2分钟,而不必更新锁定,但如果您需要10分钟处理,则需要适当地调用RenewLock。因此,如果您不关心第一种情况(发生故障时的延迟)并且希望避免更新锁定,您的消息处理可以在5分钟内完成,那么选择5分钟就可以了。