gpt4 book ai didi

c# - 当锁定持续时间尚未过去时,Azure 服务总线对非分区队列抛出 MessageLockLostException

转载 作者:行者123 更新时间:2023-12-02 07:56:26 25 4
gpt4 key购买 nike

我尝试使用 PeekLock 接收模式接收消息,处理该消息(处理时间远低于消息锁定持续时间),然后完成该消息。我已经检查了周围是否有其他人有类似的问题,但我认为我已经排除了所有建议的解决方案。

  • 队列分区。
  • 当我测试时,队列中只有一条消息,而且我什至尝试将 PrefetchCount 设置为 1。
  • 只有一个接收器处于事件状态。
  • 我已将 LockDuration 增加到 5 分钟,处理时间约为 20 秒。检查收到的消息时,我可以看到 LockedUntil 属性比 CompleteAsync 调用晚得多。

即便如此,当调用 CompleteAsync 方法时,我每次都会收到 MessageLockLostException

这是我正在使用的包装类(的相关部分):

public class ServiceBusClient
{
private readonly ServiceBusConnectionManager manager;

public ServiceBusClient(string connectionString)
{
manager = new ServiceBusConnectionManager(connectionString);
}

public async Task<Message> GetNextDownlinkMessage(string queueName)
{
var messageReceiver = new MessageReceiver(manager.Connection, queueName, ReceiveMode.PeekLock);
var message = await messageReceiver.ReceiveAsync();
await messageReceiver.CloseAsync();
return message;
}

public async Task Complete(string queueName, string lockToken)
{
var queueClient = new QueueClient(manager.Connection, queueName, ReceiveMode.PeekLock, null);
await queueClient.CompleteAsync(lockToken);
}
}

我已经检查过 lockToken 实际上是在收到的消息上设置的。我真的没有主意了。

<小时/>

编辑:我后来意识到错误是因为我每次实例化一个新的 MessageReceiver 对象,并且消息需要由用于获取消息的完全相同的实例来完成。

最佳答案

听起来您使用的是旧版本的服务总线 SDK。有一个较新的版本将于本月底发布并全面上市 - 您可以找到它 here

使用新库,您可以通过在 SeviceBusReceiver 上调用 .CompleteMessageAsync(msg) 来完成消息 ( sample link ):

string connectionString = "<connection_string>";
string queueName = "<queue_name>";
// since ServiceBusClient implements IAsyncDisposable we create it with "await using"
await using var client = new ServiceBusClient(connectionString);

// create a receiver that we can use to receive and settle the message
ServiceBusReceiver receiver = client.CreateReceiver(queueName);

// the received message is a different type as it contains some service set properties
ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync();

// complete the message, thereby deleting it from the service
await receiver.CompleteMessageAsync(receivedMessage);

关于c# - 当锁定持续时间尚未过去时,Azure 服务总线对非分区队列抛出 MessageLockLostException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64725793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com