Azure 如何处理;指定的资源不存在";使用实体组事务清除WADLogs表时出现异常
我们需要定期清除Azure WADLogs表。我们通过使用实体组事务删除超过15天的记录来实现这一点。逻辑是这样的Azure 如何处理;指定的资源不存在";使用实体组事务清除WADLogs表时出现异常,azure,azure-storage,azure-table-storage,Azure,Azure Storage,Azure Table Storage,我们需要定期清除Azure WADLogs表。我们通过使用实体组事务删除超过15天的记录来实现这一点。逻辑是这样的 bool recordDoesNotExistExceptionOccured = false; CloudTable wadLogsTable = tableClient.GetTableReference(WADLogsTableName); partitionKey = "0" + DateTime.UtcNow.AddDays(noOfDays).Ticks; Table
bool recordDoesNotExistExceptionOccured = false;
CloudTable wadLogsTable = tableClient.GetTableReference(WADLogsTableName);
partitionKey = "0" + DateTime.UtcNow.AddDays(noOfDays).Ticks;
TableQuery<WadLogsEntity> buildQuery = new TableQuery<WadLogsEntity>().Where(
TableQuery.GenerateFilterCondition("PartitionKey",
QueryComparisons.LessThanOrEqual, partitionKey));
while (!recordDoesNotExistExceptionOccured)
{
IEnumerable<WadLogsEntity> result = wadLogsTable.ExecuteQuery(buildQuery).Take(1000);
//// Batch entity delete.
if (result != null && result.Count() > 0)
{
Dictionary<string, TableBatchOperation> batches = new Dictionary<string, TableBatchOperation>();
foreach (var entity in result)
{
TableOperation tableOperation = TableOperation.Delete(entity);
if (!batches.ContainsKey(entity.PartitionKey))
{
batches.Add(entity.PartitionKey, new TableBatchOperation());
}
// A Batch Operation allows a maximum 100 entities in the batch which must share the same PartitionKey.
if (batches[entity.PartitionKey].Count < 100)
{
batches[entity.PartitionKey].Add(tableOperation);
}
}
// Execute batches.
foreach (var batch in batches.Values)
{
try
{
await wadLogsTable.ExecuteBatchAsync(batch);
}
catch (Exception exception)
{
// Log exception here.
// Set flag.
if (exception.Message.Contains(ResourceDoesNotExist))
{
recordDoesNotExistExceptionOccured = true;
}
break;
}
}
}
else
{
break;
}
}
bool recordDoesNotExistExceptionOccured=false;
CloudTable wadLogsTable=tableClient.GetTableReference(WADLogsTableName);
partitionKey=“0”+DateTime.UtcNow.AddDays(noOfDays).Ticks;
TableQuery buildQuery=新建TableQuery()。其中(
TableQuery.GenerateFilterCondition(“PartitionKey”,
QueryComparisons.LessThanOrEqual,partitionKey));
而(!RecordDoesNotExistException发生)
{
IEnumerable result=wadLogsTable.ExecuteQuery(buildQuery).Take(1000);
////批处理实体删除。
if(result!=null&&result.Count()>0)
{
字典批处理=新建字典();
foreach(结果中的var实体)
{
TableOperation TableOperation=TableOperation.Delete(实体);
如果(!batches.ContainsKey(entity.PartitionKey))
{
batches.Add(entity.PartitionKey,new TableBatchOperation());
}
//批处理操作允许批处理中最多有100个实体共享同一分区密钥。
if(批处理[entity.PartitionKey].Count<100)
{
批次[entity.PartitionKey].Add(tableOperation);
}
}
//执行批处理。
foreach(批处理中的var批处理。值)
{
尝试
{
等待wadLogsTable.ExecuteBatchAsync(批处理);
}
捕获(异常)
{
//这里记录异常。
//设置标志。
if(exception.Message.Contains(ResourceDoesNotExist))
{
recordDoesNotExistExceptionOccured=true;
}
打破
}
}
}
其他的
{
打破
}
}
我的问题是:
如果您将实际代码放在问题中而不是屏幕截图中,这会有所帮助。通过这种方式复制/粘贴变得更容易:P.@Gaurav:我避免了代码,因为它删除了缩进:)。这需要时间,但我已经用代码替换了图像。谢谢,谢谢你回答艾米丽。我同意你的建议。唯一的问题是,在第3点,如果有100多个条目具有相同的分区键,那么由于代码处于while循环中,查询将返回其余条目,这些条目最终将以100个为一批删除。此外,在例外情况下,索引始终为0。因此,我猜测在多个实例的情况下会发生这种情况。我想我必须有一个策略来避免这个场景中的重叠。我刚刚验证过,即使只有一个worker实例,也会发生异常。我猜出现这种异常是因为部署角色时,没有超过15天的记录。有什么方法可以避免这个异常吗?我认为忽略这个异常很好。对于#3,我应该澄清,这样做会更有效,以避免重新查询相同的内容,但正如您所说,在当前的设计中,这不是一个问题。我将编辑我的回复以反映这一点。关于#2,我相信