برنامه نویسیجاوا

کاربرد و معرفی کامل مفاهیم و ساختار EJB – قسمت اول

مفاهیم و ساختار EJB

در این مقاله آی تی پورت قصد داریم به معرفی کامل مفاهیم و ساختار EJB بپردازیم. ممکن است این سوال نیز برای شما پیش آمده باشد که EJB چیست و چگونه عمل میکند؟ EJB این امکان را برای ما فراهم میکند که کلاسهای بنویسیم و در این کلاسها تنها منطق برنامه را در نظر بگیریم. EJB یکی از مولفه های server-side است که منطق تجاری را شامل میشود. یک EJB web container امکاناتی چون زمان اجرای محیطی برای مولفههای مرتبط با وب، مدیریت چرخه دوام Java servlet، امنیت رایانه، پردازش تراکنش و سایر خدمات وب را فراهم میکند.در ادامه توضیح میدهیم که چطور با استفاده از EJBها یک کلاس JavaBeans را می توان نوشت و در داخل این کلاس منطق مورد نظرتان را پیاده سازی کنید. با معرفی کامل مفاهیم و ساختار EJB تا انتهای مقالات شما به تصویر بهتری از مفهوم EJB میرسید. با آی تی پورت همراه باشید.

مطالبی که در این مقاله از سری مقالات معرفی کامل مفاهیم و ساختار EJB شرح داده میشود، شامل:

  • فراخوانی Enterprise JavaBeans
  • پیاده سازی یک EJB
  • انواع EJB

فراخوانی Enterprise JavaBeans

Enterprise JavaBeans به اختصار (EJBs) یکی از Java APIs است که برای ساختن ماژولهای برنامههای سازمانی به کار میرود. می توانند یکی از این سه نوع باشند: 

session beans, entity beans  یا  message-driven beans

  • Session beans میتواند دارای وضعیت (stateful) یا مستقل از وضعیت (Stateless) باشد و برای عملکرد منطق تجارت به کار میرود. منطق تجارت برنامهایی است که قوانین تجاری در دنیای واقعی را رمزنگاری میکند و این برنامه مشخص میکند که دادهها چطور ذخیره، تولید و تبدیل شوند.
  • Stateless session beans (مستقل از وضعیت): برای خدمات تجاری به کار میرود. در این نوع وضعیت مشتری از طریق تماس حفظ نمیشود.
  • Stateful session beans (دارای وضعیت): وضعیت تماس مشتری را حفظ میکند. بنابراین بینز (beans) عملکردهای تجاری را برای چرخه دوام آن مشتری خاص مدیریت میکند.
  • از Entity beans به طور معمول برای مدیریت دادههای مداوم استفاده میشود.
  • Message-driven beans برای دریافت پیام از یک صف یا موضوع JMS به کار می رود.

برای معرفی کامل مفاهیم و ساختار EJB باید درمورد انواع رابطههای به کار گرفته شده در EJBها اطلاعات کافی داشته باشیم. EJB دارای دو رابطه مشتری است:

  • رابطه از راه دور: رابطه از راه دور متدهای تجاری را مشخص می کند که مشتریان می توانند از آن استفاده کنند.
  • رابطه خانگی: رابطه خانگی متدهای چرخه دوام EJB را تعریف می کند  مانند متد Creat  و بازیابی رجوع به شی در رابطهbean  است.

مشتری هنگام فراخوانی متدی در bean از هر دو رابطه استفاده می کند.

Events In A Stateless Session Bean

شکل۱: رویدادها در یک Stateless Session Bean

