معاملات عملیاتی در یک برنامه قاطر هستند که نتیجه آن نمی تواند نامشخص باشد. هنگامی که یک سری مراحل در یک جریان باید به عنوان یک واحد موفق یا شکست بخورد ، قاطر از یک معامله برای مشخص کردن آن واحد استفاده می کند.
به عنوان مثال ، شما ممکن است از یک معامله برای محاصره چندین مرحله در جریان استفاده کنید که منجر به ارتکاب اطلاعات به یک پایگاه داده می شود. در این نوع سناریو ، تعهد (یا معامله) کاملاً کامل و موفق است ، یا ناقص است و شکست می خورد. حتی اگر تا حدی کامل شود ، تعهد شکست می خورد. هنگامی که یک معامله با شکست مواجه شد ، قاطر عملیات را در معامله باز می گرداند تا هیچ بخشی از تکمیل جزئی نتیجه بگیرد.
یک الگوی قابلیت اطمینان را برای طراحی برنامه خود پیاده سازی کنید ، بنابراین قادر به پیام رسانی قابل اعتماد است ، حتی اگر برنامه پیام هایی را از یک کانکتور غیر تعاملی دریافت کند.
همچنین می توانید Bitronix را برای مدیریت معاملات در برنامه قاطر خود پیکربندی کنید.
انواع معامله
MULE از انواع معاملات یک منبع (محلی ، پیش فرض) و معماری گسترده (XA) (TransactionType) پشتیبانی می کند. تنها مؤلفه هایی که می توانند نوع معامله را تعریف کنند ، منابع پیام هستند (به عنوان مثال ، JMS: شنونده و VM: شنونده) و دامنه آزمایش.
در جدول زیر ویژگی های هر نوع معامله و موارد لازم برای عملیاتی برای پیوستن به معامله شرح داده شده است:
عملکرد بهتری از معاملات XA دارد.
از معاملات تو در تو پشتیبانی نمی کند.
عملیات باید از معاملات پشتیبانی کند.
کلیه عملیات داخل معامله باید متعلق به همان کانکتور باشد.(به عنوان مثال JMS: شنونده ، JMS: مصرف و JMS: انتشار).
همه عملیات باید از همان پیکربندی جهانی (Config-Ref) استفاده کنند.
شامل استفاده از یک پروتکل تعهد دو فاز (2pc) است.
آهسته تر اما قابل اطمینان تر از معاملات منابع واحد.
از معاملات تو در تو پشتیبانی می کند.
عملیات باید از معاملات پشتیبانی کند.
اقدامات معامله ای
یک اقدام معامله ای (TransactionAction) نوع عملی را که در مورد معاملات انجام می دهد تعریف می کند. در جدول زیر کلیه اقدامات معامله ای موجود شرح داده شده است:
همیشه هنگام دریافت پیام یک معامله جدید را شروع کنید. اگر یک معامله منبع واحد وجود داشته باشد ، خطایی رخ می دهد. اگر معامله XA وجود داشته باشد ، معامله تو در تو ایجاد می شود.
شنوندگان که از معاملات پشتیبانی می کنند
همیشه انتظار داشته باشید که هنگام دریافت پیام ، معامله در حال انجام باشد. در صورت عدم معامله ، خطایی رخ می دهد.
عملیاتی که از معاملات پشتیبانی می کنند
اگر هنگام دریافت پیام ، معامله ای در حال انجام است ، در صورت امکان به معامله بپیوندید. در غیر این صورت ، یک معامله جدید را شروع کنید.
در صورت موجود بودن به معامله فعلی بپیوندید. در غیر این صورت ، هیچ معامله ای ایجاد نمی شود.
عملیاتی که از معاملات پشتیبانی می کنند
با اقدامات به عنوان معامله رفتار نکنید.
معامله را آغاز نکنید.
شنوندگان که از معاملات پشتیبانی می کنند
در خارج از هر معامله موجود اجرا کنید.
عملیاتی که از معاملات پشتیبانی می کنند
پیکربندی معامله در منبع پیام
می توانید معامله را از منبع پیام شروع کنید. در این حالت ، کل جریان به یک معامله تبدیل می شود. این کار هنگام کار با اتصالات پیام رسانی مفید است تا در صورت بروز مشکل هنگام پردازش ، از مصرف پیام جلوگیری کنید ، به شما امکان می دهد بعداً دوباره امتحان کنید (به دلیل بازگشت).
برای شروع معامله از منبع پیام ، نوع معامله و اقدامات معامله خود را پیکربندی کنید:
در Anypoint Studio
برگه پیشرفته شنونده را باز کنید و نوع معامله و مقادیر عمل معامله را تنظیم کنید:

