Questa guida descrive come implementare la "sincronizzazione incrementale" di dati del calendario. Utilizzo di questo puoi mantenere sincronizzati i dati di tutte le raccolte di calendario mentre salvi e la larghezza di banda.
Sommario
Panoramica
La sincronizzazione incrementale prevede due fasi:
La sincronizzazione completa iniziale viene eseguita una volta all'inizio per sincronizza lo stato del client con lo stato del server. Il cliente otterrà un token di sincronizzazione di cui deve essere mantenuto.
La sincronizzazione incrementale viene eseguita ripetutamente e aggiorna il client con le modifiche apportate dopo la sincronizzazione precedente. Ogni volta, il cliente fornisce il token di sincronizzazione precedente ottenuto dal server e archivia il nuovo token di sincronizzazione dalla risposta.
Sincronizzazione completa iniziale
La sincronizzazione iniziale completa è la richiesta originale per tutte le risorse raccolta che desideri sincronizzare. Se vuoi, puoi limitare l'elenco di fatturazione utilizzando i parametri di richiesta se vuoi solo sincronizzare un un sottoinsieme di risorse.
Nella risposta all'operazione di elenco, troverai un campo chiamato
nextSyncToken
che rappresenta un token di sincronizzazione. Devi archiviare il valore
nextSyncToken
. Se il set di risultati è troppo grande e la risposta riceve
suddivise in pagine, nextSyncToken
è presente solo nell'ultima pagina.
Sincronizzazione incrementale
La sincronizzazione incrementale consente di recuperare tutte le risorse
modificato dall'ultima richiesta di sincronizzazione. Per farlo, devi eseguire un elenco
con il token di sincronizzazione più recente specificato nel campo syncToken
.
Tieni presente che il risultato conterrà sempre le voci eliminate, in modo che
i client hanno la possibilità di rimuoverli dallo spazio di archiviazione.
Nei casi in cui un numero elevato di risorse sia cambiato dall'ultimo
richiesta di sincronizzazione incrementale, potresti trovare un pageToken
anziché un syncToken
nel risultato dell'elenco. In questi casi dovrai eseguire esattamente lo stesso
query list così come è stata utilizzata per il recupero della prima pagina nella sincronizzazione incrementale
(con lo stesso syncToken
), aggiungi pageToken
e
impaginare le seguenti richieste fino a trovare un altro syncToken
nell'ultima pagina. Assicurati di archiviare questo syncToken
per la prossima sincronizzazione
una richiesta in futuro.
Ecco alcuni esempi di query per una richiesta che richiede la sincronizzazione impaginata incrementale:
Query originale
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
// Result contains the following
"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",
Recupero della pagina successiva
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
Sincronizzazione completa richiesta dal server
A volte i token di sincronizzazione vengono invalidati dal server per vari motivi
incluse la scadenza dei token o le modifiche
agli ACL correlati.
In questi casi, il server risponderà a una richiesta incrementale con un
codice di risposta 410
. Questa operazione dovrebbe attivare la cancellazione completa del negozio del client
e una nuova sincronizzazione completa.
Codice di esempio
Lo snippet di codice di esempio riportato di seguito mostra come utilizzare i token di sincronizzazione con Libreria client Java. La prima volta il metodo run è chiamato che eseguirà una sincronizzazione completa e archivierà il token di sincronizzazione. A ogni esecuzione successiva, caricherà il token di sincronizzazione salvato ed eseguirà un una sincronizzazione incrementale.
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."); }
Sincronizzazione precedente
Per le raccolte di eventi, è comunque possibile eseguire la sincronizzazione nel
precedente mantenendo il valore del campo aggiornato da un elenco di eventi
e poi usare il campo modifiedSince
per recuperare gli eventi aggiornati.
Questo approccio non è più consigliato in quanto è più soggetto a errori rispetto
agli aggiornamenti mancanti (ad esempio se non vengono applicate limitazioni delle query).
Inoltre, è disponibile solo per gli eventi.