问题描述
我正在使用来自服务总线主题/订阅的消息。 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;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)