如何死亡关于自定义异常的代理消息

时间:2018-05-07 18:34:02

标签: azure azure-functions azureservicebus azure-servicebus-queues

如果我有自定义异常,我需要强行将BrokeredMessage移动到deadletter queue。 这是我用过的代码:

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,DeadLetterAsync等,我会收到AbandonAsync()个例外,即使锁实际上没有丢失。 任何人都可以建议我,将代理消息移动到DeadLetter队列以处理自定义异常的最佳方法是什么。 感谢。

1 个答案:

答案 0 :(得分:0)

不完全符合您的要求,但却是一种创造性的解决方法:

为您的函数添加输出Service Bus绑定。代替消息中的消息,在输出中添加一条新消息:

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>之类的简单。