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块)。
祝你好运
答案 0 :(得分:2)
决定锁定持续时间的主要考虑因素是:
1)如果发生故障,你会读到多长时间?
2)处理邮件需要多长时间?
假设您将锁定持续时间设置为5分钟,然后锁定消息并且处理器死亡。这意味着5分钟后下一个接收器将可以使用该消息。如果没有失败,您完成甚至放弃了该消息,那么它将立即可用。
假设您需要大约1分钟来处理消息,您可以将锁定持续时间设置为2分钟,而不必更新锁定,但如果您需要10分钟处理,则需要适当地调用RenewLock。因此,如果您不关心第一种情况(发生故障时的延迟)并且希望避免更新锁定,您的消息处理可以在5分钟内完成,那么选择5分钟就可以了。