En esta guía, se describe cómo implementar la “sincronización incremental” de datos de calendario. Uso puedes mantener sincronizados los datos de todas las colecciones del calendario mientras guardas ancho de banda.
Contenido
Descripción general
La sincronización incremental consta de dos etapas:
La sincronización completa inicial se realiza una vez al principio para para sincronizar el estado del cliente con el estado del servidor. El cliente obtendrá un token de sincronización que debe conservar.
La sincronización incremental se realiza de forma repetida y se actualiza el cliente con todos los cambios que ocurrieron desde la sincronización anterior. Cada vez, el cliente proporciona el token de sincronización anterior que obtuvo del servidor y almacena el token de sincronización nuevo de la respuesta.
Sincronización completa inicial
La sincronización completa inicial es la solicitud original para todos los recursos de la colección que deseas sincronizar. También puedes restringir la lista con los parámetros de solicitud si solo deseas sincronizar una solicitud subconjunto de recursos.
En la respuesta a la operación de lista, encontrarás un campo llamado
nextSyncToken
, que representa un token de sincronización. Necesitarás almacenar el valor de
nextSyncToken
Si el conjunto de resultados es demasiado grande y la respuesta
paginad, luego nextSyncToken
esté presente solo en la última página.
Sincronización incremental
La sincronización incremental te permite recuperar todos los recursos que se
modificado desde la última solicitud de sincronización. Para ello, debes hacer una lista
solicitud con el token de sincronización más reciente especificado en el campo syncToken
.
Ten en cuenta que el resultado siempre contendrá entradas borradas, de modo que
los clientes tienen la oportunidad
de quitarlas del almacenamiento.
En los casos en los que una gran cantidad de recursos haya cambiado desde el último
solicitud de sincronización incremental, es posible que encuentres un pageToken
en lugar de una syncToken
en el resultado de la lista. En estos casos, deberás realizar exactamente el mismo
mostrar la consulta como se usó para recuperar la primera página de la sincronización incremental
(con exactamente el mismo syncToken
), agrégale el pageToken
y
pagina todas las solicitudes siguientes hasta que encuentres otra syncToken
en la última página. Asegúrate de guardar este syncToken
para la próxima sincronización
en el futuro.
Estos son ejemplos de consultas para un caso que requiere sincronización paginada incremental:
Consulta original
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
// Result contains the following
"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",
Cómo recuperar la página siguiente
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
El servidor requiere sincronización completa
A veces, el servidor invalida los tokens de sincronización por varios motivos
incluidos el vencimiento del token
o los cambios en las LCA relacionadas.
En tales casos, el servidor responderá a una solicitud incremental con un
código de respuesta 410
. Esto debería activar una limpieza completa de la tienda del cliente.
y una nueva sincronización completa.
Código de muestra
El fragmento de código de muestra a continuación demuestra cómo usar tokens de sincronización con el Biblioteca cliente de Java. La primera vez se llama al método de ejecución, y realiza una sincronización completa y almacena el token de sincronización. En cada ejecución posterior, se cargará el token de sincronización guardado y se realizará una sincronización incremental.
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."); }
Sincronización heredada
Para las colecciones de eventos, es posible realizar la sincronización en la
de forma heredada preservando el valor del campo actualizado de una lista de eventos
solicitud y, luego, usa el campo modifiedSince
para recuperar eventos actualizados.
Ya no se recomienda este enfoque, ya que es más propenso a errores con respecto
a actualizaciones perdidas (por ejemplo, si no aplica restricciones de consulta de manera forzosa).
Además, solo están disponibles para eventos.