Я получаю сообщения из темы/подписки служебной шины. 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;
}