Kaynakları verimli bir şekilde senkronize edin

Bu kılavuzda, "artımlı senkronizasyon"u uygulamak olabilir. Bunu kullanma yöntemini kullanıyorsanız, dosyayı kaydederken tüm takvim koleksiyonlarına ait verilerin senkronize edilmesini bant genişliği.

İçindekiler

Genel Bakış

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

  1. İlk tam senkronizasyon, tam senkronizasyon işleminin en başında istemcinin durumunu sunucunun durumuyla senkronize eder. Müşteri, projenin saklaması gereken bir senkronizasyon jetonudur.

  2. Artımlı senkronizasyon tekrar tekrar gerçekleştirilir ve istemciyi tüm son senkronizasyondan bu yana gerçekleşen değişiklikler. Müşteri her seferinde sunucudan aldığı önceki senkronizasyon jetonunu sağlar ve yanıttaki yeni senkronizasyon jetonunu depolar.

İlk tam senkronizasyon

İlk tam senkronizasyon, koleksiyonudur. İsteğe bağlı olarak listeyi kısıtlayabilirsiniz. yalnızca belirli bir dosyayı senkronize etmek istiyorsanız istek parametreleri alt kümesidir.

Listeleme işlemine yanıtta, nextSyncToken, senkronizasyon jetonunu temsil eder. Şunun değerini depolamanız gerekir: nextSyncToken Sonuç kümesi çok büyükse ve yanıt, sayfalara ayrılmış, ardından nextSyncToken alanı yalnızca en son sayfada yer almalıdır.

Artımlı senkronizasyon

Artımlı senkronizasyon, son 30 güne ait olan Son senkronizasyon isteğinden bu yana değiştirildi. Bunun için, hedef kitlenizin syncToken alanında belirtilen en son senkronizasyon jetonunuzla istek gönderin. Sonucun her zaman silinmiş girişleri içereceğini unutmayın. Bu nedenle, bu verileri depolama alanından kaldırabilir.

Son zamandan bu yana çok sayıda kaynağın değiştiği durumlarda, artımlı senkronizasyon isteğinde bulunursanız liste sonucunda syncToken yerine pageToken görebilirsiniz. Bu durumlarda yapmanız gereken, artımlı senkronizasyonda ilk sayfanın alınması için kullanılan liste sorgusu (tam olarak aynı syncToken ile), ona pageToken ifadesini ekleyin ve Son sayfada başka bir syncToken bulana kadar aşağıdaki tüm istekleri sayfalara ayırın. Bu syncToken öğesini bir sonraki senkronizasyon için sakladığınızdan emin olun talep etmeniz gerekir.

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

Senkronizasyon jetonları bazen çeşitli nedenlerle sunucu tarafından geçersiz kılınır. jeton geçerlilik süresi veya ilgili EKL'lerdeki değişiklikler dahil. Bu tür durumlarda sunucu, artan bir isteğe yanıt kodu 410. Bu işlem, müşteriye ait mağazanın tamamen temizlenmesini tetikler. yeni bir tam senkronizasyon yapabilirsiniz.

Örnek kod

Aşağıdaki örnek kod snippet'i, Java istemci kitaplığı. İlk kez tam senkronizasyon gerçekleştirecek ve senkronizasyon jetonunu depolayacağı olarak adlandırılır. Sonraki her yürütmede, kayıtlı senkronizasyon jetonunu yükler ve artımlı senkronizasyon.

  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, yine Güncellenen alanın değerini bir etkinlik listesinden koruyarak eski yöntemle isteği ve ardından, güncellenen etkinlikleri almak için modifiedSince alanını kullanma. Saygı açısından hataya daha açık olduğundan bu yaklaşım artık önerilmez eksik güncellemelere neden olabilir (örneğin, sorgu kısıtlamalarını zorunlu kılmıyorsa). Ayrıca yalnızca etkinlikler için kullanılabilir.