Kaynakları verimli bir şekilde senkronize edin

Bu kılavuzda, takvim verilerinin "artımlı senkronizasyonu"nun nasıl uygulanacağı açıklanmaktadır. Bu yöntemi kullanarak bant genişliğinden tasarruf ederken tüm takvim koleksiyonlarının verilerini senkronize tutabilirsiniz.

İçindekiler

Genel Bakış

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

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

  2. Artımlı senkronizasyon tekrar tekrar gerçekleştirilir ve istemciyi önceki senkronizasyondan bu yana gerçekleşen tüm değişikliklerle günceller. Müşteri her seferinde 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ı için orijinal istektir. Yalnızca belirli bir kaynak alt kümesini senkronize etmek istiyorsanız isteğe bağlı olarak istek parametrelerini kullanarak liste isteğini kısıtlayabilirsiniz.

Liste işleminin yanıtında, senkronizasyon jetonunu temsil eden nextSyncToken adlı bir alan görürsünüz. nextSyncToken değerini kaydetmeniz gerekir. Sonuç grubu çok büyükse ve yanıt sayfalara bölünmüşse 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 en son senkronizasyon jetonunuzu belirterek bir liste isteği göndermeniz gerekir. Sonuçta her zaman silinmiş girişlerin yer alacağını unutmayın. Böylece istemciler, bu girişleri depolama alanından kaldırma şansı elde eder.

Son artımlı 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 sayfanın alınması için kullanılanla tam olarak aynı liste sorgusunu (tam olarak aynı syncToken ile) gerçekleştirmeniz, pageToken değerini eklemeniz ve son sayfada başka bir syncToken bulana kadar aşağıdaki tüm isteklerde sayfalandırma yapmanız gerekir. Gelecekte bir sonraki senkronizasyon isteği için bu syncToken değerini sakladığınızdan emin olun.

Artımlı sayfaya ayrılmış senkronizasyon gerektiren bir durum için örnek sorgular aşağıda 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 tarafından tam senkronizasyon gerekli

Senkronizasyon jetonları, jetonun süresi dolması veya ilgili ACL'lerde yapılan değişiklikler gibi çeşitli nedenlerle sunucu tarafından geçersiz kılınabilir. Bu gibi durumlarda sunucu, artımlı bir isteğe 410 yanıt koduyla yanıt verir. Bu işlem, istemcinin mağazasının tamamen silinmesini ve yeni bir tam senkronizasyon yapılmasını tetikler.

Örnek kod

Aşağıdaki örnek kod snippet'inde, senkronizasyon jetonlarının Java istemci kitaplığı ile nasıl kullanılacağı gösterilmektedir. run yöntemi ilk kez çağrıldığında tam senkronizasyon gerçekleştirir ve senkronizasyon jetonunu depolar. Sonraki her yürütme işleminde, kayıtlı 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, güncellenen alanın değerini bir etkinlik listesi isteğinden koruyarak ve ardından güncellenen etkinlikleri almak için modifiedSince alanını kullanarak senkronizasyonu eski şekilde gerçekleştirmek mümkündür. Bu yaklaşım, kaçırılan güncellemeler açısından daha hatalara açık olduğu için artık önerilmez (ör. sorgu kısıtlamaları uygulanmazsa). Ayrıca, yalnızca etkinlikler için kullanılabilir.