در این مقاله به بررسی EJB - Enterprise JavaBeans خواهیم پرداخت. این فناوری بخشی از مشخصات Java EE است. ما به موضوعاتی مانند:
- EJB چیست
- تاریخچه EJB چیست؟
- چه نوع EJB وجود دارد؟
تاریخچه مختصری از EJB
در سال 1996، زمانی که نویسنده این مقاله 5 ساله بود، جاوا از قبل در بین توسعه دهندگان محبوب بود. دلیل این امر API دوستانه، جمع آوری خودکار زباله و غیره بود. جاوا به طور گسترده ای در سیستم های مسئول backend مورد استفاده قرار گرفت. با این حال، با وجود تمام لذت های زبان، برنامه نویسان آن زمان به عملکرد خاصی نیاز داشتند که هنوز در JDK پیاده سازی نشده بود. این نیازها عبارت بودند از:- اطمینان از ماندگاری داده ها؛
- یکپارچگی معامله
- دسترسی رقابتی به داده ها (کنترل چند رشته ای)؛
- و به احتمال زیاد چیز دیگری
EJB چیست؟
EJB به یک معنا یک اصطلاح جمعی است که بسته به زمینه، می تواند به معنای خود فناوری Enterprise JavaBeans به طور کلی یا برخی از نرم افزارهای Enterprise JavaBean خاص (bean) باشد که بخشی از فناوری EJB است. تعریف EJB به عنوان یک فناوری در ویکی پدیا آمده است: Enterprise JavaBeans (همچنین اغلب به عنوان مخفف EJB استفاده می شود) مشخصات یک فناوری برای نوشتن و پشتیبانی از اجزای سرور حاوی منطق تجاری است. این بخشی از Java EE است. این فناوری معمولاً زمانی استفاده می شود که منطق کسب و کار حداقل به یکی از خدمات زیر و اغلب همه آنها نیاز دارد:- پشتیبانی از ماندگاری داده: داده ها باید حتی پس از توقف برنامه ایمن باشند. اغلب با استفاده از پایگاه داده به دست می آید.
- پشتیبانی از تراکنش های توزیع شده؛
- پشتیبانی از اصلاح داده های موازی و چند رشته ای.
- پشتیبانی رویداد؛
- نامگذاری و پشتیبانی دایرکتوری (JNDI)؛
- امنیت و محدودیت دسترسی به داده ها؛
- پشتیبانی از نصب خودکار روی سرور برنامه؛
- دسترسی از راه دور.
انواع EJB
بیایید خلاصه کنیم. EJB یک کلاس جاوای معمولی است که با یکی از حاشیه نویسی های خاص مشخص شده است. به چنین کلاس هایی لوبیا می گویند. بسته به اینکه کلاس با چه حاشیه نویسی مشخص شده است، نماینده یک یا نوع دیگری از EJB (لوبیا) خواهد بود. سه نوع اصلی لوبیا وجود دارد:- Message Driven Beans (لوبیاهای پیام محور);
- Entity Beans - در مشخصات JPA (Java Persistence API) تعریف شده و برای ذخیره داده ها استفاده می شود.
- لوبیا جلسه.
- بی تابعیت (بدون دولت)؛
- stateful (با پشتیبانی از وضعیت جلسه فعلی)؛
- singleton (یک شی برای کل برنامه؛ شروع از EJB 3.1).
لوبیا جلسه
Session Beans یا Session Beans نوع خاصی از لوبیا است. آنها منطق کسب و کار را کپسوله می کنند که مشتری می تواند به صورت برنامه نویسی با فراخوانی متدهای bean آن را فراخوانی کند. فراخوانی متد می تواند انجام دهد:- به صورت محلی، توسط کلاس دیگری در همان JVM به عنوان session bean.
- از راه دور، از طریق شبکه، از JVM دیگر، با استفاده از فناوری جاوا RMI (Remote Method Invocation).
@Stateless
. در زیر مثال می زنیم:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Session beans که از حالت نشست فعلی (Stateful) پشتیبانی میکند ، اطلاعات وضعیت خود را بین تماسهایی که از همان کلاینت دریافت میکند، حفظ میکنند و پس از درخواست صریح مشتری، وجود خود را خاتمه میدهند. این به دلیل این واقعیت است که لوبیاهای حالت دار برای هر مشتری منحصر به فرد است. نمونه ای از کاری که این نوع لوبیا می تواند مسئولیت آن را بر عهده بگیرد، به روز نگه داشتن سبد خرید در یک فروشگاه آنلاین برای هر کاربر است. چرخه زندگی این دانه ها توسط کانتینر EJB مدیریت می شود. این دانه ها نیز هنگام خروج مشتری از بین می روند. ایجاد چنین لوبیاها نیز بسیار آسان است. این یک کلاس جاوا است که با حاشیه نویسی مشخص شده است Stateful
. مثال زیر:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
لوبیا نشست Singleton یک بار در طول عمر برنامه شروع می شود و برای کل عمر برنامه وجود دارد. چنین دانههایی برای موقعیتهایی طراحی شدهاند که در آن یک حالت باید بین همه مشتریان به اشتراک گذاشته شود. مانند لوبیاهای بدون حالت، در لوبیاهای مستقل، توسعه دهنده باید اطمینان حاصل کند که محیط داخل لوبیا به شیوه ای ایمن سازماندهی شده است. بیایید مثالی از لوبیا Singleton ارائه دهیم که به آسانی ایجاد می شود مانند همتایان خود که در بالا مورد بحث قرار گرفت. به راحتی می توان حدس زد که این یک کلاس جاوا با حاشیه نویسی است @Singleton
. با این حال، در این مورد باید مراقب باشید. دو حاشیه نویسی وجود دارد که از نظر نحو یکسان هستند، اما از نظر هدف متفاوت هستند و در بسته های مختلف قرار دارند:
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
. مثال زیر:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
پیام رانده لوبیا
Message Driven Beans، یا MDBs، یا message-driven beans، مانند session bean، برخی از منطق تجاری را پیاده سازی می کنند. اما بر خلاف اقوام خود، MDB یک تفاوت مهم دارد. کلاینت ها هرگز مستقیماً با روش های MDB تماس نمی گیرند. چنین دانههایی اغلب به عنوان شنونده پیامهای JMS (سرویس پیام جاوا) عمل میکنند و برای سازماندهی تبادل پیام ناهمزمان بین بخشهای سیستم عمل میکنند. نمونه ای از چنین پیامی می تواند درخواست تحویل موجودی از یک سیستم خرده فروشی خودکار به یک سیستم مدیریت عرضه باشد. در زیر نمونه ای از لوبیا MDB آورده شده است. برخلاف session beans، ایجاد آن کمی جالب تر است:import javax.annotation.Resource;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(mappedName = "jms/TestQueue")
public class MessageDrivenEjbExample implements MessageListener {
@Resource
private MessageDrivenContext messageDrivenContext;
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage msg = (TextMessage) message;
msg.getText();
}
} catch (JMSException e) {
messageDrivenContext.setRollbackOnly();
}
}
}
حاشیه نویسی MessageDriven
کلاس MDB ما را یک لوبیا می کند. در داخل حاشیهنویسی، با استفاده از JNDI (در مورد JNDI اینجا بخوانید )، نام توزیع JMS مشخص میشود که کلاس ما به یک شنونده تبدیل میشود. علاوه بر این، کلاس ما اینترفیس MessageListener
و متد آن را پیاده سازی می کند onMessage
. این روش زمانی فراخوانی میشود که پیامی از صف/توزیع با نامی که در داخل حاشیهنویسی تعریف شده است برسد MessageDriven
.
لوبیا موجودیت
بخشی از فناوری EJB مشخصات JPA است. JPA یا Java Persistence API مشخصاتی است که نگاشت Object-Relational Mapping (ORM) اشیاء جاوا (Entity beans) را ارائه می دهد و یک API برای ذخیره، بازیابی و مدیریت چنین اشیایی ارائه می دهد. JPA به شما این امکان را می دهد که داده های یک پایگاه داده را به عنوان اشیاء جاوا نشان دهید و همچنین اشیاء جاوا را به عنوان رکورد در پایگاه داده ذخیره کنید. هر کلاسی نمی تواند به عنوان چنین شی ای عمل کند، اما Entity beans. Entity Bean یک کلاس جاوا است که یک جدول را در یک پایگاه داده نشان می دهد. نمایش (نقشه برداری) از طریق استفاده از حاشیه نویسی خاص به دست می آید. با کمک آنها، یک کلاس جاوا با یک جدول در پایگاه داده مقایسه می شود، و همچنین فیلدهای یک کلاس جاوا با فیلدهای یک جدول پایگاه داده مقایسه می شود. در اینجا نمونه ای از یک Entity bean با نظرات در کد آورده شده است:@Entity // Делает данный класс Entity бином
@Table(name = "employee") // "Связывает" данный класс с таблицей employee в БД
public class Employee implements Serializable {
@Id // Говорит о том, что поле ниже является первичным ключом
@GeneratedValue(strategy = GenerationType.AUTO) // Определяет тип генерации значений первичного ключа
private int id;
@Column(name="name") // "Связывает" поле ниже с полем name в таблице employee в БД
private String name;
@Column (name="age") // "Связывает" поле ниже с полем age в таблице employee в БД
private int age;
// getters and setters...
}
شایان ذکر است که مطالعه این نوع لوبیا تنها در چارچوب مطالعه مشخصات JPA منطقی است.
نوشتن برنامه: EJB HelloWorld
در این بخش، یک برنامه کوچک Java EE HelloWorld را می نویسیم که آن را روی سرور GlassFish مستقر خواهیم کرد. قبل از خواندن این مقاله، اکیداً توصیه می کنیم که مقاله تنظیم محیط محلی خود را مطالعه کنید .-
یک پروژه Maven جدید در IntelliJ IDEA ایجاد کنید.
فایل -> جدید -> پروژه...
-
روی Next کلیک کنید .
-
پارامترهای پروژه Maven را پر کنید:
-
روی Finish کلیک کنید
-
این پروژه ایجاد شده است و دارای ساختار زیر است:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javarush.lectures</groupId>
<artifactId>ejb_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
</project>
در مرحله بعد می توانید به سراغ کد جاوا بروید. برنامه ما ساده ترین خواهد بود. ما 1 servlet و 1 EJB خواهیم داشت. این یک لوبیا جلسه بدون حالت خواهد بود. در داخل EJB ما فقط 1 متد تعریف می کنیم که رشته Hello World را برمی گرداند. اول از همه، بیایید یک بسته ایجاد کنیم com.javarush.lectures
. سپس، در داخل بسته com.javarush.lectures
، ما bean خود را ایجاد می کنیم - DemoEJB. کد لوبیا در زیر آورده شده است:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
همانطور که قبلا گفته شد، همه چیز بسیار ساده است. گام بعدی ما ایجاد یک servlet است که مقدار را از EJB به عنوان پاسخ به درخواست HTTP ارسال می کند. شایان ذکر است که servlet ها موضوع این مقاله نیستند، اما همچنان باید از آنها برای نشان دادن EJB استفاده کنید. برای انجام این کار، اجازه دهید یک servlet جدید DemoServlet
در همان بسته EJB ایجاد کنیم. کد آن در زیر است:
@WebServlet("/helloWorld")
public class DemoServlet extends HttpServlet {
@EJB
private DemoEJB ejb;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write(ejb.helloWorld());
}
}
در اینجا برخی از نظرات کوتاه در مورد کد وجود دارد. Abstract @WebServlet("/helloWorld")
- کلاس ما را به عنوان یک servlet تعریف می کند که درخواست های HTTP را به نقطه پایانی پردازش می کند /helloWorld
. کلاس ما یک فیلد دارد - DemoEJB ejb
. این لوبیا ما قبلا تعریف شده است. یک حاشیه نویسی روی یک فیلد کلاس - @EJB
تزریق وابستگی (DI) را انجام می دهد. آن ها متغیر ejb به طور خودکار با یک نمونه جدید در صورت نیاز مقداردهی اولیه می شود. کلاس ما از نسل HttpServlet است و یکی از متدهای سوپرکلاس - doGet
. این روش درخواست های HTTP GET را پردازش می کند و دو پارامتر - HttpServletRequest
و HttpServletResponse
. HttpServletRequest
برای به دست آوردن اطلاعات در مورد یک درخواست HTTP ورودی خدمت می کند. HttpServletResponse
برای ایجاد پاسخ به یک درخواست مورد نیاز است. در داخل متد، شی را PrintWriter
از شی پاسخ ( HttpServletResponse
)، با استفاده از getWriter()
. در مرحله بعد، میتوانیم مقداری برای شی بهدستآمده با استفاده از write
. که در واقع همان چیزی است که با نوشتن PrintWriter
مقداری که از EJB تعریف کردهایم در شی -a استفاده میکنیم (مقدار رشته «Hello World!» است). سرویس گیرنده ای که درخواست HTTP را ارسال کرده است، این مقدار را به عنوان پاسخ به درخواست خود دریافت می کند. گام بعدی این است که برنامه را روی سرور GlassFish Java EE راه اندازی کنید. برای انجام این کار، همانطور که در مقاله تنظیم محیط محلی توضیح داده شده است، یک پیکربندی جدید ایجاد می کنیم . در زیر یک اسکرین شات از پیکربندی تکمیل شده برای پروژه فعلی است. مطمئن شوید که سرور GlassFish را قبل از شروع نصب کرده اید: پس از ایجاد پیکربندی راه اندازی، برنامه را با استفاده از منوی Run -> Run 'ejb_demo' یا با استفاده از کلید میانبر Shift+F10 راه اندازی کنید . پس از راهاندازی، میتوانید گزارشهای آن را مشاهده کنید: و همچنین مرورگری که باز میشود: همه اینها نشان میدهد که برنامه طبق برنامه کار میکند.
نتیجه
در این مقاله با EJB - Enterprise JavaBeans آشنا شدیم. ما سوالاتی از قبیل:- EJB چیست؟
- تاریخچه EJB
- انواع مختلف EJB
- Message Driven Beans (لوبیاهای پیام محور);
- Entity Beans - در مشخصات نهادهای JPA (Java Persistence API) تعریف شده و برای ذخیره داده ها استفاده می شود.
- لوبیا جلسه:
- بی تابعیت (بدون دولت)
- Stateful (با پشتیبانی از وضعیت جلسه فعلی)
- singleton (یک شی برای کل برنامه؛ شروع از EJB 3.1)
GO TO FULL VERSION