使用 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();
重试消息的原因:
我可以:
.Clone();
原BrokeredMessage
- 设置为
ScheduledEnqueueTimeUtc
属性。
.CompleteAsync();
原帖
- 将克隆的消息放回队列(通过输出绑定)
这在技术上可行,但当完成消息超出预期流程时,运行时仍然报告上述错误。
问题在于运行时管理服务总线消息完成本身,在成功调用后调用 Complete
或在异常情况下调用 Abandon
。
有一个 feature request 可以选择退出此类行为并在函数内手动管理完成。修复已实施,我不确定它是否在当前运行时,但文档尚未更新。
按照上面的问题了解状态。
我正在使用服务总线队列触发函数。
当我们手动(并且关键是立即)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();
重试消息的原因:
我可以:
.Clone();
原BrokeredMessage
- 设置为
ScheduledEnqueueTimeUtc
属性。 .CompleteAsync();
原帖- 将克隆的消息放回队列(通过输出绑定)
这在技术上可行,但当完成消息超出预期流程时,运行时仍然报告上述错误。
问题在于运行时管理服务总线消息完成本身,在成功调用后调用 Complete
或在异常情况下调用 Abandon
。
有一个 feature request 可以选择退出此类行为并在函数内手动管理完成。修复已实施,我不确定它是否在当前运行时,但文档尚未更新。
按照上面的问题了解状态。