Kaynakları verimli bir şekilde senkronize edin

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ının verilerini senkronize edebilirsiniz.

İçindekiler

Genel bakış

Artımlı senkronizasyon iki aşamadan oluşur:

  1. İlk tam senkronizasyon, istemcinin durumunu sunucunun durumuyla tam olarak senkronize etmek için en başta bir kez gerçekleştirilir. İstemci, devam etmesi gereken bir senkronizasyon jetonu alır.

  2. Artımlı senkronizasyon art arda 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ığı ö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. İsterseniz yalnızca belirli bir kaynak alt kümesini senkronize etmek istiyorsanız istek parametrelerini kullanarak liste isteğini kısıtlayabilirsiniz.

Listeleme işlemine yanıtta, senkronizasyon jetonunu temsil eden nextSyncToken adlı bir alan görürsünüz. nextSyncToken değerini depolamanız gerekir. Sonuç kümesi çok büyükse ve yanıt sayfalara ayrılır, nextSyncToken alanı yalnızca en son sayfada bulunur.

Artımlı senkronizasyon

Artımlı senkronizasyon, son senkronizasyon isteğinden bu yana değiştirilmiş 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ştirmeniz gerekir. Sonucun her zaman silinmiş 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 pageToken görebilirsiniz. Bu durumlarda, artımlı senkronizasyonda ilk sayfayı almak için kullanılan liste sorgusunun aynısını (tam olarak aynı syncToken ile) gerçekleştirmeniz, buna pageToken ifadesini 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 dosyasını sakladığınızdan emin olun.

Aşağıda, sayfalandırılmış artımlı 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, tam senkronizasyon gerektiriyor

Bazen senkronizasyon jetonları sunucu tarafından, jeton geçerlilik süresinin dolması veya ilgili EKL'lerdeki değişiklikler gibi çeşitli nedenlerle geçersiz kılınır. Bu tür durumlarda sunucu, artımlı isteğe 410 yanıt koduyla yanıt verir. Bu işlem, istemcinin mağazasının tamamen temizlenmesini ve yeni bir tam senkronizasyonu tetikleyecektir.

Örnek kod

Aşağıdaki örnek kod snippet'i, Java istemci kitaplığı ile senkronizasyon jetonlarının nasıl kullanılacağını gösterir. Çalıştırma yöntemi ilk kez çağrıldığında tam senkronizasyon gerçekleştirir ve senkronizasyon jetonunu depolar. Sonraki her yürütme işleminde, kaydedilen senkronizasyon jetonunu yükler 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ğinde koruyarak ve ardından güncellenen etkinlikleri almak için modifiedSince alanını kullanarak eski yöntemlerle senkronizasyon gerçekleştirebilirsiniz. Bu yaklaşım, kaçırılan güncellemeler konusunda hataya daha açık olduğundan (örneğin, sorgu kısıtlamalarını uygulamıyorsa) artık önerilmez. Ayrıca yalnızca etkinlikler için kullanılabilir.