Efektywne synchronizowanie zasobów

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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:

  1. 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ć.

  2. 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ń.