如何在 Azure 服务总线选项中的 MessageHandlerOptions 中设置自动完成(使用 Net Core 3.1)
How to set Autocomplete in MessageHandlerOptions in Azure Service Bus Options (using Net Core 3.1)
我正在使用 .NET Core 3.1 编写 Web 作业,我的触发器如下所示:
public async Task ProcessQueueMessage([ServiceBusTrigger("%ServiceBusProviderConfig:TopicName%", "%ServiceBusProviderConfig:TopicSubscriptionName%", Connection = "ServiceBusConnectionString")] Message message, MessageReceiver messageReceiver, TraceWriter log, TextWriter textWriter)
我正在按照以下方式处理消息并调用完整/死信:
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
await messageReceiver.DeadLetterAsync(message.SystemProperties.LockToken);
但是,这是抛出错误:
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.
我知道我需要以某种方式将 MessageHandlerOptions 中的自动完成设置为 false,以使 Web 作业不会自动完成它并从队列中删除。
但是我很难设置这个值。我试过了:
在appsettings.json文件中设置如下:
“扩展”:{
“服务总线”:{
“消息处理选项”:{
“maxConcurrentCalls”:16,
“自动完成”:假
}
}
}
但是在 运行 上,它没有从该文件中选取设置。我不确定为什么,如何从本地配置文件读取设置?
我还尝试为 MessageHandlerOptions 创建一个对象,但签名缺少必需的参数,因此无法执行此操作。例如:
var messageHandlerOptions = new MessageHandlerOptions(ExceptionHandler)
{
AutoComplete = false,
MaxAutoRenewDuration = new TimeSpan(0, 5, 0), // 5 minutes
MaxConcurrentCalls = 1,
};
messageReceiver.RegisterMessageHandler(MessageProcessor, messageHandlerOptions);
static async Task MessageProcessor(消息消息,CancellationToken 令牌)
{
等待 messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
}
我无法在 MessageProcessor
内访问 messageReceiver
,这就是为什么这也不可能。
谁能建议我如何在配置文件中设置 ServiceBusOptions 以便在运行时读取?
仅供参考,我正在使用以下软件包:
1. Microsoft.Azure.ServiceBus Version="4.1.3"
2. Microsoft.Azure.WebJobs.Extensions Version="3.0.0"
3. Microsoft.Azure.WebJobs.Extensions.ServiceBus Version="3.0.0"
4. Microsoft.Azure.WebJobs.Extensions.Storage Version="4.0.2"
5. Microsoft.Azure.WebJobs.Logging.ApplicationInsights Version="3.0.14"
经过大量的搜索,终于找到了答案。将其发布给寻找相同问题的任何人:
services.AddServiceBus(options =>
{
options.ConnectionString = "ServiceBusConnectionString";
options.MessageHandlerOptions.AutoComplete = false;
options.PrefetchCount = 1;
options.MessageHandlerOptions.MaxConcurrentCalls = 1;
});
关于 https://github.com/Azure/azure-functions-servicebus-extension/issues/34 的最后评论帮助我将其配置为 host.json
我正在使用 .NET Core 3.1 编写 Web 作业,我的触发器如下所示:
public async Task ProcessQueueMessage([ServiceBusTrigger("%ServiceBusProviderConfig:TopicName%", "%ServiceBusProviderConfig:TopicSubscriptionName%", Connection = "ServiceBusConnectionString")] Message message, MessageReceiver messageReceiver, TraceWriter log, TextWriter textWriter)
我正在按照以下方式处理消息并调用完整/死信:
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
await messageReceiver.DeadLetterAsync(message.SystemProperties.LockToken);
但是,这是抛出错误:
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.
我知道我需要以某种方式将 MessageHandlerOptions 中的自动完成设置为 false,以使 Web 作业不会自动完成它并从队列中删除。
但是我很难设置这个值。我试过了:
在appsettings.json文件中设置如下:
“扩展”:{ “服务总线”:{ “消息处理选项”:{ “maxConcurrentCalls”:16, “自动完成”:假 } } }
但是在 运行 上,它没有从该文件中选取设置。我不确定为什么,如何从本地配置文件读取设置?
我还尝试为 MessageHandlerOptions 创建一个对象,但签名缺少必需的参数,因此无法执行此操作。例如:
var messageHandlerOptions = new MessageHandlerOptions(ExceptionHandler) { AutoComplete = false, MaxAutoRenewDuration = new TimeSpan(0, 5, 0), // 5 minutes MaxConcurrentCalls = 1, }; messageReceiver.RegisterMessageHandler(MessageProcessor, messageHandlerOptions);
static async Task MessageProcessor(消息消息,CancellationToken 令牌) { 等待 messageReceiver.CompleteAsync(message.SystemProperties.LockToken); }
我无法在 MessageProcessor
内访问 messageReceiver
,这就是为什么这也不可能。
谁能建议我如何在配置文件中设置 ServiceBusOptions 以便在运行时读取?
仅供参考,我正在使用以下软件包:
1. Microsoft.Azure.ServiceBus Version="4.1.3"
2. Microsoft.Azure.WebJobs.Extensions Version="3.0.0"
3. Microsoft.Azure.WebJobs.Extensions.ServiceBus Version="3.0.0"
4. Microsoft.Azure.WebJobs.Extensions.Storage Version="4.0.2"
5. Microsoft.Azure.WebJobs.Logging.ApplicationInsights Version="3.0.14"
经过大量的搜索,终于找到了答案。将其发布给寻找相同问题的任何人:
services.AddServiceBus(options =>
{
options.ConnectionString = "ServiceBusConnectionString";
options.MessageHandlerOptions.AutoComplete = false;
options.PrefetchCount = 1;
options.MessageHandlerOptions.MaxConcurrentCalls = 1;
});
关于 https://github.com/Azure/azure-functions-servicebus-extension/issues/34 的最后评论帮助我将其配置为 host.json