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

Calling .Complete or .DeadLetter on BrokeredMessage with Azure Functions ServiceBus triggered functions

我正在使用服务总线队列触发函数。

当我们手动(并且关键是立即)DeadLetter BrokeredMessage时,它确实进入了死信队列。
但是运行时报如下错误:

The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue

示例函数:

[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(); 重试消息的原因:
我可以:

这在技术上可行,但当完成消息超出预期流程时,运行时仍然报告上述错误。

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

有一个 feature request 可以选择退出此类行为并在函数内手动管理完成。修复已实施,我不确定它是否在当前运行时,但文档尚未更新。

按照上面的问题了解状态。