Efektywne synchronizowanie zasobów

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:

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

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