Panduan ini menjelaskan cara menerapkan sinkronisasi inkremental data kalender. Dengan metode ini, Anda dapat menyinkronkan data untuk semua koleksi kalender sekaligus menghemat bandwidth.
Daftar Isi
Ringkasan
Sinkronisasi inkremental terdiri dari dua tahap:
Sinkronisasi penuh awal: Dilakukan sekali di awal untuk menyinkronkan status klien sepenuhnya dengan status server. Klien akan mendapatkan token sinkronisasi yang harus dipertahankan.
Sinkronisasi inkremental: Dilakukan berulang kali untuk memperbarui klien dengan semua perubahan yang dilakukan sejak sinkronisasi sebelumnya. Setiap kali, klien akan memberikan token sinkronisasi sebelumnya yang diperoleh dari server dan menyimpan token sinkronisasi baru dari respons.
Sinkronisasi penuh awal
Sinkronisasi penuh awal adalah permintaan asli untuk semua resource koleksi yang ingin Anda sinkronkan. Anda dapat membatasi permintaan daftar menggunakan parameter permintaan jika hanya ingin menyinkronkan subset resource tertentu.
Dalam respons terhadap operasi daftar, respons berisi kolom bernama nextSyncToken yang mewakili token sinkronisasi. Anda harus menyimpan nilai nextSyncToken. Jika kumpulan hasil terlalu besar dan respons
diberi nomor halaman, nextSyncToken
kolom hanya akan ada di halaman terakhir.
Sinkronisasi inkremental
Sinkronisasi inkremental memungkinkan Anda mengambil semua resource yang telah diubah sejak permintaan sinkronisasi terakhir. Untuk melakukannya, lakukan permintaan daftar dengan token sinkronisasi terbaru yang ditentukan di kolom syncToken.
Perlu diingat bahwa hasilnya selalu berisi entri yang dihapus, sehingga klien dapat menghapusnya dari penyimpanan.
Jika sejumlah besar resource telah berubah sejak permintaan sinkronisasi inkremental terakhir, Anda mungkin menemukan pageToken dan bukan syncToken dalam hasil daftar. Dalam kasus ini, lakukan kueri daftar yang sama yang digunakan untuk mengambil halaman pertama dalam sinkronisasi inkremental (dengan syncToken yang sama), tambahkan pageToken ke kueri tersebut, dan beri nomor halaman melalui permintaan berikutnya hingga Anda menemukan syncToken lain di halaman terakhir. Simpan syncToken ini untuk permintaan sinkronisasi berikutnya.
Contoh berikut menunjukkan sinkronisasi inkremental dengan nomor halaman:
Kueri asli
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
Hasilnya berisi hal berikut:
{
"nextPageToken": "CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA"
}
Mengambil halaman berikutnya
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
Sinkronisasi penuh yang diperlukan oleh server
Server terkadang membatalkan validasi token sinkronisasi karena masa berlaku token berakhir atau perubahan pada ACL terkait. Dalam kasus tersebut, server akan merespons permintaan inkremental dengan kode status HTTP 410. Jika hal ini terjadi, hapus penyimpanan klien dan lakukan sinkronisasi penuh baru.
Kode contoh
Contoh berikut menunjukkan cara menggunakan token sinkronisasi dengan
library klien Java. Saat pertama kali metode run() dipanggil, metode ini akan melakukan sinkronisasi penuh dan menyimpan token sinkronisasi.
Pada setiap eksekusi berikutnya, metode ini akan memuat token sinkronisasi yang disimpan dan melakukan sinkronisasi inkremental.
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."); }
Sinkronisasi lama
Untuk koleksi peristiwa, Anda dapat melakukan sinkronisasi lama dengan menyimpan
nilai kolom updated dari permintaan daftar peristiwa, lalu menggunakan
updatedMin kolom untuk mengambil peristiwa yang diperbarui. Pendekatan ini tidak lagi direkomendasikan karena lebih rentan error (misalnya, tidak menerapkan batasan kueri) dan hanya tersedia untuk peristiwa.