संसाधनों को कुशलता से समन्वयित करें

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

इस गाइड में, कैलेंडर डेटा को "इंक्रीमेंटल (बढ़ने वाली) सिंक करने की सुविधा" लागू करने का तरीका बताया गया है. इस तरीके का इस्तेमाल करके, आप बैंडविड्थ सेव करते समय सभी कैलेंडर संग्रहों का डेटा सिंक करके रख सकते हैं.

विषय सूची

खास जानकारी

इंक्रीमेंटल सिंक में दो चरण होते हैं:

  1. क्लाइंट की स्थिति को सर्वर की स्थिति से पूरी तरह सिंक करने के लिए, शुरुआत में एक बार पूरी तरह सिंक किया जाता है. क्लाइंट को एक सिंक टोकन मिलेगा, जिसे उसे बनाए रखना होगा.

  2. इंक्रीमेंटल सिंक को बार-बार किया जाता है. साथ ही, यह क्लाइंट को पिछले सिंक के बाद हुए सभी बदलावों को अपडेट करता है. हर बार, क्लाइंट सर्वर से मिला पिछला सिंक टोकन देता है और रिस्पॉन्स से नया सिंक टोकन सेव करता है.

शुरुआत में पूरा सिंक करें

शुरुआती पूरा सिंक, उन सभी संसाधनों के लिए मूल अनुरोध होता है जिन्हें आप सिंक करना चाहते हैं. अगर आपको सिर्फ़ संसाधनों के किसी खास सबसेट को सिंक करना है, तो अनुरोध के पैरामीटर का इस्तेमाल करके सूची के अनुरोध को सीमित किया जा सकता है.

सूची में मौजूद कार्रवाई के जवाब में आपको nextSyncToken नाम का एक फ़ील्ड मिलेगा. यह फ़ील्ड, सिंक टोकन को दिखाता है. आपको nextSyncToken की वैल्यू को स्टोर करना होगा. अगर नतीजे का सेट बहुत बड़ा है और जवाब में पेज पर नंबर डाला गया है, तो nextSyncToken फ़ील्ड सिर्फ़ आखिरी पेज पर मौजूद होता है.

इंक्रीमेंटल सिंक

इंक्रीमेंटल सिंक की सुविधा की मदद से, उन सभी संसाधनों को फिर से पाया जा सकता है जिनमें सिंक के पिछले अनुरोध के बाद से बदलाव किए गए थे. ऐसा करने के लिए, आपको syncToken फ़ील्ड में बताए गए सबसे हाल के सिंक टोकन की मदद से सूची का अनुरोध करना होगा. ध्यान रखें कि इस नतीजे में हमेशा मिटाई गई एंट्री शामिल होंगी, ताकि क्लाइंट उन्हें स्टोरेज से हटा सकें.

ऐसे मामलों में जहां सिंक करने के पिछले अनुरोध के बाद बड़ी संख्या में संसाधन बदल गए हों, वहां आपको सूची के नतीजे में syncToken के बजाय pageToken दिख सकता है. इन मामलों में, आपको ठीक वैसा ही सूची क्वेरी करना होगा, जैसा कि इंक्रीमेंटल सिंक में पहले पेज को वापस पाने के लिए इस्तेमाल किया गया था (ठीक उसी syncToken के साथ), pageToken को इसमें जोड़ें और जब तक आपको आखिरी पेज पर कोई दूसरा syncToken नहीं मिल जाता, तब तक नीचे दिए गए सभी अनुरोधों को क्रम में लगाएं. आने वाले समय में सिंक करने के अगले अनुरोध के लिए, syncToken को ज़रूर सेव कर लें.

यहां उदाहरण के तौर पर उन मामलों की क्वेरी दी गई हैं जिनमें पेज पर नंबर डालकर सिंक करने की ज़रूरत होती है:

मूल क्वेरी

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

// Result contains the following

"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",

अगला पेज वापस लाया जा रहा है

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

सर्वर के लिए पूरा सिंक करना ज़रूरी है

कभी-कभी, सर्वर के ज़रिए सिंक टोकन अमान्य हो जाते हैं. इसकी कई वजहें होती हैं. जैसे, टोकन की समयसीमा खत्म होना या उनसे जुड़े एसीएल में बदलाव. ऐसे मामलों में सर्वर, रिस्पॉन्स कोड 410 के साथ इंक्रीमेंटल (बढ़ने वाले) अनुरोध का जवाब देगा. इससे क्लाइंट के स्टोर को पूरी तरह से वाइप किया जाएगा और एक नया सिंक शुरू होगा.

नमूना कोड

नीचे, सैंपल कोड का स्निपेट दिखाता है कि Java क्लाइंट लाइब्रेरी के साथ सिंक टोकन का इस्तेमाल कैसे किया जाता है. दौड़ के तरीके को पहली बार कॉल करने पर, वह पूरा सिंक करेगा और सिंक टोकन को सेव करेगा. बाद के हर एक्ज़ीक्यूशन पर, यह सेव किए गए सिंक टोकन को लोड करेगा और एक इंक्रीमेंटल सिंक करेगा.

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

लेगसी सिंक

इवेंट कलेक्शन के लिए, अब भी लेगसी तरीके से सिंक किया जा सकता है. ऐसा करने के लिए, अपडेट किए गए फ़ील्ड की वैल्यू को इवेंट की सूची के अनुरोध से सुरक्षित रखें. इसके बाद, अपडेट किए गए इवेंट को फिर से पाने के लिए, modifiedSince फ़ील्ड का इस्तेमाल करें. इस तरीके का सुझाव अब नहीं दिया जाता है, क्योंकि इससे छूटे हुए अपडेट (उदाहरण के लिए, अगर क्वेरी से जुड़ी पाबंदियां लागू नहीं होती हैं) के मामले में गड़बड़ी होने की ज़्यादा संभावना होती है. इसके अलावा, यह सिर्फ़ इवेंट के लिए उपलब्ध है.