首页 > 解决方案 > 如何在自定义异常上对代理消息进行死信

问题描述

如果我遇到自定义异常,我需要将我的 BrokeredMessage 强制移动到死信队列。这是我用过的代码:

public static async Task Run([ServiceBusTrigger("myqueue", Connection = "myservicebus:cs")]BrokeredMessage myQueueItem, TraceWriter log)
{
    try
    {   
        // process message logic.. 
    }
    catch(CustomException ex)
    {
        //forcefully dead letter if custom exception occurs
        await myQueueItem.DeadLetterAsync();
    }           
}

但是,有时如果我在我的代码中显式调用等,即使锁实际上并没有丢失,我也会遇到MessageLockLost,异常。谁能建议我,将代理消息移动到 DeadLetter 队列以处理自定义异常的最佳方法是什么。谢谢。DeadLetterAsyncAbandonAsync()

标签: azureazure-functionsazureservicebusazure-servicebus-queues

解决方案


不完全是您想要的,而是一种创造性的解决方法:

将输出服务总线绑定添加到您的函数。代替死信的消息,在输出中添加一条新消息:

public static async Task Run(
    [ServiceBusTrigger("myqueue", Connection = "mysb")] BrokeredMessage myQueueItem, 
    [ServiceBus("mydlq", Connection = "mysb")] IAsyncCollector<BrokeredMessage> dlq, 
    TraceWriter log)
{
    try
    {   
        // process message logic.. 
    }
    catch(CustomException ex)
    {
        // forward to "DLQ" when exception occurs
        var dlqMessage = ...; // you need to create a new message here
        await dlq.AddAsync(dlqMessage);
    }           
}

原始消息将成功完成。

请注意,您需要创建一个新的BrokeredMessage并仔细复制原始消息中的所有数据和元数据。如果您没有元数据,最好将收集器的类型更改为简单的类型,例如IAsyncCollector<string>.


推荐阅读