如何在C# Azure Function中手动处理Azure Service Bus 5.0.0消息完成
问题场景
我正在编写一个Azure Function来获取Azure Service Bus中的消息,希望手动处理所有异常(已配置"autoCompleteMessages": false),但不知道如何向服务队列返回完成或放弃指令。
尝试方案1
[FunctionName("SBQ_F1_VC")] public static async Task Run([ServiceBusTrigger("sbqfn1", Connection = "BrnlTest1_SERVICEBUS")] ServiceBusReceivedMessage msg, ILogger log) { //..... if(!Int32.TryParse(msg.ApplicationProperties.GetValueOrDefault("vid").ToString(), out vid)) { await using ServiceBusClient client = new ServiceBusClient(Environment.GetEnvironmentVariable("BrnlTest1_SERVICEBUS")); ServiceBusReceiver msgRcvr = client.CreateReceiver(Environment.GetEnvironmentVariable("queueName"), new ServiceBusReceiverOptions()); //await msgRcvr.RenewMessageLockAsync(msg); await msgRcvr.AbandonMessageAsync(msg); //vid = 0; } //..... }
方案1报错
System.Private.CoreLib: Exception while executing function: SBQ_F1_VC. Azure.Messaging.ServiceBus: 提供的锁无效。可能是锁已过期、消息已从队列移除,或被其他接收器实例接收。(MessageLockLost)
尝试方案2
[FunctionName("SBQ_F1_VC")] public static async Task Run([ServiceBusTrigger("sbqfn1", Connection = "BrnlTest1_SERVICEBUS")] ServiceBusReceivedMessage[] msgs, ServiceBusMessageActions msgActions) { //..... await msgActions.DeadLetterMessageAsync(msg); }
方案2报错
Microsoft.Azure.WebJobs.Host: 索引方法'SBQ_F1_VC'出错。Microsoft.Azure.WebJobs.Host: 无法将参数'msgActions'绑定到ServiceBusMessageActions类型。请确保参数类型受绑定支持,若使用绑定扩展(如Azure Storage、Service Bus、Timers等),请确认已在启动代码中调用扩展注册方法(如builder.AddAzureStorage()、builder.AddServiceBus()、builder.AddTimers()等)。
备注
- Service Bus版本为5.0.0,因此必须使用
Azure.Messaging.ServiceBus命名空间- 对应消息对象类型为
ServiceBusReceivedMessage
- 对应消息对象类型为
可行方案
ServiceBusMessageActions的参数名必须为messageActions,目前不支持修改该参数名:
public static async Task Run( [ServiceBusTrigger("sbqfn1", Connection = "BrnlTest1_SERVICEBUS")] ServiceBusReceivedMessage[] msgs, ServiceBusMessageActions messageActions) {
内容的提问来源于stack exchange,提问作者147
相关产品推荐
相关产品推荐

