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ındaki verileri senkronize tutabilirsiniz.

İç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, kalıcı hale getirmesi gereken bir senkronizasyon jetonu alır.

  2. Artımlı senkronizasyon tekrar tekrar gerçekleştirilir ve istemciyi önceki senkronizasyondan bu yana yapılan tüm değişikliklerle günceller. İstemci, her seferinde sunucudan aldığı önceki senkronizasyon jetonunu sağlar ve yanıttan gelen 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ç grubu çok büyükse ve yanıt sayfalandırılıyorsa nextSyncToken alanı yalnızca en 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 en son senkronizasyon jetonunuzun belirtildiği bir liste isteği göndermeniz gerekir. Sonuçta her zaman silinen girişlerin yer alacağını unutmayın. Böylece istemciler, bu girişleri 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 gibi durumlarda, artımlı senkronizasyonda ilk sayfanın alınması için kullanılan liste sorgusunu (tam olarak aynı syncToken ile) tam olarak aynı şekilde yapmanız, sorguya pageToken eklemeniz ve son sayfada başka bir syncToken bulana kadar sonraki tüm isteklerde sayfalandırma yapmanız gerekir. Bu syncToken değerini, gelecekteki bir sonraki senkronizasyon isteği için sakladığınızdan emin olun.

Aşamalı olarak sayfalandırılmış senkronizasyon gerektiren bir durumla ilgili örnek sorguları aşağıda bulabilirsiniz:

Orijinal sorgu

GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx

// Result contains the following

"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

Bazen senkronizasyon jetonları, jetonun süresinin dolması veya ilgili ACL'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 410 yanıt koduyla yanıt verir. Bu işlem, müşterinin mağazasının tamamen silinmesine ve yeni bir tam senkronizasyonun başlatılmasına neden olur.

Ö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 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ında, etkinlik listesi isteğinden güncellenen alanın değerini koruyarak ve ardından güncellenen etkinlikleri almak için modifiedSince alanını kullanarak senkronizasyonu eski şekilde yapmak mümkündür. Bu yaklaşım, eksik güncellemeler (ör. sorgu kısıtlamalarını zorunlu kılmaması) açısından daha fazla hataya neden olduğundan artık önerilmemektedir. Ayrıca, yalnızca etkinlikler için kullanılabilir.