尝试完成消息时出现 Azure 服务总线异常
Azure service Bus Exception on trye to complete message
我正在使用 GitHub 示例来处理主题的消息:
private void RegisterSubscriptionClientMessageHandler()
{
_subscriptionClient.RegisterMessageHandler(
async (message, token) =>
{
var eventName = $"{message.Label}{INTEGRATION_EVENT_SUFIX}";
var messageData = Encoding.UTF8.GetString(message.Body);
await ProcessEvent(eventName, messageData);
// Complete the message so that it is not received again.
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
},
new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 10, AutoComplete = false });
}
所有订阅者都成功发送和接收了所有消息,但是在命令中:
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
总是出现以下错误:
ERROR ON ExceptionReceivedHandler EXEPTION: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
Bazinga.EventBus.Bus.EventBusSubscription:Error: ERROR ON ExceptionReceivedHandler EXEPTION: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
- Executing Action: UserCallback
有什么解决办法吗?谢谢!
当从服务总线队列或主题订阅接收到消息时,锁定令牌将随消息一起返回。
锁定令牌可用于删除、死信或延迟消息。
每个队列和主题订阅都有锁定持续时间 属性。根据为 Lock duration 配置的时间跨度,随消息提供的锁将过期。
在这里,您在完成消息之前正在做一些处理await ProcessEvent(eventName, messageData);
。
问题一定是锁在_subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
行执行前过期了。
增加锁定持续时间或在调用 ProcessEvent 之前完成消息将解决您的问题。
另一个主要原因是 Autocomplete 默认启用。
每当您使用 CompleteAsync() 时,您还应该实例化一个 OnMessageOptions
对象,以便将集合 AutoComplete
设置为 false
,并将其传递到您的 OnMessage 调用中。
OnMessageOptions onMessageOpt = new OnMessageOptions();
onMessageOpt.AutoComplete = false;
client.OnMessage(processCalculations, options);
看到这个
我正在使用 GitHub 示例来处理主题的消息:
private void RegisterSubscriptionClientMessageHandler()
{
_subscriptionClient.RegisterMessageHandler(
async (message, token) =>
{
var eventName = $"{message.Label}{INTEGRATION_EVENT_SUFIX}";
var messageData = Encoding.UTF8.GetString(message.Body);
await ProcessEvent(eventName, messageData);
// Complete the message so that it is not received again.
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
},
new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 10, AutoComplete = false });
}
所有订阅者都成功发送和接收了所有消息,但是在命令中:
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
总是出现以下错误:
ERROR ON ExceptionReceivedHandler EXEPTION: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
Bazinga.EventBus.Bus.EventBusSubscription:Error: ERROR ON ExceptionReceivedHandler EXEPTION: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
- Executing Action: UserCallback
有什么解决办法吗?谢谢!
当从服务总线队列或主题订阅接收到消息时,锁定令牌将随消息一起返回。
锁定令牌可用于删除、死信或延迟消息。
每个队列和主题订阅都有锁定持续时间 属性。根据为 Lock duration 配置的时间跨度,随消息提供的锁将过期。
在这里,您在完成消息之前正在做一些处理await ProcessEvent(eventName, messageData);
。
问题一定是锁在_subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
行执行前过期了。
增加锁定持续时间或在调用 ProcessEvent 之前完成消息将解决您的问题。
另一个主要原因是 Autocomplete 默认启用。
每当您使用 CompleteAsync() 时,您还应该实例化一个 OnMessageOptions
对象,以便将集合 AutoComplete
设置为 false
,并将其传递到您的 OnMessage 调用中。
OnMessageOptions onMessageOpt = new OnMessageOptions();
onMessageOpt.AutoComplete = false;
client.OnMessage(processCalculations, options);
看到这个