আমাদের সফ্টওয়্যারটিতে আমরা ওয়েব অনুরোধগুলির জন্য সেশন আইডি এবং ব্যবহারকারীর নামগুলির মতো জিনিসগুলি ট্র্যাক করতে এমডিসি ব্যবহার করি। মূল থ্রেডে চলার সময় এটি সূক্ষ্মভাবে কাজ করে। তবে, পটভূমিতে প্রক্রিয়া করা দরকার এমন অনেকগুলি বিষয় রয়েছে। আমরা ব্যবহার java.concurrent.ThreadPoolExecutor
এবং java.util.Timer
কিছু স্ব-ঘূর্ণিত ASYNC সঞ্চালনের পরিষেবার সঙ্গে বরাবর ক্লাস। এই সমস্ত পরিষেবা তাদের নিজস্ব থ্রেড পুল পরিচালনা করে।
এই জাতীয় পরিবেশে এমডিসি ব্যবহার সম্পর্কে লগব্যাকের ম্যানুয়ালটিতে এটিই বলা হয়েছে:
ম্যাপযুক্ত ডায়াগনস্টিক প্রসঙ্গে একটি অনুলিপি সর্বদা আরম্ভের থ্রেড থেকে কর্মী থ্রেড দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না। এটি যখন java.util.concurrent.Executors থ্রেড পরিচালনার জন্য ব্যবহৃত হয় তখনই এটি ঘটে। উদাহরণস্বরূপ, নতুনক্যাশডথ্রেডপুল পদ্ধতি একটি থ্রেডপুলএক্সেকিউটার তৈরি করে এবং অন্যান্য থ্রেড পুলিং কোডের মতো এটিতেও জটিল সূত্র তৈরির যুক্তি রয়েছে।
এই জাতীয় ক্ষেত্রে, সুপারিশ করা হয় যে MDC.getCopyOfContextMap () নির্বাহকের কাছে কোনও কার্য জমা দেওয়ার আগে মূল (মাস্টার) থ্রেডে ডাকা হবে। টাস্কটি যখন প্রথম ক্রিয়া হিসাবে চালিত হয়, তখন এটি MDC.setContextMapValues () কে নতুন এক্সিকিউটার পরিচালিত থ্রেডের সাথে মূল MDC মানগুলির সঞ্চিত অনুলিপি সংযুক্ত করতে অনুরোধ জানানো উচিত।
এটি ঠিক আছে তবে এই কলগুলি যুক্ত করা ভুলে যাওয়া খুব সহজ এবং সমস্যাটি খুব দেরি না হওয়া পর্যন্ত সনাক্ত করার সহজ উপায় নেই। লগ 4 জের সাথে একমাত্র সাইন হ'ল আপনি লগগুলিতে এমডিসি তথ্য হারিয়েছেন, এবং লগব্যাকের সাহায্যে আপনি বাসি MDC তথ্য পাবেন (যেহেতু ট্রেড পুলের থ্রেডটি প্রথমে চালানো প্রথম কাজ থেকে এটির MDC উত্তরাধিকার সূত্রে প্রাপ্ত)। উভয়ই একটি উত্পাদন ব্যবস্থায় গুরুতর সমস্যা।
আমি আমাদের পরিস্থিতি কোনওভাবেই বিশেষ দেখতে পাচ্ছি না, তবুও ওয়েবে এই সমস্যাটি সম্পর্কে আমি খুব বেশি খুঁজে পাই না। স্পষ্টতই, এটি এমন কিছু নয় যার বিরুদ্ধে অনেকেই ধাক্কা খায়, সুতরাং এটি এড়াতে অবশ্যই একটি উপায় থাকতে হবে। আমরা এখানে কি ভুল করছি?