如何在服务总线队列触发功能中将服务总线消息移动到死信
Posted
技术标签:
【中文标题】如何在服务总线队列触发功能中将服务总线消息移动到死信【英文标题】:How to move a service bus messge to deadletter in service bus queue trigger function 【发布时间】:2020-07-26 05:09:10 【问题描述】:如何通过服务总线队列触发函数将服务总线队列消息移动到死信
【问题讨论】:
【参考方案1】:我还没有尝试过,但是您可以将队列上的MaxDeliveryCount
属性设置为1
,然后在触发时立即在函数中抛出异常。这样消息的传递计数将增加 1,并且服务总线将自动死信消息。
【讨论】:
【参考方案2】:通过在 Azure 门户中创建 Azure 函数触发器来读取死信队列消息。在函数中,提供 DLQ 的名称为“QueueName/$DeadLetterQueue”,如下图所示
注意:如果你想从Topic中访问未投递的消息,那么读取死信队列的语法是“TopicName/Subscriptions/SubscriptionName/$DeadLetterQueue”。
现在,定义应该如何处理 DLQ 消息。在这里,如下图所示,我们使用 Azure 服务总线将“myqueue”的 DLQ 消息发送到名为“queue”的 Topic
通过这种方式,我们可以使用 Azure Functions 非常轻松地根据需要处理 DLQ 消息。
【讨论】:
我相信问题不在于从 DLQ 读取消息,而是将它们发送到 DLQ。【参考方案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
【讨论】:
任何java例子? 不幸的是,仅适用于 C#。 docs.microsoft.com/en-us/azure/azure-functions/… 有效,但弹出错误"消息处理错误(Action=Complete)。提供的锁无效。要么锁已过期,要么消息已从队列中删除,或者被不同的接收器实例接收。” 不确定,但对我来说,Azure Function 似乎仍在尝试完成/放弃已经死信且不再在队列中的消息。就像它对我在函数内部手动处理消息一无所知。 您需要在执行此操作时将AutoComplete
设置为false。 docs.microsoft.com/en-us/azure/azure-functions/…
谢谢!不得不将Microsoft.Azure.WebJobs.Extensions.ServiceBus
包改为4.3.0
,因为AutoComplete
属性最近才可用。它现在完美无缺,非常感谢。无疑为我节省了数小时的搜索时间。以上是关于如何在服务总线队列触发功能中将服务总线消息移动到死信的主要内容,如果未能解决你的问题,请参考以下文章