در پیکربندی XML
عنصر TransactionAction و عنصر TransactionType (در صورت لزوم) را اضافه کنید و مقادیر آنها را تنظیم کنید.
مثال XML در زیر یک VM را نشان می دهد: منبع پیام شنونده پیکربندی شده برای شروع یک منبع واحد (محلی):
پیکربندی یک معامله در یک محدوده آزمایش
یک جریان قاطر همچنین می تواند با یک کانکتور غیر تعامل (مانند HTTP) شروع شود که به یک معامله در جریان نیاز دارد. به عنوان مثال ، یک جریان قاطر ممکن است اطلاعات مربوط به یک سرویس وب خارجی را بپذیرد ، سپس قبل از شارژ کارت اعتباری و ذخیره اطلاعات فاکتور به یک پایگاه داده ، داده ها را تبدیل کند. در چنین شرایطی ، شما از محدوده تلاش برای تنظیم معامله با بسته بندی شارژ کارت اعتباری و عملیات تعهد پایگاه داده در یک معامله استفاده می کنید تا از موفقیت کامل یا عدم موفقیت کامل و بازگشت مجدد اطمینان حاصل شود.
شما می توانید با تنظیم یک نوع معامله و اقدامات معامله ، یک معامله را در یک مؤلفه دامنه آزمایش پیکربندی کنید:
در Anypoint Studio
برگه عمومی Try Scope را باز کنید و نوع معامله و مقادیر عمل معامله را تنظیم کنید:

