সম্পদগুলি দক্ষতার সাথে সিঙ্ক্রোনাইজ করুন

এই নির্দেশিকা বর্ণনা করে কিভাবে ক্যালেন্ডার ডেটার "ক্রমবর্ধমান সিঙ্ক্রোনাইজেশন" প্রয়োগ করতে হয়। এই পদ্ধতিটি ব্যবহার করে, আপনি ব্যান্ডউইথ সংরক্ষণ করার সময় সমস্ত ক্যালেন্ডার সংগ্রহের ডেটা সিঙ্কে রাখতে পারেন।

বিষয়বস্তু

ওভারভিউ

ক্রমবর্ধমান সিঙ্ক্রোনাইজেশন দুটি পর্যায়ে গঠিত:

  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

সার্ভার দ্বারা সম্পূর্ণ সিঙ্ক প্রয়োজন

কখনও কখনও সিঙ্ক টোকেনগুলি সার্ভার দ্বারা অবৈধ হয়ে যায়, টোকেনের মেয়াদ শেষ হওয়া বা সম্পর্কিত ACL এর পরিবর্তন সহ বিভিন্ন কারণে। এই ধরনের ক্ষেত্রে, সার্ভার একটি প্রতিক্রিয়া কোড 410 সহ একটি ক্রমবর্ধমান অনুরোধের প্রতিক্রিয়া জানাবে। এটি ক্লায়েন্টের স্টোরের একটি সম্পূর্ণ মুছা এবং একটি নতুন সম্পূর্ণ সিঙ্ক ট্রিগার করবে৷

কোডের উদাহরণ

নিচের নমুনা কোডের স্নিপেট প্রদর্শন করে কিভাবে জাভা ক্লায়েন্ট লাইব্রেরির সাথে সিঙ্ক টোকেন ব্যবহার করতে হয়। প্রথমবার রান পদ্ধতি বলা হয় এটি একটি সম্পূর্ণ সিঙ্ক সঞ্চালন করবে এবং সিঙ্ক টোকেন সংরক্ষণ করবে। প্রতিটি পরবর্তী সম্পাদনে এটি সংরক্ষিত সিঙ্ক টোকেন লোড করবে এবং একটি ক্রমবর্ধমান সিঙ্ক সঞ্চালন করবে।

  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 ক্ষেত্রটি ব্যবহার করে লিগ্যাসি পদ্ধতিতে সিঙ্ক্রোনাইজেশন করা এখনও সম্ভব। এই পদ্ধতিটি আর সুপারিশ করা হয় না কারণ এটি মিস করা আপডেটের ক্ষেত্রে বেশি ত্রুটি-প্রবণ (উদাহরণস্বরূপ যদি ক্যোয়ারী সীমাবদ্ধতা প্রয়োগ না করে)। উপরন্তু, এটা শুধুমাত্র ইভেন্টের জন্য উপলব্ধ.