Đồng bộ hoá tài nguyên một cách hiệu quả

Hướng dẫn này mô tả cách triển khai tính năng "đồng bộ hoá gia tăng" của dữ liệu lịch. Khi sử dụng phương thức này, bạn có thể đồng bộ hoá dữ liệu cho tất cả các bộ sưu tập lịch trong khi tiết kiệm băng thông.

Nội dung

Tổng quan

Quá trình đồng bộ hoá gia tăng bao gồm hai giai đoạn:

  1. Quá trình đồng bộ hoá đầy đủ ban đầu được thực hiện một lần ngay từ đầu để đồng bộ hoá đầy đủ trạng thái của ứng dụng với trạng thái của máy chủ. Ứng dụng sẽ nhận được một mã thông báo đồng bộ hoá mà ứng dụng cần duy trì.

  2. Quá trình đồng bộ hoá gia tăng được thực hiện lặp lại và cập nhật ứng dụng bằng tất cả các thay đổi đã xảy ra kể từ lần đồng bộ hoá trước. Mỗi lần, ứng dụng sẽ cung cấp mã thông báo đồng bộ hoá trước đó mà ứng dụng nhận được từ máy chủ và lưu trữ mã thông báo đồng bộ hoá mới từ phản hồi.

Đồng bộ hoá toàn bộ lần đầu

Quá trình đồng bộ hoá toàn bộ ban đầu là yêu cầu ban đầu cho tất cả tài nguyên của bộ sưu tập mà bạn muốn đồng bộ hoá. Bạn có thể tuỳ ý hạn chế yêu cầu danh sách bằng cách sử dụng các thông số yêu cầu nếu chỉ muốn đồng bộ hoá một nhóm tài nguyên cụ thể.

Trong phản hồi cho thao tác liệt kê, bạn sẽ thấy một trường có tên nextSyncToken đại diện cho mã thông báo đồng bộ hoá. Bạn cần lưu trữ giá trị của nextSyncToken. Nếu tập hợp kết quả quá lớn và phản hồi được phân trang, thì trường nextSyncToken chỉ xuất hiện trên trang cuối cùng.

Đồng bộ hoá tăng dần

Tính năng đồng bộ hoá gia tăng cho phép bạn truy xuất tất cả tài nguyên đã được chỉnh sửa kể từ yêu cầu đồng bộ hoá gần đây nhất. Để thực hiện việc này, bạn cần thực hiện một yêu cầu danh sách bằng mã thông báo đồng bộ hoá gần đây nhất được chỉ định trong trường syncToken. Xin lưu ý rằng kết quả sẽ luôn chứa các mục đã xoá để ứng dụng có cơ hội xoá các mục đó khỏi bộ nhớ.

Trong trường hợp có nhiều tài nguyên đã thay đổi kể từ yêu cầu đồng bộ hoá gia tăng gần đây nhất, bạn có thể thấy pageToken thay vì syncToken trong kết quả danh sách. Trong những trường hợp này, bạn cần thực hiện chính xác truy vấn danh sách đã dùng để truy xuất trang đầu tiên trong quá trình đồng bộ hoá tăng dần (với chính xác syncToken), nối pageToken vào và phân trang qua tất cả các yêu cầu sau cho đến khi bạn tìm thấy một syncToken khác trên trang cuối cùng. Hãy nhớ lưu trữ syncToken này cho yêu cầu đồng bộ hoá tiếp theo trong tương lai.

Dưới đây là các truy vấn mẫu cho trường hợp yêu cầu đồng bộ hoá phân trang tăng dần:

Cụm từ tìm kiếm ban đầu

GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx

// Result contains the following

"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",

Truy xuất trang tiếp theo

GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA

Máy chủ yêu cầu đồng bộ hoá toàn bộ

Đôi khi, máy chủ sẽ vô hiệu hoá mã thông báo đồng bộ hoá vì nhiều lý do, bao gồm cả việc mã thông báo hết hạn hoặc thay đổi trong các ACL có liên quan. Trong những trường hợp như vậy, máy chủ sẽ phản hồi yêu cầu gia tăng bằng mã phản hồi 410. Thao tác này sẽ kích hoạt việc xoá toàn bộ kho của ứng dụng và một quá trình đồng bộ hoá toàn bộ mới.

Mã mẫu

Đoạn mã mẫu bên dưới minh hoạ cách sử dụng mã thông báo đồng bộ hoá với thư viện ứng dụng Java. Lần đầu tiên phương thức chạy được gọi, phương thức này sẽ thực hiện đồng bộ hoá đầy đủ và lưu trữ mã thông báo đồng bộ hoá. Trong mỗi lần thực thi tiếp theo, ứng dụng sẽ tải mã thông báo đồng bộ hoá đã lưu và thực hiện đồng bộ hoá gia tăng.

  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.");
  }

Đồng bộ hoá kiểu cũ

Đối với các bộ sưu tập sự kiện, bạn vẫn có thể đồng bộ hoá theo cách cũ bằng cách giữ lại giá trị của trường đã cập nhật từ yêu cầu danh sách sự kiện, sau đó sử dụng trường modifiedSince để truy xuất các sự kiện đã cập nhật. Bạn không nên sử dụng phương pháp này nữa vì phương pháp này dễ gặp lỗi hơn liên quan đến các bản cập nhật bị bỏ lỡ (ví dụ: nếu không thực thi các quy tắc hạn chế truy vấn). Hơn nữa, tính năng này chỉ dành cho sự kiện.