我正在使用服务总线队列触发功能。
当我们手动(立即紧急)DeadLetter BrokeredMessage时,的确会进入死信队列。
但是,运行时报告以下错误:
提供的锁无效。锁已过期,或者邮件已从队列中删除
示例功能
[FunctionName("MySbFunction")]
public static async Task Run(
[ServiceBusTrigger("topic-name", "subscription-name", AccessRights.Manage, Connection = "xxx")] BrokeredMessage msg,
ILogger log)
{
await msg.DeadLetterAsync();
}
如果我们改为.CompleteAsync();
消息,则会发生相同的情况-消息已完成,但是运行时会引发错误。
我了解对消息进行死信的通常方法是在执行过程中引发异常,从而导致函数失败,然后重试消息。
我对这种方法的问题是有时消息是无法恢复的-尝试x次将不会产生其他结果。
我想.CompleteAsync();
发送消息的原因是要重试:
我可以:
.Clone();
原始的BrokeredMessage
ScheduledEnqueueTimeUtc
属性。 .CompleteAsync();
原始消息从技术上讲这是可行的,但是当完成超出预期流量的消息时,运行时仍会报告上述错误。
答案 0 :(得分:1)
问题在于运行时本身管理服务总线消息完成,成功调用后调用Complete
或在异常情况下调用Abandon
。
有一个feature request可以选择退出此类行为,并在Function内部手动管理完成。该修补程序已实现,我不确定它是否在当前的运行时中,但是文档尚未更新。
按照上述问题了解状态。