【问题标题】:Azure table Storage continuationAzure 表存储续
【发布时间】:2015-03-13 09:08:18
【问题描述】:

因此,Microsoft 决定将诊断数据发送到 Azure 表存储。我正在尝试查询此存储并将其发送到另一个位置以通过 C# SDK 进行分析。我可以很好地查询数十万条记录,但似乎他们发送的最后一个延续令牌将始终收到空响应。即使更多数据被发送到表存储中,我的延续令牌也不起作用,仍然会得到一个空延续令牌和空数据。

有人做过这样的事吗?如果他们发送的继续令牌被破坏,我如何继续“同步”天蓝色表数据?

           public static List<PerfMonEntity> GetEventData(ref TableContinuationToken contToken)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
        CloudTable eventLogsTable = tableClient.GetTableReference("WADPerformanceCountersTable");
        TableQuery<PerfMonEntity> query = new TableQuery<PerfMonEntity>();

        var l = new List<PerfMonEntity>();
        var segment = eventLogsTable.ExecuteQuerySegmented(query, contToken ?? new TableContinuationToken());
        foreach (PerfMonEntity wadCounter in segment)
        {
            l.Add(wadCounter);
        }
        contToken = segment.ContinuationToken;

        if (contToken == null)
        {
            Console.WriteLine("contToken is NULL!");
            return null;
        }

        Console.WriteLine("partkey: {0}", contToken.NextPartitionKey ?? "");
        Console.WriteLine("rowkey: {0}", contToken.NextRowKey ?? "");

        return l;
    }

-=-=-=-=-=-

        while (num < loop)
        {
            List<PerfMonEntity> eleList = AzurePerfTable.GetEventData(ref contToken);
            if (eleList != null)
                returnedList.AddRange(eleList);
            else
                num = loop;
            num += 1;

            if (contToken != null)
                AZContinuationToken.SetContToken(contToken);

            Console.WriteLine("returnedlistsize: {0}", returnedList.Count<PerfMonEntity>());
        }

【问题讨论】:

    标签: c# azure-storage azure-table-storage azure-diagnostics azure-sdk-.net


    【解决方案1】:

    当没有更多数据要返回时,继续标记为空。当它不为空时,意味着在下一页中还有其他实体要返回。您可以检查 null 以确定您何时检索到最后一页,然后退出循环。

    尝试按照以下思路编写逻辑:

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
    
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
    
    CloudTable eventLogsTable = tableClient.GetTableReference("WADPerformanceCountersTable");
    TableQuery query = new TableQuery();
    
    Console.WriteLine("List perf counter results in pages:");
    
    TableContinuationToken token = null;
    
    do
    {
        var segment = eventLogsTable.ExecuteQuerySegmented(query, token, null, null);
    
        foreach (var wadCounter in segment)
        {
            Console.WriteLine(wadCounter.PartitionKey);
            Console.WriteLine(wadCounter.RowKey);
            Console.WriteLine(wadCounter.Timestamp);
        }
    
        token = segment.ContinuationToken;
    }
    while (token != null);
    

    【讨论】:

    • 购买一个如何从我们到达的地方重新启动到上次停止的地方? (例如 tail -f 行为?)
    • 我知道这已经很晚了,但是您可以像这样创建BlobContinuationToken 的新实例:BlobContinuationToken token = new BlobContinuationToken() { NextMarker = "[long_continuation_token_goes_here]" };。这将在那时开始您的请求并继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2018-12-04
    • 2014-03-29
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多