我有这个示例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吗?还是邮件租用时不起作用?
更新 我要使其正常工作的唯一方法是:
赞:
[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,我将接受答案(或者,如果有的话,请给我实际的代码,正确执行此操作)。我也在寻找自己。
答案 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
ReleaseMessageAsync调用UpdateMessageAsync,它具有从配置中提供的可见性超时(我认为-遍历webjobs-sdk时看起来像这样)。如果能见度超时以QueueTriggerAttributeBindingProvider.cs结尾,我的追踪。
因此,当我抛出异常时,关于主机运行时的假设似乎推翻了我的Update。