Ten przewodnik opisuje, jak wdrożyć „dodatkową synchronizację” danych kalendarza. Dzięki tej metodzie możesz synchronizować dane wszystkich kolekcji kalendarzy, jednocześnie oszczędzając przepustowość.
Spis treści
Omówienie
Synchronizacja przyrostowa składa się z 2 etapów:
Wstępna pełna synchronizacja jest przeprowadzana raz na samym początku, aby w pełni zsynchronizować stan klienta ze stanem serwera. Klient otrzyma token synchronizacji, który musi zachować.
Synchronizacja przyrostowa jest wykonywana wielokrotnie i aktualizuje klienta ze wszystkimi zmianami, które nastąpiły od poprzedniej synchronizacji. Za każdym razem klient dostarcza poprzedni token synchronizacji uzyskany z serwera i przechowuje nowy token synchronizacji z odpowiedzi.
Pierwsza pełna synchronizacja
Początkowa pełna synchronizacja to pierwotne żądanie dotyczące wszystkich zasobów kolekcji, które chcesz zsynchronizować. Opcjonalnie możesz ograniczyć żądanie z listy za pomocą parametrów żądania, jeśli chcesz zsynchronizować tylko określony podzbiór zasobów.
W odpowiedzi na tę listę znajdziesz pole nextSyncToken
, które reprezentuje token synchronizacji. Musisz przechowywać wartość nextSyncToken
. Jeśli zbiór wyników jest za duży, a odpowiedź jest podzielona na strony, pole nextSyncToken
znajduje się tylko na ostatniej stronie.
Synchronizacja przyrostowa
Synchronizacja przyrostowa umożliwia pobieranie wszystkich zasobów, które zostały zmodyfikowane od czasu ostatniej prośby o synchronizację. W tym celu musisz wysłać żądanie listy z ostatnim tokenem synchronizacji określonym w polu syncToken
.
Pamiętaj, że wynik będzie zawsze zawierał usunięte wpisy, więc klienci mogą je usunąć z pamięci.
Jeśli od ostatniej prośby o synchronizację przyrostową zmieniło się wiele zasobów, w wynikach może pojawić się pageToken
zamiast syncToken
. W takim przypadku musisz wykonać to samo zapytanie, które zostało użyte do pobrania pierwszej strony podczas synchronizacji przyrostowej (dokładnie z tą samą wartością syncToken
), dołączyć do niej parametr pageToken
i podzielić go na kolejne żądania aż do znalezienia kolejnego elementu syncToken
na ostatniej stronie. Zapisz ten plik syncToken
na potrzeby następnej
synchronizacji w przyszłości.
Oto przykłady zapytań dotyczących przyrostowej synchronizacji podzielonej na strony:
Oryginalne zapytanie
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
// Result contains the following
"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",
Pobieram następną stronę
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
Serwer wymaga pełnej synchronizacji
Czasami tokeny synchronizacji są unieważniane przez serwer z różnych powodów, takich jak wygaśnięcie tokena czy zmiany w powiązanych listach kontroli dostępu.
W takich przypadkach serwer będzie odpowiadać na dodatkowe żądanie z kodem odpowiedzi 410
. Powinno to spowodować pełne wyczyszczenie sklepu klienta i nową synchronizację.
Przykładowy kod
Fragment kodu poniżej pokazuje, jak używać tokenów synchronizacji z biblioteką klienta w języku Java. Przy pierwszym wywołaniu metody uruchomienia zostanie przeprowadzona pełna synchronizacja i zostanie zapisany token synchronizacji. Przy każdym kolejnym uruchomieniu wczytywany jest token synchronizacji i przyrostowa synchronizacja.
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."); }
Starsza synchronizacja
W przypadku kolekcji zdarzeń nadal można przeprowadzać synchronizację w starszy sposób, zachowując wartość zaktualizowanego pola z żądania listy zdarzeń, a następnie używając pola modifiedSince
do pobierania zaktualizowanych zdarzeń.
Ta metoda nie jest już zalecana, ponieważ jest bardziej podatna na błędy w przypadku brakujących aktualizacji (np. jeśli nie wymusza ograniczeń dotyczących zapytań).
Poza tym jest dostępna tylko w przypadku wydarzeń.