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

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

বিষয়বস্তু

সংক্ষিপ্ত বিবরণ

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

  1. প্রাথমিক পূর্ণ সিঙ্ক : ক্লায়েন্ট স্টেটকে সার্ভার স্টেটের সাথে সম্পূর্ণরূপে সিঙ্ক্রোনাইজ করার জন্য শুরুতে একবার এটি করা হয়। ক্লায়েন্ট একটি সিঙ্ক টোকেন পায় যা তাকে অবশ্যই সংরক্ষণ করতে হবে।

  2. ইনক্রিমেন্টাল সিঙ্ক : পূর্ববর্তী সিঙ্কের পর থেকে হওয়া সমস্ত পরিবর্তন দিয়ে ক্লায়েন্টকে আপডেট করার জন্য এটি বারবার করা হয়। প্রতিবার, ক্লায়েন্ট সার্ভার থেকে প্রাপ্ত পূর্ববর্তী সিঙ্ক টোকেনটি প্রদান করে এবং রেসপন্স থেকে নতুন সিঙ্ক টোকেনটি সংরক্ষণ করে।

প্রাথমিক পূর্ণ সিঙ্ক

প্রাথমিক পূর্ণ সিঙ্ক হলো কালেকশনের সেই সমস্ত রিসোর্সের জন্য করা মূল অনুরোধ, যা আপনি সিঙ্ক্রোনাইজ করতে চান। আপনি যদি শুধুমাত্র রিসোর্সের একটি নির্দিষ্ট উপসেট সিঙ্ক্রোনাইজ করতে চান, তবে অনুরোধ প্যারামিটার ব্যবহার করে ঐচ্ছিকভাবে তালিকার অনুরোধটি সীমিত করতে পারেন।

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

ক্রমবর্ধমান সিঙ্ক

ইনক্রিমেন্টাল সিঙ্ক আপনাকে শেষ সিঙ্ক অনুরোধের পর থেকে পরিবর্তিত হওয়া সমস্ত রিসোর্স পুনরুদ্ধার করতে দেয়। এটি করার জন্য, syncToken ফিল্ডে আপনার সবচেয়ে সাম্প্রতিক সিঙ্ক টোকেন উল্লেখ করে একটি তালিকা অনুরোধ করুন। মনে রাখবেন যে ফলাফলে সর্বদা মুছে ফেলা এন্ট্রি থাকে, তাই ক্লায়েন্টরা স্টোরেজ থেকে সেগুলি সরিয়ে ফেলতে পারে।

যেসব ক্ষেত্রে শেষ ইনক্রিমেন্টাল সিঙ্ক অনুরোধের পর থেকে প্রচুর সংখ্যক রিসোর্স পরিবর্তিত হয়েছে, সেখানে আপনি তালিকার ফলাফলে syncToken এর পরিবর্তে একটি pageToken খুঁজে পেতে পারেন। এই ক্ষেত্রে, ইনক্রিমেন্টাল সিঙ্কের প্রথম পৃষ্ঠাটি (একই syncToken সহ) পুনরুদ্ধার করতে ব্যবহৃত একই তালিকা কোয়েরিটি চালান, এর সাথে pageToken যুক্ত করুন এবং পরবর্তী অনুরোধগুলির মাধ্যমে পেজিনেট করতে থাকুন যতক্ষণ না আপনি শেষ পৃষ্ঠায় আরেকটি syncToken খুঁজে পান। পরবর্তী সিঙ্ক অনুরোধের জন্য এই syncToken সংরক্ষণ করুন।

নিম্নলিখিত উদাহরণগুলি একটি ক্রমবর্ধমান পৃষ্ঠাঙ্কিত সিঙ্ক প্রদর্শন করে:

মূল প্রশ্ন

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

ফলাফলে নিম্নলিখিত বিষয়গুলো রয়েছে:

{
  "nextPageToken": "CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA"
}

পরবর্তী পৃষ্ঠা পুনরুদ্ধার করা হচ্ছে

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

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

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

নমুনা কোড

নিম্নলিখিত নমুনাটি জাভা ক্লায়েন্ট লাইব্রেরির সাথে সিঙ্ক টোকেন কীভাবে ব্যবহার করতে হয় তা প্রদর্শন করে। প্রথমবার যখন run() মেথডটি কল করা হয়, তখন এটি একটি সম্পূর্ণ সিঙ্ক সম্পাদন করে এবং সিঙ্ক টোকেনটি সংরক্ষণ করে। পরবর্তী প্রতিটি এক্সিকিউশনে, এটি সংরক্ষিত সিঙ্ক টোকেনটি লোড করে এবং একটি ইনক্রিমেন্টাল সিঙ্ক সম্পাদন করে।

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

লিগ্যাসি সিঙ্ক্রোনাইজেশন

ইভেন্ট কালেকশনের জন্য, আপনি একটি ইভেন্ট লিস্ট রিকোয়েস্ট থেকে ' updated ' ফিল্ডের মান সেভ করে এবং তারপর updatedMin ' ফিল্ড ব্যবহার করে আপডেটেড ইভেন্টগুলো পুনরুদ্ধার করার মাধ্যমে লিগ্যাসি সিনক্রোনাইজেশন সম্পাদন করতে পারেন। এই পদ্ধতিটি এখন আর সুপারিশ করা হয় না, কারণ এতে ভুলের সম্ভাবনা বেশি (উদাহরণস্বরূপ, এটি কোয়েরি সীমাবদ্ধতা প্রয়োগ করে না) এবং এটি শুধুমাত্র ইভেন্টের জন্যই উপলব্ধ।