首页 > 解决方案 > 在 Azure 服务总线队列上重新提交消息时消息锁定令牌已过期

问题描述

我有一个 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 小时后进入死信队列并尝试修复并重新提交来自服务总线资源管理器的消息时,我会看到很多错误,表明消息锁定令牌已过期。您应该如何处理消息可能以死信告终并可能在数小时或数天后重新处理的情况?

我正在使用函数运行时 dotnet core 3.1。

标签: azure-functionsazureservicebusazure-servicebus-queues

解决方案


实际上,关于这个问题,github 中有一个问题:如何在 azure functions v2 中故意死信一条消息

首先,没有DeadLetterAsyncMessage 类的方法,您应该使用 v2 或更高版本MessageReceiver来实现它。

然后是关于锁定令牌,导致服务总线触发功能会自动完成消息,如果您想 DeadLetterAsync自己完成会导致异常。您需要更改host.json,将其更改autoComplete为flase,您可以参考此host.json设置

下面是我的代码,抛出异常和死信。

        [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");
                }
        }

这是我的host.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
      }
    }
  }

}

在此处输入图像描述


推荐阅读