Bu kılavuzda, takvim verilerinin "artımlı senkronizasyonunun" nasıl uygulanacağı açıklanmaktadır. Bu yöntemi kullanarak bant genişliğini kaydederken tüm takvim koleksiyonlarına ait verileri senkronize halde tutabilirsiniz.
İçindekiler
Genel bakış
Artımlı senkronizasyon iki aşamadan oluşur:
İstemcinin durumunu sunucunun durumuyla tam olarak senkronize etmek için ilk tam senkronizasyon en başta bir kez gerçekleştirilir. İstemci, devam etmesi gereken bir senkronizasyon jetonu alır.
Artımlı senkronizasyon tekrar tekrar gerçekleştirilir ve istemciyi bir önceki senkronizasyondan bu yana gerçekleşen tüm değişikliklerle günceller. Her seferinde istemci, sunucudan aldığı bir önceki senkronizasyon jetonunu sağlar ve yanıttaki yeni senkronizasyon jetonunu depolar.
İlk tam senkronizasyon
İlk tam senkronizasyon, senkronize etmek istediğiniz koleksiyonun tüm kaynaklarına yönelik orijinal istektir. Yalnızca belirli bir kaynak alt kümesini senkronize etmek istiyorsanız istek parametrelerini kullanarak liste isteğini isteğe bağlı olarak kısıtlayabilirsiniz.
Liste işlemine verilen yanıtta, senkronizasyon jetonunu temsil eden nextSyncToken
adlı bir alan görürsünüz. nextSyncToken
değerini depolamanız gerekiyor. Sonuç kümesi çok büyükse ve yanıt sayfalara ayrılırsa nextSyncToken
alanı yalnızca en son sayfada bulunur.
Artımlı senkronizasyon
Artımlı senkronizasyon, son senkronizasyon isteğinden bu yana değiştirilen tüm kaynakları almanıza olanak tanır. Bunu yapmak için syncToken
alanında belirtilen en son senkronizasyon jetonunuzu kullanarak bir liste isteği gerçekleştirmeniz gerekir.
Sonucun her zaman silinen girişleri içereceğini unutmayın. Böylece istemciler bunları depolama alanından kaldırma fırsatı elde eder.
Son ek senkronizasyon isteğinden bu yana çok sayıda kaynağın değiştiği durumlarda, liste sonucunda syncToken
yerine bir pageToken
görebilirsiniz. Bu gibi durumlarda, artımlı senkronizasyonda ilk sayfayı getirmek için kullanılan liste sorgusunun aynısını (tam olarak aynı syncToken
ile) uygulamanız, pageToken
öğesini buna eklemeniz ve son sayfada başka bir syncToken
bulana kadar aşağıdaki tüm istekleri sayfalara ayırmanız gerekir. Gelecekteki bir sonraki senkronizasyon isteği için bu syncToken
öğesini kaydettiğinizden emin olun.
Aşağıda, sayfalara ayrılmış senkronizasyon gerektiren bir destek kaydıyla ilgili örnek sorgular verilmiştir:
Orijinal sorgu
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
// Result contains the following
"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",
Sonraki sayfayı alma
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
Sunucu için tam senkronizasyon gerekiyor
Bazen senkronizasyon jetonları, jetonun süresinin dolması veya ilgili EKL'lerdeki değişiklikler gibi çeşitli nedenlerle sunucu tarafından geçersiz kılınır.
Bu gibi durumlarda, sunucu artımlı isteğe bir yanıt kodu 410
ile yanıt verir. Bu işlem, müşterinin mağazasını tamamen temizlemeyi ve yeni bir tam senkronizasyonu tetikler.
Örnek kod
Aşağıdaki örnek kod snippet'inde, Java istemci kitaplığı ile senkronizasyon jetonlarının nasıl kullanılacağı gösterilmektedir. Çalıştırma yöntemi ilk kez çağrıldığında tam bir senkronizasyon gerçekleştirir ve senkronizasyon jetonunu depolar. Sonraki her yürütmede kayıtlı senkronizasyon jetonu yüklenir ve artımlı bir senkronizasyon gerçekleştirir.
private static void run() throws IOException { // Construct the {@link Calendar.Events.List} request, but don't execute it yet. Calendar.Events.List request = client.events().list("primary"); // Load the sync token stored from the last execution, if any. String syncToken = syncSettingsDataStore.get(SYNC_TOKEN_KEY); if (syncToken == null) { System.out.println("Performing full sync."); // Set the filters you want to use during the full sync. Sync tokens aren't compatible with // most filters, but you may want to limit your full sync to only a certain date range. // In this example we are only syncing events up to a year old. Date oneYearAgo = Utils.getRelativeDate(java.util.Calendar.YEAR, -1); request.setTimeMin(new DateTime(oneYearAgo, TimeZone.getTimeZone("UTC"))); } else { System.out.println("Performing incremental sync."); request.setSyncToken(syncToken); } // Retrieve the events, one page at a time. String pageToken = null; Events events = null; do { request.setPageToken(pageToken); try { events = request.execute(); } catch (GoogleJsonResponseException e) { if (e.getStatusCode() == 410) { // A 410 status code, "Gone", indicates that the sync token is invalid. System.out.println("Invalid sync token, clearing event store and re-syncing."); syncSettingsDataStore.delete(SYNC_TOKEN_KEY); eventDataStore.clear(); run(); } else { throw e; } } List<Event> items = events.getItems(); if (items.size() == 0) { System.out.println("No new events to sync."); } else { for (Event event : items) { syncEvent(event); } } pageToken = events.getNextPageToken(); } while (pageToken != null); // Store the sync token from the last request to be used during the next execution. syncSettingsDataStore.set(SYNC_TOKEN_KEY, events.getNextSyncToken()); System.out.println("Sync complete."); }
Eski senkronizasyon
Etkinlik koleksiyonlarında, güncellenen alanın değerini etkinlik listesi isteğinden koruyarak ve ardından güncellenmiş etkinlikleri almak için modifiedSince
alanını kullanarak eski yöntemle senkronizasyon gerçekleştirilebilir.
Bu yaklaşım, kaçırılan güncellemeler söz konusu olduğunda hataya daha açık olduğundan (örneğin, sorgu kısıtlamaları uygulanmıyorsa) artık önerilmez.
Ayrıca, yalnızca etkinlikler için kullanılabilir.