Анзор Кармов
مرحله
Санкт-Петербург

معرفی EJB

در گروه منتشر شد
در این مقاله به بررسی EJB - Enterprise JavaBeans خواهیم پرداخت. این فناوری بخشی از مشخصات Java EE است. ما به موضوعاتی مانند:
  • EJB چیست
  • تاریخچه EJB چیست؟
  • چه نوع EJB وجود دارد؟
ما همچنین یک برنامه کوچک HelloWorld با استفاده از EJB و servlets خواهیم نوشت. معرفی EJB - 1این مقاله برای خوانندگانی که با Java SE راحت شده اند و شروع به یادگیری Java EE کرده اند مفید خواهد بود. برای درک کامل قسمت عملی این مقاله، توصیه می شود ابتدا مقاله « تنظیم محیط محلی » را مطالعه کنید.

تاریخچه مختصری از EJB

در سال 1996، زمانی که نویسنده این مقاله 5 ساله بود، جاوا از قبل در بین توسعه دهندگان محبوب بود. دلیل این امر API دوستانه، جمع آوری خودکار زباله و غیره بود. جاوا به طور گسترده ای در سیستم های مسئول backend مورد استفاده قرار گرفت. با این حال، با وجود تمام لذت های زبان، برنامه نویسان آن زمان به عملکرد خاصی نیاز داشتند که هنوز در JDK پیاده سازی نشده بود. این نیازها عبارت بودند از:
  • اطمینان از ماندگاری داده ها؛
  • یکپارچگی معامله
  • دسترسی رقابتی به داده ها (کنترل چند رشته ای)؛
  • و به احتمال زیاد چیز دیگری
همه اینها منجر به رشد طبیعی جمعیت کتابخانه های خانگی، خودنویس و بسته شد. به عبارت دیگر، هرکس نیازهای خود را به بهترین شکل ممکن برآورده کرد. این تا زمانی بود که آی‌بی‌ام با شعار «همه باید نیازهایشان را یکسان برآورده کنند» و مشخصات Enterprise Java Bean (EJB) را در سال 1997 منتشر کرد. این امر باعث شد که فرآیند توسعه یکپارچه شود و راه حل مشکلات معمولی (که در بالا به عنوان نیازها توضیح داده شده است) به چارچوب ارائه شود. Sun به مدت 2 سال از ایده IBM استفاده کرده است و در سال 1999 مشخصات EJB 1.0 را منتشر کرد. اینگونه بود که این فناوری متولد شد، که در ادامه به صورت کاربردی تر مورد بحث قرار خواهد گرفت.

EJB چیست؟

EJB به یک معنا یک اصطلاح جمعی است که بسته به زمینه، می تواند به معنای خود فناوری Enterprise JavaBeans به طور کلی یا برخی از نرم افزارهای Enterprise JavaBean خاص (bean) باشد که بخشی از فناوری EJB است. تعریف EJB به عنوان یک فناوری در ویکی پدیا آمده است: Enterprise JavaBeans (همچنین اغلب به عنوان مخفف EJB استفاده می شود) مشخصات یک فناوری برای نوشتن و پشتیبانی از اجزای سرور حاوی منطق تجاری است. این بخشی از Java EE است. این فناوری معمولاً زمانی استفاده می شود که منطق کسب و کار حداقل به یکی از خدمات زیر و اغلب همه آنها نیاز دارد:
  • پشتیبانی از ماندگاری داده: داده ها باید حتی پس از توقف برنامه ایمن باشند. اغلب با استفاده از پایگاه داده به دست می آید.
  • پشتیبانی از تراکنش های توزیع شده؛
  • پشتیبانی از اصلاح داده های موازی و چند رشته ای.
  • پشتیبانی رویداد؛
  • نامگذاری و پشتیبانی دایرکتوری (JNDI)؛
  • امنیت و محدودیت دسترسی به داده ها؛
  • پشتیبانی از نصب خودکار روی سرور برنامه؛
  • دسترسی از راه دور.
خدمات ذکر شده در بالا مزیت بدون شک فناوری EJB است. یکی دیگر از مزایای این چنینی این است که همه موارد ذکر شده در بالا فوراً خارج از جعبه کار می کنند. آن ها برنامه نویس نیازی به حمایت از تراکنش های توزیع شده ندارد. برنامه نویس فقط باید به منطق تجاری فکر کند که در حال حاضر سعی در پیاده سازی آن دارد. یک EJB به عنوان یک جزء نرم افزاری خاص، یک کلاس جاوا با یک یا چند حاشیه نویسی از مشخصات EJB است که حاوی برخی از منطق تجاری برنامه است. حاشیه نویسی از مشخصات EJB به کلاس برچسب گذاری شده قدرت ها، قدرت ها و ابرقدرت های خاصی می دهد. در ادامه در این مورد بیشتر بخوانید.

انواع EJB

بیایید خلاصه کنیم. EJB یک کلاس جاوای معمولی است که با یکی از حاشیه نویسی های خاص مشخص شده است. به چنین کلاس هایی لوبیا می گویند. بسته به اینکه کلاس با چه حاشیه نویسی مشخص شده است، نماینده یک یا نوع دیگری از EJB (لوبیا) خواهد بود. سه نوع اصلی لوبیا وجود دارد:
  • Message Driven Beans (لوبیاهای پیام محور);
  • Entity Beans - در مشخصات JPA (Java Persistence API) تعریف شده و برای ذخیره داده ها استفاده می شود.
  • لوبیا جلسه.
