[英]How to avoid message going to `deadletter` queue azure service bus
我正在使用来自服务总线主题/订阅的消息。 ProcessMessage
将消息添加到一个容量有界队列(一次不超过 200 条消息)。 完成一条消息处理后,我将其ProcessMessage
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 的计数匹配时 - 消息将自动移至死信队列。
话虽如此,在达到特定消息的最大传递计数时,无法在不增加传递或禁用消息到死信队列的移动的情况下传递消息。
话虽如此,可能有两种可能的解决方案可以非常符合您的要求:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.