تصویر بالا یک stateless session bean را نشان میدهد و مطابق مراحل زیر است:

  •  مشتری، که می تواند یک مشتری مستقل جاوا، servlet، JSP یا یک applet باشد، معمولاً از طریق JNDI رابطه bean را بازیابی می کند.
  •  با متد فراخوانی (invoke motheds) create  را رجوع به رابطه خانه می کند (شی خانه است). با این کار نمونه bean ایجاد می شود و مرجع به رابطه از راه دور bean برمی گردد.
  •  یک مشتری که در متد رابطه راه دور تعریف شده را فراخوانی میکند که فراخوانی متد در نمونه bean (از طریق یک ریشه (stub)) را واگذار میکند.
  •  مشتری می تواند با استفاده از متد حذف که در رابطه از راه دور تعریف شده است، نمونه bean را حذف کند. برخی از beansها همانند stateless session beans (مستقل از وضعیت) نمی توانند متد حذف را فراخوانی کنند. در این حالت میتوانید beans را کلا حذف کنید.

پیاده سازی EJP

برای ساخت یک EJB باید ۴ مولفه (component) زیر را ایجاد کنید:

  • رابطه خانگی
  • رابطه از راه دور
  • پیاده سازی bean
  • یک توصیفگر استقراری برای هر bean

جدول معرفی کامل مفاهیم و ساختار EJBانواع مولفهها

مولفه توضیحات
رابطه خانگی رابطه را برای یک شی (خانه) به گونه ایی تعیین میکند که کانتینر خودش را پیادهسازی میکند. رابطه خانگی شامل متدهای چرخه دوام است، همانند متدهای ()create که نحوه ایجاد یک bean را مشخص می کند.
رابطه از راه دور متد های تجاری که در bean اجرا می کنید را مشخص می کند. bean همچنین باید متد های اضافی سرویس کانتینر را اجرا کند. کانتینر EJB این متد ها را در دورههای مختلف چرخه دوام یک bean فراخوانی می کند.
پیاده سازی bean حاوی کد جاوا است که متدهای تعریف شده در رابطه خانه (متدهای چرخه دوام)، رابطه از راه دور (متدهای تجاری) و متدهای مورد نیاز کانتینر(توابع فراخوانی برگشتی کانتینر) را انجام می دهد.
گسترش توصیفگر مشخصههای Bean را برای گسترش تعیین میکند. این مشخصات پیکربندی را، مانند محیط، نام رابطه، پشتیبانی تراکنشی (ثبت و ضبط)، نوع EJB و اطلاعات ماندگاری معین می کند.
Ejb

توصیف توسعه دهنده EJB

پیاده سازی bean

شما Bean را به هر متدی با رابطهه SessionBean ، EntityBean یا MessageDrivenBean میتوانید پیاده سازی کنید. این پیاده سازی شامل منطقی برای متدهای چرخه دوام تعریف شده در رابطه خانه، متدهای تجاری تعریف شده در رابطه از راه دور و توابع فراخوانی برگشتی کانتینر تعریف شده در رابطه SessionBean ، EntityBean یا MessageDrivenBean باشد.

انتقال پارامتر 

هنگام اجرای EJB یا نوشتن کد مشتری که متدهای EJB را فراخوانی می کند، باید از قراردادهای انتقال پارامترها که در EJB استفاده می شود، آگاه باشید.

پارامتری که به متد bean – یا مقدار برگشتی از متد bean – منتقل می کنید، می تواند از هر نوع جاوا باشد که به قابل سریال سازی است. انواع عناصر اولیه جاوا، مانند int، double، به صورت سریالی قابل تنظیم هستند. هر شی non-remote که در رابطه java.io.Serializable پیاده سازی میشود، قابل انتقال است. یک شی non-remote که به عنوان یک پارامتر به bean منتقل می شود یا مقداری را از یک bean بدون ارجاع به مرجع باز میگرداند. بنابراین به طور مثال، اگر شما یک متد bean را به شرح زیر فراخوانی می کنید:

از اینرو method1() در bean یک کپی از theNumber را دریافت می کند. اگر bean مقدار شی در theNumber را در سرور تغییر دهد، این تغییر به دلیل معانی ارزش موقت به مشتری منتقل نمی شود.

