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

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

תוכן עניינים

סקירה כללית

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

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