Z tego przewodnika dowiesz się, jak: wdrażanie „synchronizacji przyrostowej” danych kalendarza. Użycie tego możesz synchronizować dane wszystkich kolekcji w kalendarzu połączenia internetowego.
Spis treści
Omówienie
Synchronizacja przyrostowa składa się z 2 etapów:
Początkowa pełna synchronizacja jest wykonywana jeden raz na samym początku w celu synchronizować stan klienta ze stanem serwera. Klient uzyska token synchronizacji, który musi być trwały.
Synchronizacja przyrostowa jest wykonywana wielokrotnie i aktualizuje klienta o wszystkie zmiany, które pojawiły się od ostatniej synchronizacji. Za każdym razem klient udostępnia poprzedni token synchronizacji uzyskany z serwera i przechowuje nowy token synchronizacji z odpowiedzi.
Pierwsza pełna synchronizacja
Pierwsza pełna synchronizacja to pierwotne żądanie wszystkich zasobów kolekcję, którą chcesz zsynchronizować. Możesz opcjonalnie ograniczyć listę używając parametrów żądania, jeśli chcesz synchronizować tylko określony podzbioru zasobów.
W odpowiedzi na operację listy znajdziesz pole o nazwie
nextSyncToken
reprezentujący token synchronizacji. Musisz zapisać wartość
nextSyncToken
Jeśli zbiór wyników jest za duży i odpowiedź zostanie
paginated, to nextSyncToken
występuje tylko na ostatniej stronie.
Synchronizacja przyrostowa
Synchronizacja przyrostowa umożliwia pobranie wszystkich zasobów, które zostały
zmodyfikowane od czasu ostatniego żądania synchronizacji. W tym celu musisz utworzyć listę
z ostatnim tokenem synchronizacji określonym w polu syncToken
.
Pamiętaj, że wynik zawsze będzie zawierał usunięte wpisy, więc
klienci mogą usunąć je z pamięci masowej.
W przypadkach, gdy duża liczba zasobów uległa zmianie od ostatniego
przyrostowego żądania synchronizacji, w wynikach na liście może pojawić się pageToken
zamiast syncToken
. W takich przypadkach musisz wykonać dokładnie to samo
wyświetl listę zapytań, które posłużyły do pobrania pierwszej strony w synchronizacji przyrostowej
(z dokładnie tym samym elementem syncToken
), dołącz do niego pageToken
i
dzielić na strony wszystkie poniższe żądania, aż znajdziesz kolejnego syncToken
na ostatniej stronie. Pamiętaj, by zapisać ten element (syncToken
) na potrzeby następnej synchronizacji
żądania usunięcia treści w przyszłości.
Oto przykładowe zapytania w przypadku przypadków wymagających przyrostowej synchronizacji z podziałem na strony:
Pierwotne 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
w tym daty ważności tokenów i zmian na powiązanych listach kontroli dostępu.
W takich przypadkach serwer odpowiada na żądanie przyrostowe, przesyłając parametr
kod odpowiedzi 410
. Powinno to spowodować całkowite wyczyszczenie sklepu klienta
oraz nową pełną synchronizację.
Przykładowy kod
Fragment kodu poniżej pokazuje, jak używać tokenów synchronizacji Biblioteka klienta Java. Pierwszy raz jeśli metoda uruchamiania zostanie wywołana, przeprowadzi pełną synchronizację i zapisze token synchronizacji. Przy każdym kolejnym uruchomieniu wczytuje zapisany token synchronizacji i wykona polecenie synchronizację przyrostową.
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 wersja synchronizacji
W przypadku kolekcji wydarzeń nadal można przeprowadzić synchronizację w
w starszy sposób z zachowaniem wartości zaktualizowanego pola z listy zdarzeń
a potem użyj pola modifiedSince
do pobrania zaktualizowanych zdarzeń.
Ta metoda nie jest już zalecana, ponieważ jest bardziej podatna na błędy
do nieodebranych aktualizacji (na przykład jeśli nie wymusza ograniczeń dotyczących zapytań).
Ponadto jest dostępny tylko w przypadku wydarzeń.