চেইনিং কাজ

WorkManager আপনাকে কাজের একটি শৃঙ্খল তৈরি করতে এবং সারিবদ্ধ করতে দেয় যা একাধিক নির্ভরশীল কাজ নির্দিষ্ট করে এবং সেগুলিকে কোন ক্রমে চালানো উচিত তা সংজ্ঞায়িত করে৷ এই কার্যকারিতাটি বিশেষভাবে কার্যকর যখন আপনাকে একটি নির্দিষ্ট ক্রমে বেশ কয়েকটি কাজ চালানোর প্রয়োজন হয়৷

কাজের একটি শৃঙ্খল তৈরি করতে, আপনি WorkManager.beginWith(OneTimeWorkRequest) বা WorkManager.beginWith(List<OneTimeWorkRequest>) ব্যবহার করতে পারেন, যেটি প্রতিটি WorkContinuation এর একটি উদাহরণ প্রদান করে।

then(OneTimeWorkRequest) অথবা then(List<OneTimeWorkRequest>) ব্যবহার করে নির্ভরশীল OneTimeWorkRequest দৃষ্টান্ত যোগ করতে একটি WorkContinuation ব্যবহার করা যেতে পারে।

WorkContinuation.then(...) এর প্রতিটি আহ্বান WorkContinuation এর একটি নতুন উদাহরণ প্রদান করে। আপনি যদি OneTimeWorkRequest উদাহরণগুলির একটি List যোগ করেন, তাহলে এই অনুরোধগুলি সম্ভাব্যভাবে সমান্তরালভাবে চলতে পারে৷

অবশেষে, আপনি WorkContinuation.enqueue() পদ্ধতিটি ব্যবহার করতে পারেন আপনার WorkContinuation s-এর চেইনকে enqueue() করতে।

এর একটি উদাহরণ তাকান. এই উদাহরণে, 3টি ভিন্ন কর্মী কাজ চালানোর জন্য কনফিগার করা হয়েছে (সম্ভাব্যভাবে সমান্তরালভাবে)। এই শ্রমিকদের ফলাফল তারপর যোগদান করা হয় এবং একটি ক্যাশিং ওয়ার্কার চাকরিতে চলে যায়। অবশেষে, সেই কাজের আউটপুট একটি আপলোড ওয়ার্কারে পাস করা হয়, যা ফলাফলগুলি একটি দূরবর্তী সার্ভারে আপলোড করে।

কোটলিন


WorkManager.getInstance(myContext)
   // Candidates to run in parallel
   .beginWith(listOf(plantName1, plantName2, plantName3))
   // Dependent work (only runs after all previous work in chain)
   .then(cache)
   .then(upload)
   // Call enqueue to kick things off
   .enqueue()

জাভা


WorkManager.getInstance(myContext)
   // Candidates to run in parallel
   .beginWith(Arrays.asList(plantName1, plantName2, plantName3))
   // Dependent work (only runs after all previous work in chain)
   .then(cache)
   .then(upload)
   // Call enqueue to kick things off
   .enqueue();

ইনপুট একত্রীকরণ

আপনি যখন OneTimeWorkRequest দৃষ্টান্তগুলি চেইন করেন, তখন পিতামাতার কাজের অনুরোধের আউটপুট বাচ্চাদের ইনপুট হিসাবে প্রেরণ করা হয়। সুতরাং উপরের উদাহরণে, plantName1 , plantName2 , এবং plantName3 এর আউটপুটগুলি cache অনুরোধে ইনপুট হিসাবে প্রেরণ করা হবে।

একাধিক অভিভাবক কাজের অনুরোধ থেকে ইনপুট পরিচালনা করার জন্য, WorkManager InputMerger ব্যবহার করে।

WorkManager দ্বারা প্রদত্ত দুটি ভিন্ন ধরনের InputMerger আছে:

  • OverwritingInputMerger সমস্ত ইনপুট থেকে আউটপুটে সমস্ত কী যোগ করার চেষ্টা করে। দ্বন্দ্বের ক্ষেত্রে, এটি পূর্বে সেট করা কীগুলিকে ওভাররাইট করে।

  • ArrayCreatingInputMerger ইনপুটগুলিকে একত্রিত করার চেষ্টা করে, প্রয়োজনে অ্যারে তৈরি করে।

আপনার যদি আরও নির্দিষ্ট ব্যবহারের ক্ষেত্রে থাকে, তাহলে আপনি InputMerger সাবক্লাস করে নিজের লিখতে পারেন।

ওভাররাইটিং ইনপুট মার্জার

OverwritingInputMerger হল ডিফল্ট মার্জার পদ্ধতি। যদি একত্রীকরণে মূল দ্বন্দ্ব থাকে, তাহলে একটি কী-এর সর্বশেষ মান ফলস্বরূপ আউটপুট ডেটার পূর্ববর্তী সংস্করণগুলিকে ওভাররাইট করবে।

উদাহরণ স্বরূপ, যদি প্ল্যান্ট ইনপুটগুলির প্রতিটিতে তাদের নিজ নিজ ভেরিয়েবল নামের সাথে মিলে যাওয়া একটি কী থাকে ( "plantName1" , "plantName2" , এবং "plantName3" ), তাহলে cache কর্মীর কাছে পাঠানো ডেটাতে তিনটি কী-মান জোড়া থাকবে৷

শৃঙ্খলে পরবর্তী চাকরিতে বিভিন্ন আউটপুট পাস করে তিনটি কাজ দেখানো ডায়াগ্রাম। যেহেতু তিনটি আউটপুট আলাদা আলাদা কী আছে, তাই পরবর্তী কাজ তিনটি কী/মান জোড়া পায়।

যদি একটি দ্বন্দ্ব হয়, তাহলে শেষ কর্মী "জয়" সম্পূর্ণ করবে, এবং এর মান cache পাস করা হবে।

শৃঙ্খলে পরের চাকরিতে তিনটি কাজের আউটপুট পাস করা ডায়াগ্রাম। এই ক্ষেত্রে, সেই দুটি কাজ একই কী দিয়ে আউটপুট তৈরি করে। ফলস্বরূপ, পরের কাজ দুটি কী/মান জোড়া পায়, যার মধ্যে একটি বিরোধপূর্ণ আউটপুট বাদ দেওয়া হয়।

আপনার কাজের অনুরোধগুলি সমান্তরালভাবে চালানোর কারণে, এটি যে ক্রমানুসারে চলে তার জন্য আপনার কাছে কোনো নিশ্চয়তা নেই। উপরের উদাহরণে, plantName1 "tulip" বা "elm" এর একটি মান ধরে রাখতে পারে, কোন মানটি শেষ লেখা হয়েছে তার উপর নির্ভর করে। আপনার যদি একটি মূল বিরোধের সম্ভাবনা থাকে এবং আপনাকে একটি মার্জারে সমস্ত আউটপুট ডেটা সংরক্ষণ করতে হবে, তাহলে ArrayCreatingInputMerger একটি ভাল বিকল্প হতে পারে।

ArrayCreatingInputMerger

উপরের উদাহরণের জন্য, প্রদত্ত যে আমরা সমস্ত প্ল্যান্ট নাম শ্রমিকদের থেকে আউটপুট সংরক্ষণ করতে চাই, আমাদের একটি ArrayCreatingInputMerger ব্যবহার করা উচিত।

কোটলিন


val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilder<PlantWorker>()
   .setInputMerger(ArrayCreatingInputMerger::class)
   .setConstraints(constraints)
   .build()

জাভা


OneTimeWorkRequest cache = new OneTimeWorkRequest.Builder(PlantWorker.class)
       .setInputMerger(ArrayCreatingInputMerger.class)
       .setConstraints(constraints)
       .build();

ArrayCreatingInputMerger একটি অ্যারের সাথে প্রতিটি কী জোড়া দেয়। যদি প্রতিটি কী অনন্য হয়, তাহলে আপনার ফলাফল হল এক-উপাদান অ্যারেগুলির একটি সিরিজ।

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

যদি কোন মূল সংঘর্ষ হয়, তাহলে যেকোন সংশ্লিষ্ট মানগুলিকে একটি অ্যারেতে একত্রিত করা হয়।

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

চেইনিং এবং কাজের স্থিতি

OneTimeWorkRequest এর চেইনগুলি যতক্ষণ পর্যন্ত তাদের কাজ সফলভাবে শেষ হয় ততক্ষণ পর্যন্ত ক্রমানুসারে চালায় (অর্থাৎ, তারা একটি Result.success() ) ফেরত দেয়। চলমান অবস্থায় কাজের অনুরোধ ব্যর্থ হতে পারে বা বাতিল হতে পারে, যা নির্ভরশীল কাজের অনুরোধের উপর প্রভাব ফেলে।

যখন প্রথম OneTimeWorkRequest একটি কাজের অনুরোধের শৃঙ্খলে সারিবদ্ধ থাকে, তখন সেই প্রথম কাজের অনুরোধের কাজ সম্পূর্ণ না হওয়া পর্যন্ত পরবর্তী সমস্ত কাজের অনুরোধ অবরুদ্ধ থাকে।

চাকরীর একটি শৃঙ্খল দেখানো চিত্র। প্রথম কাজ সারিবদ্ধ; প্রথমটি শেষ না হওয়া পর্যন্ত সব ধারাবাহিক কাজ ব্লক করা হয়।

একবার সারিবদ্ধ হয়ে গেলে এবং সমস্ত কাজের সীমাবদ্ধতা সন্তুষ্ট হলে, প্রথম কাজের অনুরোধটি চলতে শুরু করে। যদি কাজ সফলভাবে রুট OneTimeWorkRequest বা List<OneTimeWorkRequest> (অর্থাৎ, এটি একটি Result.success() প্রদান করে) সম্পন্ন হয়, তাহলে নির্ভরশীল কাজের অনুরোধের পরবর্তী সেট সারিবদ্ধ হবে।

চাকরীর একটি শৃঙ্খল দেখানো চিত্র। প্রথম কাজ সফল হয়েছে, এবং এর দুই অবিলম্বে উত্তরসূরি সারিবদ্ধ। অবশিষ্ট কাজ তাদের পূর্ববর্তী কাজ শেষ অবরুদ্ধ করা হয়.

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

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

চাকরীর একটি শৃঙ্খল দেখানো চিত্র। একটি কাজ ব্যর্থ হয়েছে, কিন্তু একটি ব্যাকঅফ নীতি সংজ্ঞায়িত ছিল। উপযুক্ত সময় পেরিয়ে যাওয়ার পরে সেই কাজটি পুনরায় চালু হবে। এটি সফলভাবে চালানো না হওয়া পর্যন্ত চেইনের পরে কাজগুলি ব্লক করা হয়।

কাস্টম পুনঃপ্রচেষ্টার কৌশল সংজ্ঞায়িত করার বিষয়ে আরও তথ্যের জন্য, পুনঃচেষ্টা এবং ব্যাকঅফ নীতি দেখুন।

যদি সেই পুনঃপ্রচেষ্টা নীতিটি অনির্ধারিত বা নিঃশেষ হয়ে যায়, অথবা আপনি অন্যথায় এমন কিছু অবস্থায় পৌঁছান যেখানে একটি OneTimeWorkRequest Result.failure() প্রদান করে, তাহলে সেই কাজের অনুরোধ এবং সমস্ত নির্ভরশীল কাজের অনুরোধগুলি FAILED.

চাকরীর একটি শৃঙ্খল দেখানো চিত্র। একটি কাজ ব্যর্থ হয়েছে এবং পুনরায় চেষ্টা করা যাবে না। ফলস্বরূপ, চেইনের পরে সমস্ত কাজও ব্যর্থ হয়।

একই যুক্তি প্রযোজ্য যখন একটি OneTimeWorkRequest বাতিল করা হয়। যেকোন নির্ভরশীল কাজের অনুরোধগুলিও CANCELLED হিসাবে চিহ্নিত করা হয়েছে এবং তাদের কাজ কার্যকর করা হবে না।

চাকরীর একটি শৃঙ্খল দেখানো চিত্র। একটি চাকরি বাতিল করা হয়েছে। ফলস্বরূপ, চেইনের পরে সমস্ত চাকরিও বাতিল করা হয়।

মনে রাখবেন যে আপনি যদি এমন একটি চেইনে আরও কাজের অনুরোধ যুক্ত করেন যা ব্যর্থ হয়েছে বা কাজের অনুরোধ বাতিল করেছে, তাহলে আপনার নতুন যুক্ত কাজের অনুরোধটিকেও যথাক্রমে FAILED বা CANCELLED চিহ্নিত করা হবে। আপনি যদি একটি বিদ্যমান চেইনের কাজকে প্রসারিত করতে চান, তাহলে ExistingWorkPolicy-APPEND_OR_REPLACE দেখুন।

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

আরও তথ্যের জন্য, কাজ বাতিল করা এবং বন্ধ করা দেখুন।