我们如何通过服务总线队列触发函数将服务总线队列消息移动到死信
3 回答
https://github.com/Azure/azure-webjobs-sdk/issues/1986#issuecomment-433960534
在 v3 中,您可以绑定到 MessageReceiver 类,该类公开了 DeadLetter、Abaondon、Complete 等方法。示例:
public static async Task ProcessMessage( [ServiceBusTrigger("myqueue")] string message, int deliveryCount, MessageReceiver messageReceiver, string lockToken) { . . . await messageReceiver.DeadLetterAsync(lockToken); . . . }
在此示例中,消息被绑定为字符串,并且包括 lockToken 在内的各种消息属性被绑定为参数。您还可以将消息绑定为消息类型并从那里访问必要的消息属性。在 v2 中,ServiceBus SDK 直接在 BrokeredMessage 类本身上公开了这些消息方法,但在最新版本的 SDK 中,这些方法不再存在,这意味着您必须绑定到 MessageReceiver 才能访问它们。
编辑您还需要AutoComplete
在执行此操作时设置为 false。https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=csharp#configuration
我还没有尝试过,但是您可以做的是将MaxDeliveryCount
队列上的属性设置为1
,然后在触发时立即在函数中抛出异常。这样,消息的传递计数将增加 1,并且服务总线将自动对消息进行死信。
通过在 Azure 门户中创建 Azure 函数触发器来读取死信队列消息。在函数中,提供 DLQ 的名称为“QueueName/$DeadLetterQueue”,如下图所示
注意:如果你想从 Topic 访问未传递的消息,那么读取死信队列的语法将是“TopicName/Subscriptions/SubscriptionName/$DeadLetterQueue”。
现在,定义应该如何处理 DLQ 消息。在这里,如下图所示,我们使用 Azure 服务总线将“myqueue”的 DLQ 消息发送到名为“queue”的 Topic
通过这种方式,我们可以使用 Azure Functions 非常轻松地根据需要处理 DLQ 消息。