Есть ли RetryPolicy для автоматической обработки маркера продолжения в Azure SDK? - PullRequest
1 голос
/ 23 февраля 2012

Для запроса иногда я получаю токен продолжения, мне интересно, есть ли какие-либо настройки RetryPolicy против TableServiceContext для автоматической обработки токена.

Ответы [ 2 ]

3 голосов
/ 24 февраля 2012

Вам не нужно использовать RetryPolicy для этого. Есть два варианта:

Используйте .AsTableServiceQuery () в своих запросах. Это преобразует ваш запрос в объект CloudTableQuery <>, который изначально обрабатывает токены продолжения. Это самый простой маршрут. например:

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

В противном случае вы можете использовать Begin / EndExecuteSegmented () и обрабатывать токены самостоятельно.

Разъяснение по CloudTableQuery <>

В блоге Скотта Денсмора есть косвенная ссылка на поведение CloudTableQuery <>. Но я также собрал следующий, довольно грязный код, чтобы доказать это. Тесты проходят, и он использует токены продолжения для извлечения всех вставленных сущностей. Если вы используете 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 голос
/ 26 февраля 2012

извлечение 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.aspx и http://scottdensmore.typepad.com/blog/2010/04/paging-with-windows-azure-table-storage.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...