リソースを効率的に同期する

このガイドでは、 「増分同期」を実装するカレンダーデータを暗号化します。こちらの メソッドを使用すると、保存中にすべてのカレンダー コレクションのデータの同期を維持できます。 あります。

目次

概要

増分同期は次の 2 つのステージで構成されます。

  1. 最初の完全同期は、完全に同期するために最初に 1 回実行されます。 クライアントの状態をサーバーの状態と同期します。クライアントは 保持する必要がある同期トークンを指定します。

  2. 増分同期が繰り返し実行され、更新されたすべてのバージョンの 前回の同期以降に行われた変更を確認できますクライアントは毎回、 は、サーバーから取得した以前の同期トークンを提供し、レスポンスからの新しい同期トークンを格納します。

で確認できます。

最初の完全同期

最初の完全同期は、プロジェクトのすべてのリソースに対する を選択します。必要に応じて、リストに含まれる 特定の API のみを同期する場合は、リクエスト パラメータを使用して リソースのサブセットです。

リスト操作に対するレスポンスで、「 同期トークンを表す nextSyncToken。トレーニング中に nextSyncToken。結果セットが大きすぎてレスポンスが ページ分けありの場合は、nextSyncToken フィールドが最後のページにのみ表示されます。

増分同期

増分同期では すでに取り込まれた 最新の同期リクエスト以降に変更されたファイルです。そのためには、まず BigQuery の syncToken フィールドに指定された最新の同期トークンでリクエストを実行します。 結果には常に削除されたエントリが含まれるため、 ストレージから削除できます。

前回の実行時から多数のリソースが変更された場合 増分同期リクエストのリストの結果に syncToken ではなく pageToken が表示されることがあります。その場合は、まったく同じように 増分同期の最初のページを取得するために使用された list クエリ (まったく同じ 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 クライアント ライブラリ。初めて run メソッドが呼び出されると、完全同期が実行され、同期トークンが保存されます。 その後の実行のたびに、保存された同期トークンが読み込まれ、以下の処理が行われます。 増分同期を行います

  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 フィールドを使用して更新されたイベントを取得します。 この方法は、エラーが生じやすいため、現在は推奨されていません。 更新の見逃し(クエリ制限を適用していない場合など)に 対応できます また、使用できるのはイベントに対してのみです。