دومی (sesion beans) به چندین زیرگروه تقسیم می شود:
  • بی تابعیت (بدون دولت)؛
  • stateful (با پشتیبانی از وضعیت جلسه فعلی)؛
  • singleton (یک شی برای کل برنامه؛ شروع از EJB 3.1).
معرفی EJB - 2در زیر با جزئیات بیشتری به هر نوع لوبیا خواهیم پرداخت.

لوبیا جلسه

Session Beans یا Session Beans نوع خاصی از لوبیا است. آنها منطق کسب و کار را کپسوله می کنند که مشتری می تواند به صورت برنامه نویسی با فراخوانی متدهای bean آن را فراخوانی کند. فراخوانی متد می تواند انجام دهد:
  • به صورت محلی، توسط کلاس دیگری در همان JVM به عنوان session bean.
  • از راه دور، از طریق شبکه، از JVM دیگر، با استفاده از فناوری جاوا RMI (Remote Method Invocation).
کلمه "session" به این معنی است که bean فقط زمانی در دسترس است که سرور در حال انجام یک کار خاص است و در صورت خرابی یا خاموش شدن سرور به طور غیر قابل برگشتی از بین می رود. چرخه عمر نمونه Session Bean توسط یک ظرف EJB کنترل می شود (شما می توانید در اولین سخنرانی مجموعه اطلاعات بیشتری در مورد ظروف EJB بخوانید ). لوبیا جلسه بدون حالت، اطلاعات مربوط به وضعیت خود را ذخیره نمی کند. این نوع کامپوننت می تواند توسط مشتریان مختلف استفاده شود. لوبیاهای بدون حالت برای اجرای فرآیندهای تجاری استفاده می شوند که می توانند در یک عملیات تکمیل شوند. به عنوان مثال، بررسی سابقه اعتباری مشتریان. از آنجا که یک نمونه bean می‌تواند توسط چندین مشتری استفاده شود، توسعه‌دهنده باید دسترسی ایمن به داده‌های bean را فراهم کند. ایجاد یک لوبیا از این نوع (و همچنین سایر لوبیاهای جلسه) بسیار ساده است. این یک کلاس جاوا معمولی با حاشیه نویسی است @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
برای ایجاد EJB، باید از حاشیه نویسی استفاده کنید 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 مستقر خواهیم کرد. قبل از خواندن این مقاله، اکیداً توصیه می کنیم که مقاله تنظیم محیط محلی خود را مطالعه کنید .
  1. یک پروژه Maven جدید در IntelliJ IDEA ایجاد کنید.

    فایل -> جدید -> پروژه...

    معرفی EJB - 3
  2. روی Next کلیک کنید .

  3. پارامترهای پروژه Maven را پر کنید:

    معرفی EJB - 4
  4. روی Finish کلیک کنید

  5. این پروژه ایجاد شده است و دارای ساختار زیر است:

    معرفی EJB - 5
فایل pom.xml به این صورت است: معرفی EJB - 6اول از همه، باید یک وابستگی به Java EE API اضافه کنیم و همچنین بسته بندی پروژه خود را در قالب یک آرشیو برنامه وب (جنگ) مشخص کنیم. برای این کار باید کد pom.xml را به شکل زیر تغییر دهید:
<?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 را قبل از شروع نصب کرده اید: معرفی EJB - 7پس از ایجاد پیکربندی راه اندازی، برنامه را با استفاده از منوی Run -> Run 'ejb_demo' یا با استفاده از کلید میانبر Shift+F10 راه اندازی کنید . پس از راه‌اندازی، می‌توانید گزارش‌های آن را مشاهده کنید: معرفی EJB - 8و همچنین مرورگری که باز می‌شود: معرفی EJB - 9همه اینها نشان می‌دهد که برنامه طبق برنامه کار می‌کند.

نتیجه

در این مقاله با EJB - Enterprise JavaBeans آشنا شدیم. ما سوالاتی از قبیل:
  • EJB چیست؟
  • تاریخچه EJB
  • انواع مختلف EJB
به یاد داشته باشید که EJB در انواع زیر وجود دارد:
  • Message Driven Beans (لوبیاهای پیام محور);
  • Entity Beans - در مشخصات نهادهای JPA (Java Persistence API) تعریف شده و برای ذخیره داده ها استفاده می شود.
  • لوبیا جلسه:
    • بی تابعیت (بدون دولت)
    • Stateful (با پشتیبانی از وضعیت جلسه فعلی)
    • singleton (یک شی برای کل برنامه؛ شروع از EJB 3.1)
ما همچنین یک برنامه کوچک HelloWorld با استفاده از EJB نوشتیم. به عنوان یک PD، می توانید قسمت عملی این مقاله را خودتان تکرار کنید. و سپس دو servlet دیگر به برنامه خود اضافه کنید که از stateful و singleton beans برای دریافت مقدار استفاده می کنند.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION