اکتیویتی CompensableActivity
آموزش WCF -اکتيويتي CompensableActivity
سناريويي را تصور کنيد که کالايي را بصورت آنلاين خريداري کرده ايد و هزينه آن از حساب بانکي شما کسر شده است. ناگهان در حين تکميل پروسه خريد، خطايي رخ مي دهد و Workflow متوقف شده و خريد ما لغو مي شود. بديهي است که در دنياي واقعي چنين چيزي نبايد اتفاق بيافتد.
در واقع اگر در حين پروسه خريد، Workflow بخاطر بروز خطايي متوقف شود، پول پرداخت شده بايد به حساب ما بازگشت کند. در WF4 به بالا، مي توانيم مشکل بالا را با استفاده از اکتيويتي CompensableActivity مديريت کنيم. Compensable در لغت بمعني "قابل جبران" است.
مراحل انجام کار
پروژه گردش کار UseCompensableActivity شامل مراحل زير است:
- ايجاد يک پروژه از نوع Workflow Console Application
- ايجاد و طراحي Workflow
- Host کردن Workflow
- اجراي Workflow
- اضافه کردن اکتيويتي Throw
ايجاد يک پروژه از نوع Workflow Console Application
در پنل Solution Explorer روي Solution Chapter03 راست کليک کرده و از گزينه ADD زير منوي New Project را انتخاب نماييد. سپس در پنجره Add New Project گزينه workflow را انتخاب کرده و سپس از سمت راست پنجره گزينه Workflow Console Application را انتخاب نماييد. حالا قسمت Name را با مقدار UseCompensableActivity تنظيم نماييد و نهايتاً روي دکمه OK کليک کنيد.
ايجاد و طراحي Workflow
فايل Workflow1.xaml را باز کنيد و کارهاي زير را انجام دهيد:
- از پنل Toolbox، اکتيويتي Sequence را بداخل صفحه بکشيد و مطابق عکس زير، متغيرهاي num1 و num2 و result را تعريف کنيد.
- اکتيويتي CompensableActivity را داخل Sequence قرار دهيد. و قسمت Body و CompensationHandler آنرا مطابق عکس زير تنظيم نماييد.
- اکتيويتي Assign را به داخل Sequence بکشيد و آنرا مطابق زير تنظيم کنيد:
Host کردن Workflow
فايل Program.cs را باز کنيد و کد زير را به آن اضافه نماييد:
Program.cs
using System; using System.Linq; using System.Activities; using System.Activities.Statements; using System.Threading; namespace UseCompensableActivity { /// /// Author : Amir Pahlavan sadegh /// provided to you by : http://www.beyamooz.com /// class Program { static void Main(string[] args) { AutoResetEvent waitHandler = new AutoResetEvent(false); WorkflowApplication wfApp = new WorkflowApplication(new Workflow1()); wfApp.OnUnhandledException = (arg) => { return UnhandledExceptionAction.Cancel; }; wfApp.Completed = (arg) => { waitHandler.Set(); }; wfApp.Run(); waitHandler.WaitOne(); Console.WriteLine("-------------\nProvided to you by : http://www.beyamooz.com \npress any key ..."); Console.ReadLine(); } } }
اجراي Workflow
پروژه UseCompensableActivity را بعنوان پروژه StartUp تنظيم نماييد و در ادامه براي اجراي Workflow دکمه هاي ميانبر Ctrl+F5 را فشار دهيد. همان طور که در خروجي مشاهده مي کنيد، اجراي اکتيويتي Assign با خطاي تقسيم بر صفر مواجه شده است و بجاي اينکه اجراي Workflow متوقف شود به قسمت CompensationHandler متقل شده و پيعام "CompensationHandler do some work" چاپ شده است:
پروژه ي گردش کار UseCompensableActivity چگونه عمل مي کند؟
بمحض اینکه Workflow اجرا می شود، اکتیویتی Writeline در قسمت Body اکتیویتی CompensableActivity عمل کرده و رشته "compensable activity take action" را چاپ می کند.
در این لحظه، قسمت CompensationHandler اجرا نخواهد شد. سپس اکتیویتی Assign اجرا خواهد شد و بخاطر اینکه متغیر num2 را با صفر تنظیم کردیم، خطای "تقسیم بر صفر" ایجاد می شود.
exception یا همان خطای مذکور توسط کد زیر دریافت می شود (captured) و اجرای Workflow متوقف می شود:
Program.cs
wfApp.OnUnhandledException = (arg) => { return UnhandledExceptionAction.Cancel; };
اما قبل از اینکه اجرای Workflow بصورت کامل پایان یابد، CompensationHandler اجرا می شود و رشته ی "CompensationHandler do some work" را در خروجی چاپ می کند.
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 6512