در پیکربندی XML
عنصر TransactionAction و عنصر TransactionType (در صورت لزوم) را اضافه کنید و مقادیر آنها را تنظیم کنید.
در مثال XML زیر ، دامنه آزمایش معامله ای را شامل می شود که شامل یک عملیات پایگاه داده (DB: INSERT) و یک عملیات VM (VM: Publish) است. در صورت موفقیت کل فرآیند ، هر دو مورد استفاده می شوند ، یا در صورت بروز خطایی در محدوده آزمایش ، هیچ کدام اعمال نمی شوند:
چگونه معاملات بر دامنه ها و روترها تأثیر می گذارد
هنگام کار در دامنه معامله ، کل فرآیند باید در همان موضوع اجرا شود. این می تواند نحوه اجرای یک دامنه یا نحوه انجام معامله را تغییر دهد. در زیر رفتار اسکوپ ها و روترهایی که باید هنگام اجرای در یک محدوده معامله ای در نظر بگیرید ، به تفصیل شرح داده شده است:
دامنه
ASYNC: هنگام اجرای یک معامله ، دامنه Async همچنان در یک موضوع دیگر اجرا می شود (ناهمزمان باقی می ماند). با این حال ، این بدان معنی است که کل اجرای پردازنده ها در این محدوده خارج از محدوده معامله است. بنابراین ، هر خطایی که در محدوده Async ایجاد می شود منجر به بازگشت مجدد نمی شود.
تا زمان موفقیت: هنگام اجرای در یک معامله ، دامنه موفقیت آمیز موضوع را مسدود می کند. این بدان معناست که از نخ مورد استفاده در این اجرا نمی توان برای پردازش هر درخواست دیگر استفاده کرد در حالی که تا زمانی که دامنه موفقیت آمیز تاخیر بین ترمیم ها انجام شود.
موازی foreach: هنگام اجرای در یک معامله ، دامنه موازی موازی به صورت موازی اجرا نمی شود. این بدان معنی است که آن را به عنوان دامنه foreach اجرا می کند: عنصر دوم مجموعه پس از پایان اولین مورد پردازش می شود. این بر نحوه برخورد این دامنه خطاها تأثیر نمی گذارد.
پردازش دسته ای: از آنجا که پردازش دسته ای به گونه ای طراحی شده است که به صورت موازی به عنوان دامنه ASYNC کار کند ، و هر سابقه ای به صورت معامله (با معاملات دسته ای داخلی) رفتار می شود ، اجرای دسته ای جزئی از معامله نیست.
روتر
پراکندگی جمع آوری: هنگام اجرای یک معامله ، جمع آوری پراکنده به طور موازی اجرا نمی شود. این بدان معناست که مسیر دوم پس از پردازش اول اجرا می شود ، سوم بعد از دوم و غیره. این بر نحوه رسیدگی به این مؤلفه ها تأثیر نمی گذارد.
مرجع جریان: اگر جریان (یا زیر جریان) اجرا شود در یک معامله در حال اجرا است ، اجرای جریان (یا زیر جریان) ارجاع شده توسط مؤلفه مرجع جریان با همان معامله ادامه می یابد. اگر جریان ارجاع شده دارای یک منبع پیام باشد که معامله را شروع می کند (به عنوان مثال یک منبع شنونده با TransactionAlaction = "همیشه_Begin") ، تراکنش نادیده گرفته می شود. مؤلفه مرجع جریان به جز منبع پیام آن ، مؤلفه های جریان ارجاع شده را اجرا می کند.
هر روتر یا دامنه دیگری (به عنوان مثال ، foreach) با معامله ادامه می یابد و رفتار آن اصلاح نمی شود.
رسیدگی به خطا
هنگامی که خطایی در طی یک معامله رخ می دهد ، برنامه شما باید خطا را انجام دهد و ادامه یا انجام یک بازگشت را ادامه دهد.
دو نوع خطای خطا وجود دارد که در هنگام انجام یک خطا ، متفاوت رفتار می کنند:
در پخش خطا
اگر کنترل کننده خطای بر روی خطا در محدوده خطا در دامنه خطا باشد که مربوط به مؤلفه ای است که معامله را آغاز کرده است:
این معامله قبل از اجرای پردازنده های دامنه برخاست که در هر خطا وجود دارد ، دوباره انجام می شود. این بدان معنی است که پردازنده های داخل کنترل کننده خطا در معامله اجرا نمی شوند.
اگر کنترل کننده خطای بر روی-پروریه در داخل عنصری باشد که معامله را شروع نمی کند:
معامله به عقب برگردانده نمی شود و پردازنده های داخل خطای خطای بر فراز و فرآیند در معامله اجرا می شوند. به یاد داشته باشید که برخی از دامنه ها و روترها هنگام اجرای یک معامله متفاوت رفتار می کنند.
در خطا ادامه دهید
این خطا انجام می شود ، معامله همچنان فعال است و قادر به انجام آن است. پردازنده های داخل خطبه در داخل معامله اجرا می شوند.
مثال: خطا در محدوده آزمایش رخ می دهد
نمونه ای را در نظر بگیرید که در آن منبع پیام (JMS: شنونده) معامله ای را شروع می کند ، که توسط دامنه آزمایش ادامه می یابد (TransactionAction به طور پیش فرض ، بی تفاوت تنظیم شده است).
هنگامی که خطا رخ می دهد ، ابتدا توسط خطای خطای محدوده آزمایش انجام می شود. این خطا توسط یک کنترل کننده خطای برخاست که در آن صورت گرفته است ، انجام می شود ، اما معامله به عقب برگردانده نمی شود زیرا این محدوده آزمایشی نبود که معامله را آغاز کرد. فقط کنترل کننده خطای جریان می تواند معامله را به عقب برگرداند ، زیرا معامله در سطح جریان (از منبع پیام آن) آغاز شد.
JMS: انتشار عملیات در داخل خطای خطای بر روی خطای را به معامله می پیوندد. سپس خطا به خطای خطای جریان پخش می شود ، که خطای خطای خطای بر روی خطای را کنترل می کند. JMS: عملکردی را در داخل خطای خطای خطای خطی مصرف کنید که در معامله انجام می شود. سرانجام ، معامله انجام می شود.
اگر در مثال قبلی ، کنترل کننده خطای خطای خطی با یک کنترل کننده خطای بر روی خطا جایگزین شود ، قبل از اجرای پردازنده ها ، معامله به عقب برگردانده می شود. در این سناریو ، پیکربندی صحیح نیست زیرا عملیات JMS: مصرف نمی تواند به هر معامله ای بپیوندد.
مثال: خطا در یک جریان ارجاع شده رخ می دهد
مثال زیر مانند نسخه قبلی رفتار می کند ، اما به جای داشتن دامنه آزمایش ، از یک مرجع جریان استفاده می کند و خطا در جریان ارجاع شده رخ می دهد:
از آنجایی که جریان someFlowContinuesTx تراکنش را آغاز نکرده است، کنترل کننده خطا آن تراکنش را به عقب بر نمی گرداند.
مثال: مقایسه کنترل کننده های خطا
این مثال تفاوت بین کنترل کننده خطای on-error-continue و کنترل کننده خطای on-error-propagate را نشان می دهد:
در flow1، کنترل کننده خطای on-error-continue تراکنش را فعال نگه می دارد، اما محدوده Try در داخل آن سعی می کند یک تراکنش جدید را آغاز کند. پیکربندی معتبر نیست و منجر به خطا می شود.
در flow2، کنترل کننده خطای انتشار خطا، تراکنش را به عقب برمی گرداند، پردازنده های داخل کنترل کننده خطا در انتشار خطا اجرا می شوند و یک تراکنش جدید ایجاد می شود. این پیکربندی درست است.
فارکس وکسب درامد...
ما را در سایت فارکس وکسب درامد دنبال می کنید
برچسب :
نویسنده : احمد قانع پور
بازدید : 61
تاريخ : يکشنبه
20 فروردين
1402 ساعت: :