如何故意使消息成为死信是 azure functions v2

How to intentionally deadletter a message is azure functions v2

这个问题与其他有答案的问题类似,但我认为 AF v2 的情况可能有所改变(我在没有 v1 经验的情况下跳入 v2)。貌似AF v2集成的用于与ServiceBus交互的程序集是Microsoft.Azure.ServiceBus,里面有个叫"Message"的class,和发现的"BrokeredMessage"不太一样在其他微软服务总线组件中。两者之间的一个关键区别是 BrokeredMessage(在几乎所有文档、示例和我能找到的任何其他线程中都引用了它)有一个 .Deadletter() 方法,而 Message 没有。当我无权访问接收消息的客户端或接收者时,如何故意使消息成为死信?

(我看到了有关仅克隆消息、放入我自己的 "dead letter" 队列并让 AF 提交原始消息的建议 - 我认为这不是一个合适的解决方案。)

我还没有在函数环境中证明这一点,但是根据我在github (https://github.com/Azure/azure-webjobs-sdk/issues/1986) 上打开的票证,webjobs v3 支持绑定接收它的 Message 和 MessageReceiver在函数触发器中,然后 MessageReceiver 可用于消息死信。

发现这个问题真的很痛苦,因为它仍然没有记录在案。 Azure SDK for .NET 项目自述文件中的 API 参考甚至指向来自旧命名空间的文档 ‍♂️

我不得不搜索源代码以找到获取 LockToken 的正确方法。

    [FunctionName("MyFunction")]
    public static async Task Run([ServiceBusTrigger("myqueue", Connection = "myconnectionstring")] Message message,
        ILogger log, MessageReceiver messageReceiver)
    {
        await messageReceiver.DeadLetterAsync(message.SystemProperties.LockToken);
    }

将MessageReceiver作为参数自动绑定,无需额外设置。