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 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 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 secara opsional menggunakan parameter permintaan jika hanya ingin menyinkronkan subset resource tertentu.
Dalam respons terhadap operasi daftar, respons berisi kolom bernama
nextSyncToken yang merepresentasikan token sinkronisasi. Anda harus menyimpan nilai
nextSyncToken. Jika set hasil terlalu besar dan responsnya
diberi nomor halaman, maka kolom nextSyncToken
hanya 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, 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 lakukan penomoran halaman melalui permintaan berikutnya hingga Anda menemukan
syncToken lain di halaman terakhir. Simpan syncToken ini untuk permintaan sinkronisasi
berikutnya.
Contoh berikut menunjukkan sinkronisasi berhalaman inkremental:
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 diperlukan oleh server
Server terkadang membatalkan validasi token sinkronisasi karena token telah habis masa berlakunya atau ada perubahan pada ACL terkait. Dalam kasus tersebut, server 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 sinkron dengan
library klien Java. Saat pertama kali
metode run() dipanggil, metode ini akan melakukan sinkronisasi penuh dan menyimpan token sinkronisasi.
Pada setiap eksekusi berikutnya, token sinkronisasi yang disimpan akan dimuat dan sinkronisasi inkremental akan dilakukan.
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 pengumpulan peristiwa, Anda dapat melakukan sinkronisasi lama dengan menyimpan
nilai kolom updated dari permintaan daftar peristiwa, lalu menggunakan
kolom updatedMin untuk mengambil peristiwa yang diperbarui. Pendekatan ini tidak lagi
direkomendasikan karena lebih rentan terhadap error (misalnya, tidak menerapkan
batasan kueri) dan hanya tersedia untuk peristiwa.