סנכרון יעיל של משאבים

במדריך הזה מוסבר איך להטמיע 'סנכרון מצטבר' של נתוני היומן. שימוש בטיוטה הזו שיטה זו מאפשרת לשמור את הנתונים של כל אוספים של יומנים מסונכרנים בזמן השמירה רוחב פס.

תוכן עניינים

סקירה כללית

סנכרון מצטבר מורכב משני שלבים:

  1. סנכרון מלא ראשוני מבוצע פעם אחת בהתחלה כדי לסנכרן את המצב של הלקוח עם המצב של השרת. הלקוח יקבל אסימון סנכרון שצריך לשמור עליו.

  2. הסנכרון המצטבר מתבצע שוב ושוב ומעדכן את הלקוח בכל את השינויים שהתרחשו מאז הסנכרון הקודם. בכל פעם הלקוח מספק את אסימון הסנכרון הקודם שהוא קיבל מהשרת ושומר את אסימון הסנכרון החדש מהתגובה.

סנכרון מלא ראשוני

הסנכרון המלא הראשוני הוא הבקשה המקורית לכל המשאבים של האוסף שרוצים לסנכרן. אפשר להגביל את הרשימה אם רוצים של הבקשה באמצעות פרמטרים של בקשה, אם רוצים לסנכרן תת-קבוצה של משאבים.

בתגובה לפעולת הרשימה יופיע שדה בשם nextSyncToken מייצג אסימון סנכרון. צריך לאחסן את הערך של nextSyncToken אם קבוצת התוצאות גדולה מדי והתשובה מקבלת לעימוד, ואז nextSyncToken מוצג רק בדף האחרון.

סנכרון מצטבר

סנכרון מצטבר מאפשר לכם לאחזר את כל המשאבים השתנה מאז בקשת הסנכרון האחרונה. לשם כך, צריך ליצור רשימה בקשה עם אסימון הסנכרון האחרון שצוין בשדה syncToken. חשוב לזכור שהתוצאה תמיד תכיל רשומות שנמחקו, כדי הלקוחות מקבלים הזדמנות להסיר אותם מנפח האחסון.

במקרים שבהם מספר גדול של משאבים השתנו מאז הפעם האחרונה בקשת סנכרון מצטבר, עשויה להופיע בתוצאת הרשימה pageToken במקום syncToken. במקרים כאלה, תצטרכו לבצע את אותן הפעולות שאילתה של רשימה שבה נעשה שימוש לאחזור הדף הראשון בסנכרון המצטבר (עם אותו 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

נדרש סנכרון מלא על ידי השרת

לפעמים השרת מבטל את התוקף של אסימוני סנכרון מסיבות שונות כולל תפוגת אסימון או שינויים ברשימות ACL קשורות. במקרים כאלה, השרת יגיב לבקשה מצטברת עם קוד תגובה 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 כדי לאחזר אירועים מעודכנים. הגישה הזו לא מומלצת יותר, כי יש חשיבות רבה יותר לשגיאות. אל עדכונים שהוחמצו (לדוגמה, אם לא אוכפת הגבלות על שאילתות). בנוסף, הוא זמין רק לאירועים.