Neste guia, descrevemos como implementar a "sincronização incremental" de dados de calendário. Usar este , é possível manter os dados de todas as coleções sincronizados enquanto salva largura de banda larga.
Índice
Visão geral
A sincronização incremental consiste em dois estágios:
A sincronização completa inicial é realizada uma vez no início para sincronizar o estado do cliente com o do servidor. O cliente receberá um token de sincronização que precisa ser mantido.
A sincronização incremental é executada repetidamente e atualiza o cliente com todas as as alterações que ocorreram desde a sincronização anterior. Cada vez, o cliente fornece o token de sincronização anterior obtido do servidor e armazena o novo token de sincronização a partir da resposta.
Sincronização completa inicial
A sincronização completa inicial é a solicitação original de todos os recursos da da coleção que você quer sincronizar. Também é possível restringir a lista solicitação usando parâmetros de solicitação se você só quiser sincronizar um determinado um subconjunto de recursos.
Na resposta à operação de listagem, você encontrará um campo chamado
nextSyncToken
representando um token de sincronização. Você vai precisar armazenar o valor
nextSyncToken
: Se o conjunto de resultados for muito grande e a resposta for
paginado, depois o nextSyncToken
está presente apenas na última página.
Sincronização incremental
A sincronização incremental permite recuperar todos os recursos que foram
modificado desde a última solicitação de sincronização. Para isso, execute uma lista
solicitação com seu token de sincronização mais recente especificado no campo syncToken
.
Lembre-se de que o resultado sempre conterá entradas excluídas, de modo que a
os clientes têm a chance de removê-los do armazenamento.
Nos casos em que um grande número de recursos foi alterado desde a última
solicitação de sincronização incremental, talvez você encontre uma pageToken
em vez de uma syncToken
no resultado da lista. Nesses casos, você precisará realizar exatamente o mesmo
lista de consultas que foi usada para recuperação da primeira página na sincronização incremental
(com o mesmo syncToken
), anexe pageToken
a ele e
paginar todas as solicitações a seguir até encontrar outro syncToken
na última página. Guarde o syncToken
para a próxima sincronização
no futuro.
Veja alguns exemplos de consultas para um caso que requer sincronização paginada incremental:
Consulta original
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
// Result contains the following
"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",
Recuperando a próxima página
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
Sincronização completa exigida pelo servidor
Às vezes, os tokens de sincronização são invalidados pelo servidor por vários motivos.
incluindo a expiração do token ou alterações nas ACLs relacionadas.
Nesses casos, o servidor responderá a uma solicitação incremental com uma
código de resposta 410
. Isso deve acionar uma limpeza completa da loja do cliente
e uma nova sincronização completa.
Código de amostra
O snippet do exemplo de código abaixo demonstra como usar tokens de sincronização com o Biblioteca de cliente Java. A primeira vez o método run for chamado, ele vai realizar uma sincronização completa e armazenar o token de sincronização. Em cada execução subsequente, ele carrega o token de sincronização salvo e executa uma e na sincronização 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."); }
Sincronização legada
Para coleções de eventos, ainda é possível fazer a sincronização no
Maneira legada preservando o valor do campo atualizado de uma lista de eventos
e, em seguida, usando o campo modifiedSince
para recuperar eventos atualizados.
Essa abordagem não é mais recomendada porque é mais propensa a erros
a atualizações perdidas (por exemplo, se não aplicar restrições de consulta).
Além disso, está disponível apenas para eventos.