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:
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.
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 an, 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.
Wenn 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 solchen 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.