Маркер блокировки сообщения истек при повторной отправке сообщения в очередь Azure Шина обслуживания - PullRequest
0 голосов
/ 12 марта 2020

У меня есть функция Azure, которая имеет следующий простой код:

       public class MyDequeuer
        {
            [FunctionName("SampleMessageExecutor")]
            public static async Task Run(
                    [ServiceBusTrigger("test-queue", AccessRights.Listen, Connection = "ServiceBusConnectionString")]
                    Message inMessage, string locktoken, ILogger log, ExecutionContext ctx)
            { 
               try {
                  some code..
              } catch(Exception e) {
                await inMessage.DeadLetterAsync(locktoken);
              }
            }
}

Это прекрасно работает. Однако, когда я в какой-то момент позже говорю, может быть, через 1 ч или 24 ч позже go в очередь аварийного сообщения и пытаюсь восстановить и повторно отправить сообщение из обозревателя служебной шины, я вижу множество ошибок, говорящих о том, что истек срок блокировки сообщения. Как вы должны справиться со сценарием, в котором сообщения могут попасть в тупик и, возможно, обработаться часами или днями позже?

Я использую функцию времени выполнения do tnet core 3.1.

1 Ответ

1 голос
/ 12 марта 2020

На самом деле об этой проблеме есть проблема в github: Как преднамеренно обработать сообщение в azure functions v2 .

Во-первых, для класса Message нет метода DeadLetterAsync Для v2 или выше вы должны использовать MessageReceiver для его реализации.

Тогда речь идет о токене блокировки, потому что функция запуска служебной шины автоматически завершит сообщение и вызовет исключение, если вы захотите DeadLetterAsync самостоятельно. Вам нужно изменить хост. json, изменить autoComplete на flase, вы можете обратиться к этому хосту. json setting .

Ниже приведен мой код, throw исключение и DeadLetter.

        [FunctionName("Function1")]
        public static async System.Threading.Tasks.Task RunAsync([ServiceBusTrigger("myqueue",Connection = "ServiceBusConnectionString")]string myQueueItem, MessageReceiver messageReceiver, string lockToken, ILogger log)
        {

                try
                {
                    throw new Exception();
                }
                catch (Exception) { 
                    await messageReceiver.DeadLetterAsync(lockToken);
                    log.LogInformation(myQueueItem+ " is put into deadletter");
                }
        }

Вот мой хозяин. json.

{
  "version": "2.0",

  "extensions": {
    "serviceBus": {
      "prefetchCount": 100,
      "messageHandlerOptions": {
        "autoComplete": false,
        "maxConcurrentCalls": 32,
        "maxAutoRenewDuration": "00:55:00"
      },
      "sessionHandlerOptions": {
        "autoComplete": false,
        "messageWaitTimeout": "00:00:30",
        "maxAutoRenewDuration": "00:55:00",
        "maxConcurrentSessions": 16
      }
    }
  }

}

enter image description here

...