c# - 如何避免消息进入“deadletter”队列 azure 服务总线
问题描述
我正在使用来自服务总线主题/订阅的消息。将ProcessMessage
消息添加到一个容量有界队列(一次不超过 200 条消息)。一旦完成了一条消息处理,我就完成了CompleteAsync
,只有在ProcessMessage
给时true
。
现在,如果发生一些异常,例如队列已满且未准备好接收任何新消息,那么我将生成异常并ProcessMessage
给出false
. 在这种情况下_subscriptionClient.CompleteAsync
没有调用,但消息将deadletter
排队。
如何防止这种情况?消息不应该进入deadletter
队列,它应该等待某个时间来处理?
注意 - 我AbandonAsync
根据评论建议添加了逻辑,但消息仍然会死信并且不会重新出现在主题订阅中。请建议!
最大交付计数 = 5,已尝试 5 次,然后移至死信
_subscriptionClient = new SubscriptionClient(connectionString, topicName, subscriptionName);
_subscriptionClient.RegisterMessageHandler(
async (message, token) =>
{
if (await ProcessMessage(message, token))
{
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}
else
{
await _subscriptionClient.AbandonAsync(message.SystemProperties.LockToken);
}
},
new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 1, AutoComplete = false });
private async Task<bool> ProcessMessage(Message message, CancellationToken token)
{
var processed = false;
try
{
//adding message to queue for further process
processed = true;
}
catch
{
//in case queue is full, generating exception and return false
processed = false;
}
return processed;
}
解决方案
我的理解是,如果未处理/未完成,您会希望消息进入死信状态。
每当一条消息已交付给客户端 - 但由于任何原因尚未完成 - 该消息的交付计数将自动增加 1。当传递计数与 MaxDeliveryCount 的计数匹配时 - 消息将自动移至死信队列。
话虽如此,在达到特定消息的最大传递计数时,没有办法在不增加传递或禁用消息移动到死信队列的情况下传递消息。
话虽如此,可能有两种可能的解决方案可以与您的要求非常匹配:
- 有一个非常大的 MaxDelivery Count。
- 使用死信队列中的消息 - 将数据重新发送到队列 - 这在您的场景中可能没有用。但只是想将其添加为建议-以防万一。
推荐阅读
- android - 应用程序未在 Android 4.4 和 5.1 上运行
- python-asyncio - 在运行 aiohttp 循环之前创建数据库连接
- javascript - 通过 selenium 驱动程序单击带有 javascript 的 html 元素不会触发
- bash - awk 和 bash:意外标记 `(' 附近的语法错误
- r - 将 r 基图分配给一个值
- php - 尽管使用了有效的密钥,Gnupg 仍给出“get_key failed”
- java - Maven 在本地机器上构建 Spring Boot 而不是 EC2 实例:UnsatisfiedDependencyException
- html - 为什么“关于我们”和“联系我们”之间有空格?
- django - Django:如何存储来自不同设备的同一用户的多次登录信息
- python - Python中的异步和线程