Đồ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 dữ liệu lịch. Khi sử dụng phương thức này, bạn có thể giữ cho dữ liệu của tất cả các bộ sưu tập lịch luôn đồng bộ hoá 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 2 giai đoạn:

  1. Đồng bộ hoá đầy đủ ban đầu: Được thực hiện một lần khi bắt đầu để đồng bộ hoá hoàn toàn trạng thái của ứng dụng với trạng thái của máy chủ. Ứng dụng khách sẽ nhận được một mã thông báo đồng bộ hoá mà ứng dụng đó phải duy trì.

  2. Đồng bộ hoá gia tăng: Được thực hiện nhiều lần để cập nhật cho ứng dụng tất cả các thay đổi được thực hiện 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 đó 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á đầy đủ ban đầu là yêu cầu ban đầu cho tất cả cá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 tham số yêu cầu nếu chỉ muốn đồng bộ hoá một tập hợp con tài nguyên cụ thể.

Trong phản hồi cho thao tác liệt kê, phản hồi chứa một trường có tên là nextSyncToken, đại diện cho một mã thông báo đồng bộ hoá. Bạn phải lưu trữ giá trị của nextSyncToken. Nếu tậ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á gia tăng

Tính năng đồng bộ hoá gia tăng cho phép bạn truy xuất tất cả các tài nguyên đã được sửa đổi kể từ yêu cầu đồng bộ hoá gần đây nhất. Để thực hiện việc này, hãy thực hiện một yêu cầu liệt kê với mã đồng bộ hoá gần đây nhất được chỉ định trong trường syncToken. Xin lưu ý rằng kết quả luôn chứa các mục đã xoá, vì vậy, các ứng dụng có thể 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, hãy thực hiện cùng một truy vấn danh sách được dùng để truy xuất trang đầu tiên trong quá trình đồng bộ hoá gia tăng (với cùng một syncToken), hãy thêm pageToken vào truy vấn đó và phân trang qua các yêu cầu tiếp theo cho đến khi bạn tìm thấy một syncToken khác trên trang cuối cùng. Lưu trữ syncToken này cho yêu cầu đồng bộ hoá tiếp theo.

Các ví dụ sau đây minh hoạ một quy trình đồng bộ hoá phân trang gia tăng:

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

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

Kết quả chứa những thông tin sau:

{
  "nextPageToken": "CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA"
}

Đang 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á do mã thông báo hết hạn hoặc có thay đổi trong các ACL liên quan. Trong những trường hợp như vậy, máy chủ sẽ phản hồi một yêu cầu gia tăng bằng mã trạng thái HTTP 410. Khi điều này xảy ra, hãy xoá bộ nhớ của ứng dụng và thực hiện một quy trình đồng bộ hoá đầy đủ mới.

Mã mẫu

Mẫu sau đây minh hoạ cách sử dụng mã đồng bộ hoá với thư viện ứng dụng Java. Trong lần đầu tiên phương thức run() đượ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, nó sẽ tải mã thông báo đồng bộ hoá đã lưu và thực hiện một quy trình đồ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á cũ

Đối với các bộ sưu tập sự kiện, bạn có thể thực hiện quy trình đồng bộ hoá cũ bằng cách lưu giá trị của trường updated từ một yêu cầu danh sách sự kiện, sau đó sử dụng trường updatedMin để truy xuất các sự kiện đã cập nhật. Phương pháp này không còn được đề xuất nữa vì dễ xảy ra lỗi hơn (ví dụ: phương pháp này không thực thi các hạn chế về truy vấn) và chỉ dùng được cho các sự kiện.