Когда вы клонируете сообщение, оно становится новым сообщением, это означает, что системные свойства не клонируются, что дает клонированному сообщению fre sh счетчик доставки, начиная с 1 снова. См. Также https://docs.azure.cn/zh-cn/dotnet/api/microsoft.azure.servicebus.message.clone?view=azure-dotnet
. Вы можете изучить функцию блокировки обзора служебной шины Azure. При использовании PeekLock сообщение становится невидимым в очереди до тех пор, пока вы явно не откажетесь от него (поместите его обратно в очередь с увеличенным счетчиком доставки) или не завершите, если все работает должным образом при обработке сообщения. Другой вариант - явно указать в этом сообщении мертвую букву.
Эта функция задокументирована здесь: https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock
Но важно то, что если вы не выполнять любое из вышеупомянутых действий, например клонирование Azure Service Bus автоматически сделает сообщение видимым снова после определенного интервала (свойство LockDuration) или когда вы отказываетесь от него.
Таким образом, чтобы получить отложенную повторную попытку и поведение мертвой буквы (когда максимальное количество доставок имеет достигнуто) вы можете использовать следующие параметры:
Вариант 1. Повторить попытку через Azure автоблокировка служебной шины
Если обработка сообщения не может быть выполнена на момент по какой-либо причине перехватить исключение и убедиться, что ни одно из упомянутых действий (отказ, завершение или мертвое письмо) не выполнено. Это сделает сообщение невидимым в течение оставшегося времени и сделает его снова видимым после достижения настроенного времени блокировки. И количество доставок также будет увеличено на Azure служебную шину, как и ожидалось.
Вариант 2. Реализуйте собственную политику повтора
Выполните собственную политику повтора в своем код и повторите обработку сообщения. Если достигнуто максимальное количество повторных попыток, откажитесь от сообщения, которое сделает его снова видимым для следующего шага чтения очереди после того, как будет достигнуто время повтора. В этом случае количество доставок также увеличивается.
Примечание : если вы выберете вариант 2.) убедитесь, что ваш период повтора соответствует определенному LockDuration, чтобы что ваше сообщение больше не будет отображаться в очереди, если вы все еще обрабатываете его с повторными попытками. Вы также можете возобновить блокировку между повторными попытками, вызвав метод RenewLock () в сообщении между повторными попытками.
Если вы реализуете политику повторных попыток в своем коде, я рекомендую использовать в Polly . Net, который уже предоставляет вам такие замечательные функции, как политики Retry и Circuit Breaker. См. https://github.com/App-vNext/Polly