UpdateMessageAsync不更新可见性超时

时间:2019-04-21 14:48:48

标签: c# azure-functions

我有这个示例Azure函数

    [FunctionName("WorkerFunctions")]
    public static async Task Run(
        [QueueTrigger("outputQueue")]
        CloudQueueMessage item,
        [Queue("outputQueue")]
        CloudQueue outputQueue,
        DateTimeOffset nextVisibleTime,
        DateTimeOffset expirationTime,
        DateTimeOffset insertionTime,
        ILogger log)
    {
        log.LogInformation($"NextVisibleTime: {nextVisibleTime}");
        log.LogInformation($"NextVisibleTime: {(nextVisibleTime-insertionTime).TotalSeconds}");
        log.LogInformation($"C# Queue trigger function processed: {item.AsString}");
        await outputQueue.UpdateMessageAsync(item,  TimeSpan.FromSeconds(60), MessageUpdateFields.Visibility);
        throw new Exception();
    }
由该主机文件支持的

{
  "version": "2.0",
  "extensions": {
    "queues": {
      "maxPollingInterval": "00:00:02",
      "visibilityTimeout": "00:00:10",
      "batchSize": 16,
      "maxDequeueCount": 5,
      "newBatchThreshold": 8
    }
  }
}

但是可见性超时不会更新为1分钟,而是默认为主机文件中的10秒。

我误解了UpdateMessageAsync吗?还是邮件租用时不起作用?

更新 我要使其正常工作的唯一方法是:

  1. 删除邮件
  2. 使用更新的超时时间再次添加消息

赞:

   [FunctionName("WorkerFunction3")]
    public static async Task Function3(
        [QueueTrigger("outputQueue")]
        CloudQueueMessage item,
        [Queue("outputQueue")]
        CloudQueue outputQueue,
        DateTimeOffset nextVisibleTime,
        DateTimeOffset expirationTime,
        DateTimeOffset insertionTime,
        int dequeueCount,
        ILogger log)
    {
        log.LogInformation("########## Function 3 ###############");
        log.LogInformation($"NextVisibleTime: {nextVisibleTime}");
        log.LogInformation($"DequeueCount {dequeueCount}");
        log.LogInformation($"NextVisibleTime: {(nextVisibleTime - insertionTime).TotalSeconds}");
        log.LogInformation($"C# Queue trigger function processed: {item.AsString}");

        item.SetMessageContent(item.AsString + " updated");

        try
        {
            throw new Exception();
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            await outputQueue.DeleteMessageAsync(item);
            await outputQueue.AddMessageAsync(
                new CloudQueueMessage(item.AsString),
                null, TimeSpan.FromSeconds(60),
                null,
                null);
        }
    }

.NET和.NET Core都是如此。

我已经尝试了上面的方法,得到一条消息,然后使用一个简单的控制台程序调用Update:

class Program
{
    static void Main(string[] args)
    {
        MainAsync(args).GetAwaiter().GetResult();
    }

    static async Task MainAsync(string[] args)
    {
        var storageCredentials = new StorageCredentials();
        var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
        CloudQueueClient client = storageAccount.CreateCloudQueueClient();

        var queue = client.GetQueueReference("outputqueue");

        var message = await queue.GetMessageAsync();

        if (message != null)
        {
            Console.WriteLine(message.NextVisibleTime);
            await queue.UpdateMessageAsync(message, TimeSpan.FromMinutes(10), MessageUpdateFields.Visibility);
        }
    }
}

此处超时已正确更新。

所有这些气味都像Azure Functions的主机在引发异常后调用update一样,在我看来,这听起来确实不错。

如果任何人都可以将我指向此处发生的代码:https://github.com/Azure/azure-functions-host,我将接受答案(或者,如果有的话,请给我实际的代码,正确执行此操作)。我也在寻找自己。

2 个答案:

答案 0 :(得分:0)

函数运行时为v2时,CloudQueue.UpdateMessageAsync方法适用于.Net

答案 1 :(得分:0)

自从Azure函数运行时起,https://github.com/Azure/azure-functions-host“建立在久经考验的真实Azure WebJobs SDK之上-该库仅位于顶层,以使您可以“编写WebJobs SDK脚本””:https://github.com/Azure/azure-webjobs-sdk。如果我搜索源代码,可以看到以下调用层次结构:

QueueProcessor-https://github.com/Azure/azure-webjobs-sdk/blob/dev/src/Microsoft.Azure.WebJobs.Extensions.Storage/Queues/QueueProcessor.cs#L111

  1. CompleteProcessingMessageAsync-https://github.com/Azure/azure-webjobs-sdk/blob/247a36226a4c1bab445def921d3fb2806c8718b7/src/Microsoft.Azure.WebJobs.Extensions.Storage/Queues/QueueProcessor.cs#L111
  2. 如果成功:DeleteMessageAsync
  3. 否则,ReleaseMessageAsync:https://github.com/Azure/azure-webjobs-sdk/blob/247a36226a4c1bab445def921d3fb2806c8718b7/src/Microsoft.Azure.WebJobs.Extensions.Storage/Queues/QueueProcessor.cs#L180

ReleaseMessageAsync调用UpdateMessageAsync,它具有从配置中提供的可见性超时(我认为-遍历webjobs-sdk时看起来像这样)。如果能见度超时以QueueTriggerAttributeBindingProvider.cs结尾,我的追踪。

因此,当我抛出异常时,关于主机运行时的假设似乎推翻了我的Update。