Este guia descreve como implementar a sincronização incremental de dados da agenda. Usando esse método, você pode manter os dados de todas as coleções de agendas sincronizados, economizando largura de banda.
Índice
Visão geral
A sincronização incremental consiste em duas etapas:
Sincronização completa inicial: realizada uma vez no início para sincronizar totalmente o estado do cliente com o estado do servidor. O cliente recebe um token de sincronização que precisa ser mantido.
Sincronização incremental: realizada repetidamente para atualizar o cliente com todas as mudanças feitas desde a sincronização anterior. A cada vez, o cliente fornece o token de sincronização anterior recebido do servidor e armazena o novo token de sincronização da resposta.
Sincronização completa inicial
A sincronização completa inicial é a solicitação original de todos os recursos da coleção que você quer sincronizar. Opcionalmente, é possível restringir a solicitação de lista usando parâmetros de solicitação se você quiser sincronizar apenas um subconjunto específico de recursos.
Na resposta à operação de lista, a resposta contém um campo chamado nextSyncToken que representa um token de sincronização. É necessário armazenar o valor de nextSyncToken. Se o conjunto de resultados for muito grande e a resposta for
paginada, o nextSyncToken
campo estará presente apenas na última página.
Sincronização incremental
A sincronização incremental permite recuperar todos os recursos que foram modificados desde a última solicitação de sincronização. Para fazer isso, realize uma solicitação de lista com o token de sincronização mais recente especificado no campo syncToken.
O resultado sempre contém entradas excluídas, para que os clientes possam removê-las do armazenamento.
Nos casos em que um grande número de recursos foi alterado desde a última solicitação de sincronização incremental, você pode encontrar um pageToken em vez de um syncToken no resultado da lista. Nesses casos, execute a mesma consulta de lista usada para recuperar a primeira página na sincronização incremental (com o mesmo syncToken), anexe o pageToken a ela e pagine as solicitações subsequentes até encontrar outro syncToken na última página. Armazene esse syncToken para a próxima solicitação de sincronização.
Os exemplos a seguir mostram uma sincronização paginada incremental:
Consulta original
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
O resultado contém o seguinte:
{
"nextPageToken": "CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA"
}
Como recuperar 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, o servidor invalida tokens de sincronização devido à expiração do token ou a mudanças nas ACLs relacionadas. Nesses casos, o servidor responde a uma solicitação incremental com o código de status HTTP 410. Quando isso ocorre, limpe o armazenamento do cliente e realize uma nova sincronização completa.
Exemplo de código
O exemplo a seguir demonstra como usar tokens de sincronização com a
biblioteca de cliente Java. Na primeira vez que o método run() é chamado, ele realiza uma sincronização completa e armazena o token de sincronização.
Em cada execução subsequente, ele carrega o token de sincronização salvo e realiza uma 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, é possível realizar a sincronização legada salvando o
valor do campo updated de uma solicitação de lista de eventos e usando o
updatedMin campo para recuperar eventos atualizados. Essa abordagem não é mais recomendada porque é mais propensa a erros (por exemplo, não aplica restrições de consulta) e está disponível apenas para eventos.