اگر شی non-remote پیچیده باشدمانند یک کلاس شامل چندین فیلدفقط فیلدهای غیر ایستا (non-static) و غیر گذرا (non-transient) کپی می شوند.

وقتی یک شی remote به عنوان یک پارامتر گذرا است، stub مربوط به شی remote منتقل شده است. یک شی remote به عنوان یک پارامتر باید رابطه های remote را گسترش دهد.

 در ادامه مبحث معرفی کامل مفاهیم و ساختار EJB انتقال پارامترها و شی از راه دور به عنوان یک مقدار برگشتی به bean را شرح میدهیم.

پارامتر اشیا

متد EmployeeBean getEmployee یک شی EmpRecord را برمی گرداند، بنابراین این شی باید در جایی از برنامه تعریف شود. 

کلاس به صورت public معرفی میشود و باید رابطه java.io.Serializable را پیاده سازی کند تا بتواند مقدار را به عنوان یک شی از راه دور سریال (serialized remote object)، به مشتری منتقل شود.

public class theNumber {
  int x;
}
...
bean.method1(theNumber);

یادداشت:

رابطه java.io.Serializable هیچ متدی را مشخص نمیکند. فقط کلاسی که می تواند سریال باشد را نشان میدهد. بنابراین، نیازی به پیاده سازی متدهای اضافی در کلاس EmpRecord نیست.

انواع EJBها

معرفی کامل مفاهیم و ساختار EJB نیازمند دانستن انواع EJBها و تفاوتهای آنها است. به طور کلی سه نوع EJB وجود دارد:

  • Session Beans
  • Entity Beans
  • Message-Driven Beans

Session Beans

یکSession Beans  یک یا چند کار تجاری را پیاده سازی میکند. یک session bean ممکن است شامل متد هایی باشد که داده ها را در یک جدول رابطهه ای جستجو و به روزرسانی کند. Session Beans اغلب به منظور پیاده سازی خدمات استفاده می شود. به عنوان مثال، یک توسعه دهنده برنامه ممکن است یک یا چندین session bean را پیادهسازی کند که دادههای موجود در پایگاه داده را بازیابی و به روزرسانی میکند.

session bean موقتی هستند زیرا هنگام خرابی سرور یا خرابی شبکه باقی نمیمانند. اگر پس از خرابی bean، را که قبلاً وجود داشته است، نمونه سازی کنید؛ حالت نمونه قبلی بازیابی نشده است. تنها در Entity Beans می توان حالت قبلی را بازیابی کرد.

یک EJB حداقل باید متدهای زیر را همانطور که در رابطه javax.ejb.SessionBean  مشخص شده است، پیاده سازی کند:

  • ejbCreate()

کانتینر این متد را دقیقا قبل از ایجاد bean فراخوانی میکند. Stateless session beans  (بدون وضعیت) نباید در این متد کاری انجام دهد. در این متدStateful session beans  می تواند وضعیت را آغاز کند.

  • ejbActivate() 

کانتینر این متد را بلافاصله پس از فعال سازی مجدد bean فراخوانی میکند.

  • ejbPassivate()

کانتینر این متد را درست قبل از اینکه bean را غیرفعال شود، فراخوانی می کند.

  • ejbRemove() 

 کانتینر قبل از پایان روند object session این متد را فراخوانی می کند. این متد  تمام پاکسازی مورد نیاز را انجام می دهد. به طور مثال، بستن منابع خارجی مانند پروندههای دستی.

  • setSessionContext (SessionContext ctx)

 در این متد یک نمونه bean را با اطلاعات متن آن پیوند میزند. کانتینر این متد را پس از ساخت bean فراخوانی می کند.enterprise bean  (بین سازمانی) میتواند ارجاع به شی متن را در یک متغیر نمونه برای استفاده در مدیریت معاملات ذخیره کند. bean که معاملات خود را مدیریت میکند می تواند از session context  برای بدست آوردن transaction context استفاده کند.

