Ressourcen effizient synchronisieren

In diesem Leitfaden wird beschrieben, wie Sie „Inkrementelle Synchronisierung“ implementieren von Kalenderdaten. Mit diesem können Sie die Daten aller Kalendersammlungen synchronisieren und gleichzeitig Bandbreite.

Inhalt

Übersicht

Die inkrementelle Synchronisierung besteht aus zwei Phasen:

  1. Die anfängliche vollständige Synchronisierung wird einmal am Anfang durchgeführt, um den Status des Clients mit dem Status des Servers synchronisieren. Der Kunde erhält ein Synchronisierungstoken, das beibehalten werden muss.

  2. Die inkrementelle Synchronisierung wird wiederholt durchgeführt und aktualisiert den Client mit allen die seit der letzten Synchronisierung vorgenommenen Änderungen. Jedes Mal, wenn der Kunde stellt das vorherige Synchronisierungstoken bereit, das er vom Server erhalten hat, und speichert das neue Synchronisierungstoken aus der Antwort.

Erste vollständige Synchronisierung

Die erste vollständige Synchronisierung ist die ursprüngliche Anfrage für alle Ressourcen der die Sie synchronisieren möchten. Sie können die Liste optional einschränken -Anfrage mit Anfrageparametern erstellen, wenn Sie nur eine bestimmte Teilmenge von Ressourcen.

In der Antwort auf den list-Vorgang finden Sie ein Feld namens nextSyncToken, die ein Synchronisierungstoken darstellt. Sie müssen den Wert nextSyncToken Wenn die Ergebnismenge zu groß ist und die Antwort paginiert ist, dann gilt der nextSyncToken nur auf der letzten Seite vorhanden ist.

Inkrementelle Synchronisierung

Mit der inkrementellen Synchronisierung können Sie alle Ressourcen abrufen, die seit der letzten Synchronisierungsanfrage geändert wurden. Dazu müssen Sie eine Liste -Anfrage mit Ihrem letzten Synchronisierungstoken, das im Feld syncToken angegeben ist. Denken Sie daran, dass das Ergebnis immer gelöschte Einträge enthält, sodass das können Kunden sie aus dem Speicher entfernen.

In Fällen, in denen sich eine große Anzahl von Ressourcen seit der letzten inkrementellen Synchronisierungsanfrage stellen, wird im Listenergebnis möglicherweise ein pageToken anstelle von syncToken angezeigt. In diesen Fällen müssen Sie genau die gleichen Schritte Listenabfrage, die zum Abrufen der ersten Seite bei der inkrementellen Synchronisierung verwendet wurde (mit exakt demselben syncToken), hängen Sie pageToken an und Blättere durch alle folgenden Anfragen, bis du auf der letzten Seite ein weiteres syncToken findest. Diese syncToken für die nächste Synchronisierung speichern nicht mehr möglich ist.

Hier sind Beispielabfragen für einen Fall, bei dem eine inkrementelle Synchronisierung mit nummerierten Seiten erforderlich ist:

Ursprüngliche Anfrage

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

// Result contains the following

"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",

Nächste Seite wird abgerufen

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

Vollständige Synchronisierung vom Server erforderlich

Manchmal werden Synchronisierungstokens aus verschiedenen Gründen vom Server ungültig gemacht. wie z. B. den Ablauf von Tokens oder Änderungen an zugehörigen ACLs. In diesen Fällen antwortet der Server auf eine inkrementelle Anfrage mit einem Antwortcode 410. Dies sollte eine vollständige Löschung des Shops des Kunden auslösen und eine neue vollständige Synchronisierung.

Beispielcode

Das folgende Beispielcode-Snippet zeigt, wie Synchronisierungstokens mit dem Java-Clientbibliothek Beim ersten Mal wird die Ausführungsmethode aufgerufen. Sie führt eine vollständige Synchronisierung durch und speichert das Synchronisierungstoken. Bei jeder nachfolgenden Ausführung wird das gespeicherte Synchronisierungstoken geladen und eine inkrementelle Synchronisierung.

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

Legacy-Synchronisierung

Die Synchronisierung von Veranstaltungssammlungen ist weiterhin möglich. Dabei wird der Wert des aktualisierten Felds aus einer Ereignisliste beibehalten. -Anfrage und verwenden Sie dann das Feld modifiedSince, um aktualisierte Ereignisse abzurufen. Diese Methode wird nicht mehr empfohlen, da sie fehleranfälliger ist. auf verpasste Aktualisierungen (z. B. wenn keine Abfrageeinschränkungen erzwungen werden). Außerdem ist sie nur für Veranstaltungen verfügbar.