Azure functions 在Azure服务总线队列上重新提交消息时,Messagelock令牌已过期

Azure functions 在Azure服务总线队列上重新提交消息时,Messagelock令牌已过期,azure-functions,azureservicebus,azure-servicebus-queues,Azure Functions,Azureservicebus,Azure Servicebus Queues,我有一个Azure函数,它有以下简单代码: public class MyDequeuer { [FunctionName("SampleMessageExecutor")] public static async Task Run( [ServiceBusTrigger("test-queue", AccessRights.Listen, Connection = "Servi

我有一个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小时后转到死信队列并尝试修复并重新提交来自service bus explorer的消息时,我看到很多错误,说消息locktoken已过期。您应该如何处理这样一种情况:消息可能会以死信形式结束,并且可能会在数小时或数天后重新处理


我正在使用函数runtime dotnet core 3.1。

实际上,关于这个问题,github中存在一个问题:

首先,消息类没有
DeadLetterAsync
方法,对于v2或更高版本,您应该使用
MessageReceiver
来实现它

然后是关于锁定令牌,因为服务总线触发功能将自动完成消息,如果您想自己
死信异步
,它将导致异常。您需要更改host.json,将
autoComplete
更改为flase,您可以参考以下内容

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

        [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
      }
    }
  }

}

实际上,关于这个问题,github中存在一个问题:

首先,消息类没有
DeadLetterAsync
方法,对于v2或更高版本,您应该使用
MessageReceiver
来实现它

然后是关于锁定令牌,因为服务总线触发功能将自动完成消息,如果您想自己
死信异步
,它将导致异常。您需要更改host.json,将
autoComplete
更改为flase,您可以参考以下内容

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

        [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
      }
    }
  }

}

能否提供详细的错误描述?在我的情况下,消息不能调用DeadLetterAsync(locktoken)。因此,我添加了一个messageReceiver参数,并且在运行该函数时确实出现了很多错误。我想问的是,你现在面临的情况是什么?你能提供一个详细的错误描述吗?在我的情况下,消息不能调用DeadLetterAsync(locktoken)。因此,我添加了一个messageReceiver参数,并且在运行该函数时确实出现了很多错误。我想问的是,你现在面对的是这样的情况吗?