有效率地同步處理資源

本指南說明如何 執行「漸進式同步處理」日曆資料。使用此應用程式 方法,儲存所有日曆集合的資料時,可予以同步 頻寬。

目錄

總覽

漸進式同步處理作業包含兩個階段:

  1. 為了完整確保 讓用戶端的狀態與伺服器的狀態同步處理。用戶端將獲得 要求應用程式保存的同步權杖

  2. 系統會重複執行漸進式同步,並將用戶端的所有更新 自上次同步處理以來發生的變更。每次用戶端 提供從伺服器取得的前一個同步權杖,以及儲存回應中的新的同步權杖。

初始完整同步

初始完整同步處理是針對 和想要同步處理的集合您可以選擇限制清單 要求,但只想同步處理特定的 資源子集

在清單作業的回應中,您會看到一個名為 nextSyncToken,代表同步權杖。您需要儲存 nextSyncToken。如果結果集過大,且回應會 paginated,然後是 nextSyncToken 欄位只會出現在最後一頁。

漸進式同步

增量同步處理功能可讓您擷取 已修改。為此,您需要執行 要求 (使用 syncToken 欄位中指定的最新同步權杖)。 請注意,結果一律會包含已刪除的項目,因此 讓客戶有機會從儲存空間中移除

如果上次刪除後,大量資源有所變動 如為漸進式同步要求,可能會在清單結果中看到 pageToken,而非 syncToken。在這種情況下,您需要執行完全相同的 列出查詢,用來在增量同步處理作業中擷取第一頁 (具有相同的 syncToken) 時,為其附加 pageToken,然後 對下列所有要求進行分頁,直到您在最後一頁找到另一個 syncToken 為止。請務必儲存此 syncToken,以便下次同步處理時使用 存取資源

以下是需要漸進式分頁同步的客服案件範例:

原始查詢

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

// Result contains the following

"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",

擷取下一頁

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

伺服器需要完整同步處理

伺服器有時會基於各種原因導致同步權杖失效 包括權杖過期或相關 ACL 的變更。 在這種情況下,伺服器會以 回應代碼 410。這應該會觸發客戶商店的全部清除作業 以及全新的完整同步功能。

程式碼範例

下列程式碼片段示範如何將同步權杖與 Java 用戶端程式庫。第一次 而呼叫的執行方法,則會執行完整同步並儲存同步憑證。 之後每次執行作業時,都會載入已儲存的同步權杖,並執行 漸進式同步

  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.");
  }

舊版同步處理

使用者仍然可以在活動集合中 保留來自事件清單中已更新欄位的值,以取代舊方式 要求,然後使用 modifiedSince 欄位擷取更新的事件。 我們不建議使用此方法,因為這麼做比較容易出錯 更新錯過的更新 (例如,未強制執行查詢限制)。 而且僅適用於活動。