【发布时间】:2019-03-04 09:40:34
【问题描述】:
我尝试在插入/更新 CosmosDB 文档时更新 Azure Functions 中的文档。
但是,当我在函数内更新文档时,该函数再次被触发并导致无限循环。
private static DocumentClient _documentClient = new DocumentClient(new Uri(serviceEndpoint), key);
[FunctionName(nameof(MyFunction))]
public static async Task RunAsync([CosmosDBTrigger(
databaseName: "MyDatabase",
collectionName: "MyCollection",
ConnectionStringSetting = "MyDbConnectionString",
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true,
LeaseCollectionPrefix = nameof(MyFunction))]IReadOnlyList<Document> input,
ILogger log)
{
var replacementsTasks = new List<Task>();
foreach (var item in input)
{
item.SetPropertyValue("Updated", true);
replacementsTasks.Add(_documentClient.ReplaceDocumentAsync(item));
}
await Task.WhenAll(replacementsTasks);
}
如何防止这种情况发生?我可以将 CosmosDB 输出结果与触发器中的已修改文档一起使用吗?
更新 1
我不想使用其他集合。这将使 CosmosDB 的价格翻倍。我使用 CosmosDB 输入和输出尝试了以下操作。但是,我得到了相同的结果。无限循环。
[FunctionName(nameof(DownloadImages))]
public static void Run(
[CosmosDBTrigger(
databaseName: database,
collectionName: collection,
ConnectionStringSetting = connectionStringName,
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true,
LeaseCollectionPrefix = nameof(MyFunction))]IReadOnlyList<Document> input,
[CosmosDB(database, collection, Id = "id", ConnectionStringSetting = connectionStringName)] out dynamic document,
ILogger log)
{
if(input.Count != 1) throw new ArgumentException();
document = input.Single();
document.myValue = true;
}
【问题讨论】:
-
您可以创建一个跨容器共享 RU 的数据库。
标签: c# azure azure-functions azure-cosmosdb infinite-loop