c# - 如何在 Azure 服务总线选项的 MessageHandlerOptions 中设置自动完成(使用 Net Core 3.1)
问题描述
我正在使用 .NET Core 3.1 编写网络作业,我的触发器如下所示:
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 中的 Autocomplete 设置为 false 以使 webjob 不会自动完成它并从队列中删除。
但我很难设置这个值。我试过:
在 appsettings.json 文件中进行如下设置:
“扩展”:{“serviceBus”:{“messageHandlerOptions”:{“maxConcurrentCalls”:16,“自动完成”:假}}}
但是在运行时,它不会从此文件中选择设置。我不知道为什么,我怎样才能从本地配置文件中读取设置?
我还尝试为 MessageHandlerOptions 创建一个对象,但签名缺少必需的参数,这使得它无法做到这一点。例如:
var messageHandlerOptions = new MessageHandlerOptions(ExceptionHandler) { AutoComplete = false, MaxAutoRenewDuration = new TimeSpan(0, 5, 0), // 5 minutes MaxConcurrentCalls = 1, }; messageReceiver.RegisterMessageHandler(MessageProcessor, messageHandlerOptions);
静态异步任务 MessageProcessor(Message message, CancellationToken token) { await messageReceiver.CompleteAsync(message.SystemProperties.LockToken); }
我无法访问messageReceiver
内部MessageProcessor
,这就是为什么这也是不可能的。
谁能建议我如何在配置文件中设置 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;
});
推荐阅读
- reactjs - React Native 项目通过 react native CLI 创建和运行错误
- android - 如何解决后续 .apk 上传证书与原始证书不同的问题
- c# - WPF MarkupExtension 绑定到字典
- reactjs - 检查 `App` 的渲染方法。将功能APP组件更改为类组件后
- flutter - 导航到其他路线后如何处理主题?
- python - 如何根据用户的输入验证 Python 中的多个“if”语句
- json - JSON响应不保留数据,除了从后端返回的列表中的第一条记录
- vue.js - VueJS - 找不到模块
- javascript - 在箭头函数中的箭头之后使用 () 或 {} 有什么区别?
- parse-platform - 如何通过持续集成将更新部署到 Cloud Code?