Class Lock

তালা

পারস্পরিক বর্জন লকের একটি উপস্থাপনা।

এই ক্লাসটি স্ক্রিপ্টকে এটা নিশ্চিত করতে সাহায্য করে যে, কোডের একটি নির্দিষ্ট অংশ যেন একবারে শুধুমাত্র স্ক্রিপ্টটির একটি ইনস্ট্যান্সই এক্সিকিউট করে। এটি বিশেষত কলব্যাক এবং ট্রিগারের ক্ষেত্রে উপযোগী, যেখানে ব্যবহারকারীর কোনো কার্যকলাপ একটি শেয়ার্ড রিসোর্সে পরিবর্তন আনতে পারে এবং আপনি নিশ্চিত করতে চান যে সেখানে যেন কোনো সংঘর্ষ না ঘটে।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি ফর্ম সাবমিট হ্যান্ডলারে লক ব্যবহার করতে হয়।

// Generates a unique ticket number for every form submission.
function onFormSubmit(e) {
  const targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Gets a script lock before modifying a shared resource.
  const lock = LockService.getScriptLock();
  // Waits for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  const scriptProperties = PropertiesService.getScriptProperties();

  const ticketNumber =
      Number(scriptProperties.getProperty('lastTicketNumber')) + 1;
  scriptProperties.setProperty('lastTicketNumber', ticketNumber);

  // Releases the lock so that other processes can continue.
  lock.releaseLock();

  targetCell.setValue(ticketNumber);
}
Lock সার্ভিসটি না থাকলে, যদি দুজন ব্যবহারকারী প্রায় একই সময়ে ফর্ম জমা দেন, তাহলে তাদের টিকেট নম্বর একই হয়ে যেতে পারে; কারণ ScriptProperties থেকে lastTicketNumber প্রপার্টিটি পড়ার পর কিন্তু নতুন মানটি আবার লেখার আগে এটি পরিবর্তিত হয়ে যেতে পারে।

পদ্ধতি

পদ্ধতি রিটার্ন টাইপ সংক্ষিপ্ত বিবরণ
has Lock() Boolean লকটি অর্জিত হলে true রিটার্ন করে।
release Lock() void লকটি মুক্ত করে দেয়, ফলে লকটির জন্য অপেক্ষারত অন্যান্য প্রসেসগুলো তাদের কাজ চালিয়ে যেতে পারে।
try Lock(timeoutInMillis) Boolean লকটি অধিগ্রহণের প্রচেষ্টা, প্রদত্ত সংখ্যক মিলিসেকেন্ড পর সময়সীমা অতিক্রম করছে।
wait Lock(timeoutInMillis) void লকটি অধিগ্রহণের প্রচেষ্টা করা হলেও, নির্দিষ্ট সংখ্যক মিলিসেকেন্ড পর একটি ব্যতিক্রমের কারণে সময়সীমা শেষ হয়ে যায়।

বিস্তারিত ডকুমেন্টেশন

hasLock()

লকটি অর্জিত হলে true রিটার্ন করে। যদি tryLock(timeoutInMillis) বা waitLock(timeoutInMillis) কখনও কল করা না হয়, লকটি পুনরুদ্ধার করার আগেই টাইম আউট হয়ে যায়, অথবা releaseLock() কল করা হয়, তাহলে এই মেথডটি false রিটার্ন করে।

const lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

ফেরত

Boolean — লকটি অর্জিত হলে true , অন্যথায় false


releaseLock()

লকটি মুক্ত করে দেয়, ফলে লকটির জন্য অপেক্ষারত অন্যান্য প্রসেসগুলো তাদের কাজ চালিয়ে যেতে পারে। স্ক্রিপ্টটি শেষ হয়ে গেলে লকটি স্বয়ংক্রিয়ভাবে মুক্ত হয়ে যায়, কিন্তু কার্যকারিতার জন্য, কোডের কোনো অংশে বিশেষ অ্যাক্সেসের প্রয়োজন ফুরিয়ে যাওয়ার সাথে সাথেই এটি মুক্ত করে দেওয়া শ্রেয়। লকটি অধিগ্রহণ করা না হয়ে থাকলে এই পদ্ধতির কোনো প্রভাব থাকে না।

মনে রাখবেন, আপনি যদি কোনো স্প্রেডশীট নিয়ে কাজ করেন, তাহলে লকটি ছাড়ার আগে SpreadsheetApp.flush() কল করা উচিত, যাতে স্প্রেডশীটটিতে আপনার এক্সক্লুসিভ অ্যাক্সেস থাকা অবস্থাতেই সমস্ত মুলতুবি থাকা পরিবর্তনগুলি কমিট করা যায়।

const lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

লকটি অধিগ্রহণ করার চেষ্টা করা হয়, কিন্তু নির্দিষ্ট সংখ্যক মিলিসেকেন্ড পর সময়সীমা শেষ হয়ে যায়। যদি লকটি ইতিমধ্যেই অধিগ্রহণ করা হয়ে থাকে, তাহলে এই পদ্ধতিটি কার্যকর হয় না।

const lock = LockService.getScriptLock();
const success = lock.tryLock(10000);
if (!success) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

প্যারামিটার

নাম প্রকার বর্ণনা
timeout In Millis Integer লকটি অর্জন করতে কতক্ষণ অপেক্ষা করতে হবে, মিলিসেকেন্ডে।

ফেরত

Boolean — লকটি অর্জিত হলে true , অন্যথায় false


waitLock(timeoutInMillis)

লকটি অধিগ্রহণ করার চেষ্টা করা হয়, কিন্তু প্রদত্ত সংখ্যক মিলিসেকেন্ড পরে একটি এক্সেপশন সহ টাইম আউট হয়ে যায়। এই মেথডটি tryLock(timeoutInMillis) এর অনুরূপ, তবে পার্থক্য হলো, লকটি অধিগ্রহণ করা না গেলে এটি false রিটার্ন করার পরিবর্তে একটি এক্সেপশন থ্রো করে।

const lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

প্যারামিটার

নাম প্রকার বর্ণনা
timeout In Millis Integer লকটি অর্জন করতে কতক্ষণ অপেক্ষা করতে হবে, মিলিসেকেন্ডে।

নিক্ষেপ

Error — যদি লকটি অধিগ্রহণ করার আগেই মেথডটির সময়সীমা শেষ হয়ে যায়।