Bu kılavuzda, takvim verilerinin artımlı senkronizasyonunun nasıl uygulanacağı açıklanmaktadır. Bu yöntemi kullanarak, bant genişliğinden tasarruf ederken tüm takvim koleksiyonlarındaki verileri senkronize edebilirsiniz.
İçindekiler
Genel Bakış
Artımlı senkronizasyon iki aşamadan oluşur:
İlk tam senkronizasyon: İstemci durumunu sunucu durumuyla tam olarak senkronize etmek için başlangıçta bir kez gerçekleştirilir. İstemci, kalıcı hale getirmesi gereken bir senkronizasyon jetonu alır.
Artımlı senkronizasyon: İstemciyi önceki senkronizasyondan bu yana yapılan tüm değişikliklerle güncellemek için tekrar tekrar gerçekleştirilir. İstemci her seferinde sunucudan alınan önceki senkronizasyon jetonunu sağlar ve yanıttan yeni senkronizasyon jetonunu depolar.
İlk tam senkronizasyon
İlk tam senkronizasyon, senkronize etmek istediğiniz koleksiyonun tüm kaynakları için yapılan 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 bulunur. nextSyncToken değerini saklamanız gerekir. Sonuç kümesi çok büyükse ve yanıt sayfalandırılmışsa nextSyncToken alanı yalnızca son sayfada bulunur.
Artımlı senkronizasyon
Kademeli 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 jetonunuzla bir liste isteği gerçekleştirin.
Sonuçta her zaman silinen girişlerin yer aldığını unutmayın. Böylece müşteriler bunları depolama alanından kaldırabilir.
Son artımlı senkronizasyon isteğinden bu yana çok sayıda kaynak değiştiyse liste sonucunda syncToken yerine pageToken görebilirsiniz. Bu durumlarda, artımlı senkronizasyonda ilk sayfayı almak için kullanılan liste sorgusunu (aynı syncToken ile) yürütün, sorguya pageToken ekleyin ve son sayfada başka bir syncToken bulana kadar sonraki isteklerde sayfalandırma yapın. Bu syncToken, bir sonraki senkronizasyon isteği için saklanır.
Aşağıdaki örneklerde artımlı olarak sayfalandırılmış bir senkronizasyon gösterilmektedir:
Orijinal sorgu
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
Sonuçta şunlar yer alır:
{
"nextPageToken": "CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA"
}
Sonraki sayfa alınıyor
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
Sunucu tarafından tam senkronizasyon gerekli
Sunucu, bazen jetonun süresinin dolması veya ilgili erişim kontrol listelerinde yapılan değişiklikler nedeniyle senkronizasyon jetonlarını geçersiz kılar. Bu gibi durumlarda sunucu, artımlı bir isteğe 410 HTTP durum koduyla yanıt verir. Bu durumda, istemci depolama alanını temizleyin ve yeni bir tam senkronizasyon gerçekleştirin.
Örnek kod
Aşağıdaki örnekte, Java istemci kitaplığı ile senkronizasyon jetonlarının nasıl kullanılacağı gösterilmektedir. run() yöntemi ilk kez çağrıldığında tam senkronizasyon gerçekleştirir ve senkronizasyon jetonunu saklar.
Sonraki her yürütmede, kaydedilen senkronizasyon jetonunu yükler ve artımlı 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ı için, etkinlik listesi isteğinden updated alanının değerini kaydedip güncellenen etkinlikleri almak üzere updatedMin alanını kullanarak eski senkronizasyonu gerçekleştirebilirsiniz. Bu yaklaşım, hata yapmaya daha yatkın olduğu (ör. sorgu kısıtlamalarını zorunlu kılmaz) ve yalnızca etkinlikler için kullanılabildiği için artık önerilmemektedir.