این فصل شامل پشتیبانی ادغام بهار برای معاملات است. موضوعات زیر را پوشش می دهد:
درک معاملات در جریان پیام
ادغام بهار چندین قلاب را برای رفع نیازهای معامله ای پیام شما در معرض دید قرار می دهد. برای درک بهتر این قلاب ها و اینکه چگونه می توانید از آنها بهره مند شوید ، ابتدا باید شش مکانیسم را که می توانید برای شروع جریان پیام استفاده کنید ، دوباره بررسی کنیم و ببینیم که چگونه می توانید نیازهای معامله ای این جریان ها را در هر یک از این مکانیسم ها برطرف کنید.
شش مکانیسم زیر یک جریان پیام را آغاز می کند (جزئیات برای هر یک در طول این دفترچه ارائه شده است):
Proxy Gateway: یک دروازه اصلی پیام رسانی.
کانال پیام: تعامل مستقیم با روش های MessageChael (به عنوان مثال ، کانال. send (پیام)).
ناشر پیام: راهی برای شروع جریان پیام به عنوان محصول جانبی دعوت های روش در لوبیای بهار.
آداپتورها و دروازه های کانال ورودی: راه شروع جریان پیام بر اساس اتصال سیستم شخص ثالث با سیستم پیام رسانی بهار (به عنوان مثال ، [JMSmessage] → JMS آداپتور ورودی [پیام SI] → SI کانال).
برنامه ریزی: راه شروع جریان پیام بر اساس برنامه ریزی برنامه ریزی شده توسط یک برنامه ریز از پیش تنظیم شده.
Poller: مشابه برنامه زمانبندی ، این روش برای شروع جریان پیام بر اساس برنامه ریزی یا رویدادهای مبتنی بر فاصله است که توسط یک گرده از پیش تنظیم شده توزیع شده است.
ما می توانیم این شش مکانیسم را به دو دسته کلی تقسیم کنیم:
جریان پیام آغاز شده توسط یک فرآیند کاربر: سناریوهای مثال در این دسته می توانند از یک روش دروازه فراخوانی یا صریح ارسال پیام به یک پیام دهنده. به عبارت دیگر ، این جریان پیام ها به یک روند شخص ثالث (مانند برخی از کدی که شما نوشتید) بستگی دارد.
جریان پیام آغاز شده توسط یک فرآیند Daemon: سناریوهای مثال در این گروه شامل یک نظرسنجی از نظر نظریه گرده برای شروع جریان پیام جدید با پیام نظرسنجی یا برنامه ریزی برنامه ریزی با ایجاد یک پیام جدید و شروع یک جریان پیام در یک زمان از پیش تعریف شده است. واد
بدیهی است که Proxy Gateway ، MessageChael. Send (…) و PessagePublisher همه متعلق به دسته اول هستند و آداپتورها و دروازه های ورودی و دروازه ها ، برنامه ریز و گالر متعلق به دسته دوم هستند.
بنابراین ، چگونه می توانید نیازهای معامله ای را در سناریوهای مختلف در هر گروه برطرف کنید ، و آیا نیاز به ادغام بهار وجود دارد تا با توجه به معاملات برای یک سناریوی خاص ، چیزی صریح ارائه دهد؟یا می توانید به جای آن از پشتیبانی معامله بهار استفاده کنید؟
بهار خود پشتیبانی کلاس اول را برای مدیریت معاملات ارائه می دهد. بنابراین هدف ما در اینجا ارائه چیز جدید نیست بلکه از بهار برای بهره مندی از پشتیبانی موجود خود برای معاملات استفاده می کند. به عبارت دیگر ، به عنوان یک چارچوب ، باید قلاب ها را در معرض عملکرد مدیریت معاملات بهار قرار دهیم. با این حال ، از آنجا که پیکربندی یکپارچه سازی بهار مبتنی بر پیکربندی بهار است ، ما همیشه نباید این قلاب ها را در معرض دید قرار دهیم ، زیرا بهار قبلاً آنها را در معرض دید قرار می دهد. از این گذشته ، هر مؤلفه ادغام بهار یک لوبیای بهار است.
با توجه به این هدف ، ما می توانیم دوباره این دو سناریو را در نظر بگیریم: جریان پیام آغاز شده توسط یک فرآیند کاربر و جریان پیام آغاز شده توسط یک Daemon.
جریان پیام هایی که توسط یک فرآیند کاربر آغاز می شوند و در یک زمینه برنامه بهاری پیکربندی می شوند ، منوط به پیکربندی معاملاتی معمول چنین فرآیندهایی هستند. بنابراین ، آنها برای پشتیبانی از معاملات به صراحت با ادغام بهار پیکربندی نمی شوند. معامله می تواند و باید از طریق پشتیبانی استاندارد معامله بهار آغاز شود. جریان پیام ادغام بهار به طور طبیعی از معانی معاملات مؤلفه ها افتخار می کند ، زیرا خود بهار پیکربندی شده است. به عنوان مثال ، یک روش فعال کننده دروازه یا سرویس می تواند با transactional حاشیه نویسی شود ، یا یک TractionInterceptor را می توان در یک پیکربندی XML با یک عبارت نقطه ای تعریف کرد که به روشهای خاصی که باید معامله شوند اشاره می کند. نکته آخر این است که شما در این سناریوها کنترل کاملی بر پیکربندی معاملات و مرزها دارید.
با این حال، وقتی صحبت از جریان های پیام آغاز شده توسط یک فرآیند دیمون می شود، اوضاع کمی متفاوت است. اگرچه این جریان ها توسط توسعه دهنده پیکربندی شده اند، اما مستقیماً شامل یک انسان یا فرآیند دیگری برای شروع نمی شوند. این ها جریان های مبتنی بر ماشه هستند که توسط یک فرآیند ماشه ای (یک فرآیند شبح) بر اساس پیکربندی فرآیند آغاز می شوند. برای مثال، می توانیم از یک برنامه ریز بخواهیم که هر جمعه شب یک جریان پیام را آغاز کند. ما همچنین می توانیم یک ماشه را پیکربندی کنیم که هر ثانیه یک جریان پیام را آغاز کند و غیره. در نتیجه، ما به روشی نیاز داریم تا به این فرآیندهای مبتنی بر محرک از قصد ما برای تراکنشی بودن جریان پیام های حاصل اطلاع دهیم، به طوری که هر زمان که یک جریان پیام جدید آغاز شد، بتوان یک زمینه تراکنش ایجاد کرد. به عبارت دیگر، ما باید برخی از پیکربندی تراکنش ها را در معرض نمایش بگذاریم، اما فقط به اندازه کافی برای واگذاری به پشتیبانی تراکنش که قبلاً توسط Spring ارائه شده است (همانطور که در سناریوهای دیگر انجام می دهیم).
پشتیبانی از معاملات پوللر
Spring Integration پشتیبانی تراکنشی را برای نظرسنجی ها فراهم می کند. Poller ها نوع خاصی از مؤلفه ها هستند زیرا در یک وظیفه poller، می توانیم دریافت() را در مقابل منبعی که خود تراکنشی است فراخوانی کنیم، بنابراین فراخوانی دریافت() را در مرزهای تراکنش گنجانده ایم که در صورت امکان برگشت داده می شود. از شکست کاراگر بخواهیم همان پشتیبانی را برای کانال ها اضافه کنیم، تراکنش های اضافه شده روی همه اجزای پایین دستی که با فراخوانی send() شروع می شوند، تأثیر می گذارند. این یک دامنه نسبتاً گسترده برای مرزبندی تراکنش ها بدون هیچ دلیل محکمی فراهم می کند، به خصوص زمانی که Spring در حال حاضر چندین راه برای رفع نیازهای تراکنشی هر جزء پایین دستی ارائه می دهد. با این حال، متد دریافت() که در مرز تراکنش گنجانده شده است "دلیل قوی" برای نظرسنجی است.
همانطور که مثال زیر نشان می دهد، هر زمان که یک Poller را پیکربندی می کنید، می توانید پیکربندی تراکنش را با استفاده از عنصر فرزند تراکنش و ویژگی های آن ارائه دهید:
پیکربندی قبلی شبیه به پیکربندی تراکنش بومی Spring است. شما همچنان باید یک مرجع به یک مدیر تراکنش ارائه دهید و یا ویژگی های تراکنش را مشخص کنید یا به پیش فرض ها تکیه کنید (به عنوان مثال، اگر ویژگی "transaction-manager" مشخص نشده باشد، به صورت پیش فرض روی Bean با نام "transactionManager" است. در داخل، این فرآیند در تراکنش بومی Springs پیچیده می شود، جایی که TransactionInterceptor مسئول رسیدگی به تراکنش ها است. برای اطلاعات بیشتر در مورد نحوه پیکربندی یک مدیر تراکنش، انواع مدیران تراکنش (مانند JTA، Datasource، و سایر جزئیات) و سایر جزئیات مربوط به پیکربندی تراکنش، به راهنمای مرجع چارچوب Spring مراجعه کنید.
با پیکربندی قبلی، تمام جریان های پیام آغاز شده توسط این نظرسنجی تراکنشی هستند. برای اطلاعات بیشتر و جزئیات بیشتر در مورد پیکربندی تراکنش یک نظرسنجی، به نظرسنجی و تراکنش ها مراجعه کنید.
در کنار تراکنش ها، ممکن است نیاز باشد که چندین نگرانی دیگر را هنگام اجرای یک نظرسنجی برطرف کنید. برای کمک به آن، عنصر Poller یک عنصر فرزند را می پذیرد، که به شما امکان می دهد یک زنجیره سفارشی از نمونه های مشاوره را برای اعمال در Poller تعریف کنید.(برای جزئیات بیشتر به منبع پیام Pollable رجوع کنید.) در Spring Integration 2. 0، Poller یک تلاش بازسازی را انجام داد و اکنون از یک مکانیسم پروکسی برای رسیدگی به نگرانی های تراکنش و همچنین سایر نگرانی های بین بخشی استفاده می کند. یکی از تغییرات مهم حاصل از این تلاش این است که ما عناصر و را متقابلاً منحصر به فرد کردیم. دلیل این امر این است که اگر به بیش از یک توصیه نیاز دارید و یکی از آنها مشاوره تراکنش است، می توانید آن را با همان راحتی قبلی اما با کنترل بسیار بیشتر در آن قرار دهید، زیرا اکنون گزینه ای برای قرار دادن مشاوره دارید. به ترتیب دلخواهمثال زیر نحوه انجام این کار را نشان می دهد:
مثال قبلی یک پیکربندی پایه مبتنی بر XML از مشاوره Spring Transaction (txAdvice) را نشان می دهد و آن را در چارچوب تعریف شده توسط Poller گنجانده است. اگر نیاز دارید که فقط به نگرانی های معامله گر نظرسنجی بپردازید، همچنان می توانید از عنصر به عنوان یک راحتی استفاده کنید.
مرزهای معاملات
عامل مهم دیگر مرزهای معاملات در جریان پیام است. با شروع معامله ، زمینه معامله به موضوع فعلی محدود می شود. بنابراین صرف نظر از چند نقطه پایانی و کانال های موجود در پیام خود ، زمینه معامله شما حفظ می شود تا زمانی که اطمینان حاصل کنید که جریان در همان موضوع ادامه می یابد. به محض اینکه آن را با معرفی یک کانال یا کانال مجری قابل مشاهده یا شروع یک موضوع جدید به صورت دستی در برخی از خدمات ، آن را شکستید ، مرز معامله نیز شکسته می شود. اساساً معامله به همان جا ختم خواهد شد و اگر یک دستاورد موفق بین موضوعات رخ داده باشد ، جریان موفقیت در نظر گرفته می شود و یک سیگنال متعهد حتی اگر جریان ادامه یابد و ممکن است هنوز هم در جایی پایین دست به استثنای منجر شود ، ارسال می شود. اگر چنین جریان همزمان باشد ، این استثنا را می توان به آغازگر جریان پیام که همچنین آغازگر زمینه معامله است ، برگرداند و معامله منجر به بازگشت شود. میانه استفاده از کانال های معامله ای در هر نقطه ای است که یک مرز نخ در حال شکسته شدن است. به عنوان مثال ، شما می توانید از یک کانال با حمایت از صف استفاده کنید که به یک استراتژی مسکن تراکنش نمایندگی می کند ، یا می توانید از یک کانال تحت حمایت JMS استفاده کنید.
همگام سازی
در بعضی از محیط ها ، به همگام سازی عملیات با معامله ای که شامل کل جریان است ، کمک می کند. به عنوان مثال ، در شروع یک جریان که تعدادی از به روزرسانی های پایگاه داده را انجام می دهد ، در نظر بگیرید. اگر معامله انجام شود ، ممکن است بخواهیم پرونده را به یک فهرست موفقیت منتقل کنیم ، در حالی که ممکن است بخواهیم در صورت بازگشت معامله ، آن را به یک فهرست شکست منتقل کنیم.
بهار ادغام 2. 2 توانایی همگام سازی این عملیات را با یک معامله معرفی کرد. علاوه بر این ، اگر معامله "واقعی" ندارید ، می توانید یک PseudotransactionManager را پیکربندی کنید اما هنوز هم می خواهید اقدامات متفاوتی را در مورد موفقیت یا عدم موفقیت انجام دهید. برای اطلاعات بیشتر ، به معاملات شبه مراجعه کنید.
لیست زیر رابط های استراتژی کلیدی برای این ویژگی را نشان می دهد:
این کارخانه وظیفه ایجاد یک شیء همگام سازی Transaction را دارد. شما می توانید خود را پیاده سازی کنید یا از آن استفاده کنید که توسط Framework ارائه شده است: DefaultTransactionSynrchanizationFactory. این پیاده سازی یک تراکم هماهنگ سازی را برمی گرداند که به اجرای پیش فرض TransactionSyngronizationProcessor: ExpressioneValuationTransactionSrchronization پردازنده. این پردازنده از سه عبارت Spel پشتیبانی می کند: Beforecommitexpression ، پس از آن ، پس از آن.
این اقدامات باید برای کسانی که با معاملات آشنا هستند ، کاملاً توضیحی باشد. در هر حالت ، متغیر #Root پیام اصلی است. در بعضی موارد ، بسته به پیام های موجود در نظرسنجی توسط گرده افشانی ، متغیرهای دیگر SPEL در دسترس قرار می گیرند. به عنوان مثال ، MongoDbMessagesOurce متغیر #Mongotemplate را ارائه می دهد ، که به Mongotemplate منبع پیام اشاره می کند. به طور مشابه ، redisstoremessageSource متغیر #store را ارائه می دهد ، که به Redisstore ایجاد شده توسط نظرسنجی اشاره دارد.
برای فعال کردن ویژگی برای یک گالر خاص ، می توانید با استفاده از ویژگی هماهنگ سازی-فاکتور ، به TransactionSyngronizationFactory در عنصر گرده افشانی مراجعه کنید.
با شروع نسخه 5. 0 ، ادغام بهار ، PassthroughTransactionSrchanizationFactory را فراهم می کند ، که به طور پیش فرض در نقاط پایانی نظرسنجی اعمال می شود وقتی که هیچ TransactionSynchronizationFactory پیکربندی نشده است ، اما یک توصیه از نوع TransactionInterceptor در زنجیره مشاوره وجود دارد. در هنگام استفاده از هرگونه اجرای TransactionSynchronizationFactory ، نقاط پایانی نظرسنجی پیام نظرسنجی را به زمینه معاملات فعلی متصل می کند و در صورتی که یک استثنا پس از مشاوره معامله پرتاب شود ، آن را به عنوان یک ناکام در یک پیام رسانی ارائه می دهد. هنگام استفاده از یک مشاوره معامله سفارشی که TransactionInterceptor را پیاده سازی نمی کند ، می توانید صریحاً یک PassthroughTransactionSynictryFactory را پیکربندی کنید تا به این رفتار برسید. در هر صورت ، MessagingException به بارگذاری خطای ارسالی که به خطای خطای ارسال می شود تبدیل می شود و علت آن استثناء خام است که توسط توصیه ها پرتاب می شود. پیش از این ، errormessage دارای بار زیادی بود که استثناء خام توسط این مشاوره پرتاب می شد و به اطلاعات ناکام ارائه نمی داد ، و تعیین دلایل مشکل ارتکاب معامله را دشوار می کند.
برای ساده سازی پیکربندی این مؤلفه ها، Spring Integration پشتیبانی فضای نامی را برای کارخانه پیش فرض فراهم می کند. مثال زیر نحوه استفاده از فضای نام برای پیکربندی آداپتور کانال ورودی فایل را نشان می دهد:
نتیجه ارزیابی SpEL به عنوان محموله به دیگر به تعهد کانال یا rolledBackChael ارسال می شود (در این مورد، Boolean. TRUE یا Boolean. FALSE خواهد بود - نتیجه فراخوانی متد ()java.io. File. renameTo).
اگر می خواهید کل محموله را برای پردازش ادغام بهار بیشتر ارسال کنید، از عبارت «بارگذاری» استفاده کنید.
درک این نکته مهم است که این کارها را با یک تراکنش هماهنگ می کند. این باعث نمی شود منبعی که ذاتاً تراکنشی نیست، در واقع تراکنشی باشد. درعوض، تراکنش (چه JDBC باشد یا غیر آن) قبل از نظرسنجی شروع می شود و پس از اتمام جریان، انجام می شود یا به عقب برمی گردد و به دنبال آن اقدام همگام سازی می شود.
اگر یک TransactionSynchronizationFactory سفارشی ارائه می کنید، مسئول ایجاد یک همگام سازی منبع است که باعث می شود پس از تکمیل تراکنش، منبع محدود شده به طور خودکار باز شود. TransactionSynchronizationFactory پیش فرض این کار را با برگرداندن یک زیرکلاس از ResourceHolderSynchronization انجام می دهد، با پیش فرض shouldUnbindAtCompletion() true.
علاوه بر عبارات after-commit و after-rollback، before-commit نیز پشتیبانی می شود. در آن صورت، اگر ارزیابی (یا پردازش پایین دستی) یک استثنا ایجاد کند، تراکنش به جای تعهد بازگردانده می شود.
معاملات شبه
پس از خواندن بخش همگام سازی تراکنش، ممکن است فکر کنید که انجام این اقدامات "موفقیت" یا "شکست" زمانی که یک جریان کامل می شود مفید خواهد بود، حتی اگر هیچ منبع معاملاتی "واقعی" (مانند JDBC) در پایین دست نظرسنجی وجود نداشته باشد. به عنوان مثال، یک "" به دنبال یک "" را در نظر بگیرید. هیچ یک از این مؤلفه ها تراکنشی نیستند، اما ممکن است بخواهیم فایل ورودی را بر اساس موفقیت یا عدم موفقیت انتقال FTP به دایرکتوری های مختلف منتقل کنیم.
برای ارائه این قابلیت، چارچوب یک PseudoTransactionManager را فراهم می کند که پیکربندی فوق را حتی زمانی که هیچ منبع تراکنشی واقعی درگیر نباشد، فعال می کند. اگر جریان به طور عادی کامل شود، همگام سازی های beforeCommit و afterCommit فراخوانی می شود. در صورت خرابی، همگام سازی AfterRollback فراخوانی می شود. از آنجایی که این یک تراکنش واقعی نیست، هیچ تعهد یا بازگشت واقعی رخ نمی دهد. تراکنش شبه وسیله ای است که برای فعال کردن ویژگی های همگام سازی استفاده می شود.
برای استفاده از PseudoTransactionManager، می توانید آن را به عنوان یک تعریف کنید، همانطور که یک مدیر تراکنش واقعی را پیکربندی می کنید. مثال زیر نحوه انجام این کار را نشان می دهد:
تراکنش های واکنشی
با شروع نسخه 5. 3، یک ReactiveTransactionManager همچنین می تواند همراه با توصیه TransactionInterceptor برای نقاط پایانی که نوع واکنشی را برمی گردانند استفاده شود. این شامل پیاده سازی های MessageSource و ReactiveMessageHandler (به عنوان مثال ReactiveMongoDbMessageSource) می شود که پیامی را با یک بار فلوکس یا مونو تولید می کنند. همه پیاده سازی های کنترل کننده پیام تولیدکننده پاسخ دیگر می توانند به یک ReactiveTransactionManager تکیه کنند، زمانی که بار پاسخ آنها نیز نوعی واکنش پذیر باشد.
کسب درآمد از فارکس...
ما را در سایت کسب درآمد از فارکس دنبال می کنید
برچسب :
نویسنده : عسلی سهیال
بازدید : <-PostHit->
تاريخ : شنبه
26 فروردين
1402 ساعت: 17:46