استفاده از setSessionContext

شما از این متد برای دستیابی به مرجع یک متن در bean استفاده میکنید. Session beans دارای متنهایSession  است که کانتینر آنها را نگه میدارد و در دسترس bean قرار میدهد. bean ممکن است از متدهای موجود در متن Session برای درخواستهای فراخوانی برگشتی به کانتینر استفاده کند.

با setSessionContext متد کانتینر فراخوانی می شود، سپس در ابتدا از bean نمونه برداری میکند، تا bean را قادر به بازیابی متنSession  کند. کانتینر هرگز این متد را از درون متن transaction (تراکنش) فراخوانی نخواهد کرد. اگر bean در این مرحله متن Session را ذخیره نکند، هرگز bean به متن Session  دسترسی پیدا نمی کند.

وقتی کانتینر این متد را فراخوانی میکند، مرجع شی SessionContext را به bean منتقل می کند. bean می تواند مرجع را برای استفاده بعدی ذخیره کند.

  • یک bean برای اینکه بتواند عملیاتی مانند آنچه در جدول زیر آمده است را انجام دهد به یک متن session نیاز دارد.

جدول ۱ عملیات متن session در معرفی کامل مفاهیم و ساختار EJB

متد توضیحات
getEnvironment() مقادیر خاص bean را بدست می آورد.
getUserTransaction() یک متن transaction (تراکنشی) دریافت میکند که به شما اجازه میدهد به صورت برنامه ریزی شده تراکنش را تعیین کنید. این قضیه تنها برای beanهایی که تراکنش تعیین شده دارند معتبر است.
setRollbackOnly() تراکنش فعلی را طوری تنظیم کنید که قابلیت ارسال را نداشته باشد.
getRollbackOnly() بررسی کنید که آیا تراکنش فعلی فقط برای عقب گرد مشخص شده است یا خیر.
getEJBHome()

مرجع شی را به EJBHome متناظر (رابطه خانه) در bean را بازیابی کنید.

به طور کلی دو نوع session beans وجود دارد:

  • Stateless Session Beans :

Stateless Session Beans وضعیت یا هویت بین متد فراخوانی را به اشتراک نمیگذارد. این حالت عمدتا در سرورهای برنامههای میان ردهای مفید هستند که یک مخزن bean به منظور پردازش درخواستهای پرتکرار و مختصر فراهم میکند.

  • Stateful Session Beans :

Stateful Session Beans مناسب conversational sessions مفید است که البته لازم است وضعیت را در آن حالت مانند مقادیر متغیر نمونه یا وضعیت تراکنشی در بین فراخوانی متد نگه دارد. این Session Beanها به یک مشتری خاص برای روند آن مشتری ترسیم می شود.

Stateless Session Beans

Stateless Session Beans هیچ حالتی را برای مشتری حفظ نمیکند. این کاملاً یک فراخوانی تک  Bean است. این سرویس برای خدمات تجارتی قابل استفاده مجدد به کار گرفته میشود که به مشتری خاصی متصل نیستند، مانند محاسبات ارز عمومی، محاسبه نرخ وام مسکن و غیره.Stateless session beans ممکن است در برگیرنده مشتری مستقل با حالت فقط خواندنی (read-only) در سراسر فراخوانی باشد. نتیجه فرخوانیهای بعدی توسط سایر Stateless Session Beans در مخزن انجام می شود. این اطلاعات فقط برای فراخوانی تک استفاده می شود.

