是否有任何RetryPolicy在Azure SDK中自动处理延续令牌?

时间:2012-02-23 10:03:13

标签: azure-storage

对于查询,有时我会得到延续令牌,我想知道是否有任何针对RetryPolicy的{​​{1}}设置来自动处理令牌。

2 个答案:

答案 0 :(得分:3)

您不需要使用RetryPolicy。有两种选择:

在查询中使用.AsTableServiceQuery()。这会将您的查询转换为CloudTableQuery<>对象,本机处理继续令牌。这是最简单的路线。例如:

var query = (from r in Rows
             where r.PartitionKey == "whatever"
             select r).AsTableServiceQuery();

否则你可以使用Begin / EndExecuteSegmented()并自己处理令牌。

关于CloudTableQuery的澄清<>

对CloudTableQuery<>的行为有一个斜向的引用在Scott Densmore's blog。但是,我还将以下相当混乱的代码汇总在一起来证明这一点。测试通过,它确实使用continuation tokens来检索所有插入的实体。如果您使用HTTP,您可以使用Fiddler观看它并查看令牌来回。

        [Test, Explicit]
        public void WriteAndReadALotOfRows()
        {
            CloudStorageAccount acct = CloudStorageAccount.Parse("PUT IN SOME CREDS HERE");
            TableServiceContext ctx = null;
            List<TestEntity> testEntities = new List<TestEntity>(2000);

            acct.CreateCloudTableClient().CreateTableIfNotExist("Test");

            //Create entities
            for (int i = 0; i < 2000; i++)
            {
                if (i % 100 == 0)
                {
                    if (ctx != null)
                    {
                        ctx.SaveChangesWithRetries(SaveChangesOptions.Batch);
                    }

                    ctx = new TableServiceContext(acct.TableEndpoint.AbsoluteUri, acct.Credentials);
                }
                TestEntity entity = new TestEntity(i);
                testEntities.Add(entity);
                ctx.AddObject("Test", entity);
            }

            ctx.SaveChangesWithRetries(SaveChangesOptions.Batch);

            ctx = new TableServiceContext(acct.TableEndpoint.AbsoluteUri, acct.Credentials);

            List<TestEntity> retrievedEntities = (from r in ctx.CreateQuery<TestEntity>("Test")
                                                  select r).AsTableServiceQuery().ToList();

            Assert.AreEqual(testEntities.Count, retrievedEntities.Count);
            Console.Out.WriteLine(retrievedEntities.Count); //prints 2000

            foreach (var insertedEntity in testEntities)
            {
                TestEntity retrievedEntity = retrievedEntities.First(r => r.RowKey == insertedEntity.RowKey);
                Assert.NotNull(retrievedEntity);
            }
        }

        public class TestEntity : TableServiceEntity
        {
            public TestEntity()
            {
            }

            public TestEntity(int id)
                : base("Test", id.ToString())
            {

            }
        }

答案 1 :(得分:1)

在其提及的文字中查看http://blogs.msdn.com/b/windowsazurestorage/archive/2010/07/09/understanding-windows-azure-storage-billing-bandwidth-transactions-and-capacity.aspx

  

表查询 - 当您使用CloudTableQuery进行查询时,它会处理   处理继续令牌,所以它使用。重新发出查询   获取的先前查询请求中收到的延续令牌   剩下的实体。如上所述,每次重新发布延续   对服务的令牌查询计为1个事务。

http://blogs.msdn.com/b/jimoneil/archive/2010/10/05/azure-home-part-7-asynchronous-table-storage-pagination.aspxhttp://scottdensmore.typepad.com/blog/2010/04/paging-with-windows-azure-table-storage.html