使用Azure函数ServiceBus触发的函数在BrokeredMessage上调用.Complete或.DeadLetter

时间:2018-08-16 15:58:27

标签: azure-functions azureservicebus azure-servicebus-topics

我正在使用服务总线队列触发功能。

当我们手动(立即紧急)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();原始消息
  • 将克隆的消息放回队列中(通过输出绑定)

从技术上讲这是可行的,但是当完成超出预期流量的消息时,运行时仍会报告上述错误。

1 个答案:

答案 0 :(得分:1)

问题在于运行时本身管理服务总线消息完成,成功调用后调用Complete或在异常情况下调用Abandon

有一个feature request可以选择退出此类行为,并在Function内部手动管理完成。该修补程序已实现,我不确定它是否在当前的运行时中,但是文档尚未更新。

按照上述问题了解状态。