کانتینر EJB مجموعه ای از این stateless beans را برای خدمات دهی به چندین مشتری حفظ می کند. وقتی مشتری درخواستی را ارسال می کند، یک نمونه از مخزن خارج می شود که نیازی به مقداردهی اولیه با هرگونه اطلاعات در bean نیست. در واقع تنها پیاده سازی  یک create/ejbCreate  تک بدون پارامتر موجود است. دقت کنید که در این متد ها هیچ گونه مقداردهی اولیه برای   beanانجام نمیشود. متدهای remove/ejbRemove, ejbPassivate, ejbActivate, setSessionContext  نیازی به هیچ گونه اقدامی برای پیاده سازی نیست. علاوه بر این، نیازی به استفاده از شرایطی که قبلا تعیین شده برای این متد ها در یک stateless session bean نیست. در عوض، این متد ها بیشتر برای EJB های دارای وضعیت for stateful session beans و entity beans استفاده میشود. بنابراین، در استفاده از این متدها باید محتوا خالی یا بسیار ساده باشند. جدول۲ در معرفی کامل مفاهیم و ساختار EJB به تشریح متدهای پیاده سازی میپردازد.

پیاده سازی متد
رابطه خانگی javax.ejb.EJBHome را تعمیم میدهد و  متد  factory به یک تک create() بدون آرگومان و یک متد تک remove() نیاز دارد.
رابطه از راه دور javax.ejb.EJBObject را تعمیم میدهد و متد های منطق تجاری را تعریف می کند که در پیاده سازی bean اجرا شده است.
پیاده سازی Bean

SessionBean را پیاده سازی میکند. این کلاس باید به صورت عمومی شناسایی شود، شامل یک عمومی(public)، خالی(empty)، پیش فرض سازنده (default constructor)، بدون متد finalize() باشد و متدهای تعریف شده در رابطه از راه دور را پیاده سازی کند. همچنین باید حاوی یک متد تک ejbCreate، بدون هیچ آرگومانی باشد تا با متد create() در رابطه خانگی مطابقت داشته باشد. پیاده سازیهای خالی برای متدهای سرویس کانتینر، مانند ejbRemove و غیره را در برمیگیرد.

در ادامه مقالات معرفی کامل مفاهیم و ساختار EJB ساختار Stateful Session Beans را به صورت کامل شرح میدهیم.

Entity Beans

یک entity bean یک entity تجاری پیچیده است. یک entity bean یک entity تجاری را مدل میکند یا اقدامات متعددی را در یک فرآیند تجاری مدل میکند. entity bean  اغلب برای تسهیل خدمات تجاری که شامل داده ها و محاسبات مربوط به آن دادهها است، استفاده می شوند. به عنوان مثال، یک توسعه دهنده برنامه ممکن است برای بازیابی و انجام محاسبات آیتمهای موجود در یک سفارش خرید، یک entity bean را پیاده سازی کند.entity bean  شما می تواند چندین اشیا وابسته و پایدار را در انجام کارهای ضروری خود مدیریت کند.

Entity bean یک شی remote از راه دور است که دادههای پایدار را مدیریت میکند، منطق تجاری پیچیده ای را انجام می دهد، به طور بالقوه از چندین اشیا وابسته جاوا استفاده میکند و به متدی یکتا توسط یک کلید اصلی قابل شناسایی است. Entity bean به طور معمول اشیا پایدار coarse-grained هستند، زیرا از داده های ماندگار ذخیره شده در چندین اشیا جاوا پایدار (grained persistent Java) استفاده میشود.

Entity bean پایدار هستند زیرا در اثر خرابی سرور یا خرابی شبکه باقی می مانند. وقتی یک Entity bean  مجدداً نمونه برداری می شود، حالت نمونههای قبلی به طور خودکار بازیابی میشود.

مفاهیم و ساختار EJB

پایگاه داده و EJB Container

در این مقاله به طور خلاصه به معرفی کامل مفاهیم و ساختار EJB پرداختیم و در مورد پیادهسازی bean ها در EJB  و انواع فراخوانی EJB صحبت شد. در قسمت دوم این مقالات به تشریح باقی انواع فراخوانی EJB، تفاوت بین  Session و  Entity Beans ومیپردازیم.

خوشحال می شویم نظرات و پیشنهادات خود را در جهت بهبود کیفیت این مقاله با ما به اشتراک بگذارید.

گفتگو ها