azure - 如何在自定义异常上对代理消息进行死信
问题描述
如果我遇到自定义异常,我需要将我的 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 队列以处理自定义异常的最佳方法是什么。谢谢。DeadLetterAsync
AbandonAsync()
解决方案
不完全是您想要的,而是一种创造性的解决方法:
将输出服务总线绑定添加到您的函数。代替死信的消息,在输出中添加一条新消息:
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>
.
推荐阅读
- react-native - 用文本反应原生相机图像
- c - 确保 scanf 只读取 dd.mm.yyyy
- ambari - 卡住 HDP 添加主机
- html - 如何将上滑和下滑动画添加到可变高度 div?
- angular - Angular SwPush 是否会覆盖 Firebase Cloud Messaging sdk 方法使其过时?
- erlang - 如何监督 Erlang VM 上的新 GenServer 进行热升级?
- node.js - 运行 ng test 时在项目中找不到配置
- node.js - 如何在 Redhat linux 机器上从 tar.xz 文件安装 nodejs?
- python - Tensorflow 将 3D 张量乘以 2D 矩阵
- python - 无法删除 [Unnamed:0] 和 NaN 字段数据