如果我有自定义异常,我需要强行将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队列以处理自定义异常的最佳方法是什么。
感谢。
答案 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>
之类的简单。