JavaRush /Java blogi /Random-UZ /EJB bilan tanishtirish
Анзор Кармов
Daraja
Санкт-Петербург

EJB bilan tanishtirish

Guruhda nashr etilgan
Ushbu maqolada biz EJB - Enterprise JavaBeans ni ko'rib chiqamiz. Ushbu texnologiya Java EE spetsifikatsiyasining bir qismidir. Biz quyidagi kabi masalalarga to'xtalamiz:
  • EJB nima;
  • EJB tarixi nima;
  • EJB ning qanday turlari mavjud?
EJB va servletlar yordamida kichik HelloWorld ilovasini ham yozamiz. EJB bilan tanishtirish - 1Ushbu maqola Java SE bilan qulay bo'lgan va Java EE ni o'rganishni boshlagan o'quvchilar uchun foydali bo'ladi. Ushbu maqolaning amaliy qismini to'liq tushunish uchun avval " Mahalliy muhitni o'rnatish " maqolasini o'qib chiqish tavsiya etiladi .

EJB ning qisqacha tarixi

1996 yilda, ushbu maqola muallifi 5 yoshga to'lganida, Java allaqachon ishlab chiquvchilar orasida mashhur edi. Buning sababi do'stona API, avtomatik axlat yig'ish va boshqalar edi. Java backend uchun mas'ul bo'lgan tizimlarda keng qo'llanilgan. Biroq, tilning barcha zavqlariga qaramay, o'sha davrdagi dasturchilar JDKda hali amalga oshirilmagan ma'lum funktsiyalarga muhtoj edi. Bu ehtiyojlar quyidagilar edi:
  • ma'lumotlarning barqarorligini ta'minlash;
  • tranzaktsiyaning yaxlitligi
  • ma'lumotlarga raqobatbardosh kirish (ko'p tarmoqli boshqaruv);
  • va, ehtimol, boshqa narsa.
Bularning barchasi uyda o'sadigan, o'z-o'zidan yoziladigan, yopiq kutubxonalar aholisining tabiiy o'sishiga olib keldi. Boshqacha qilib aytganda, har kim o'z ehtiyojlarini imkoni boricha qondirdi. Ya'ni, IBM "Har kim o'z ehtiyojlarini bir xil tarzda qondirishi kerak" shiori bilan chiqdi va 1997 yilda Enterprise Java Bean (EJB) spetsifikatsiyasini chiqardi. Aynan shu narsa rivojlanish jarayonini birlashtirishga va tipik muammolarni hal qilishni (yuqorida ehtiyojlar sifatida tasvirlangan) ramkaga olib borishga imkon berdi. Sun 2 yil davomida IBMning aqliy loyihasini moslashtirdi va 1999 yilda EJB 1.0 spetsifikatsiyasini chiqardi. Texnologiya shu tarzda paydo bo'ldi, bu haqda ko'proq qo'llaniladigan tomirda muhokama qilinadi.

EJB nima

EJB ma'lum ma'noda umumiy atama bo'lib, kontekstga qarab, umuman Enterprise JavaBeans texnologiyasining o'zini yoki EJB texnologiyasining bir qismi bo'lgan ba'zi bir Enterprise JavaBean dasturiy komponentini (loviya) anglatishi mumkin. Texnologiya sifatida EJB ta'rifi Vikipediyada berilgan: Enterprise JavaBeans (shuningdek, EJB qisqartmasi sifatida ham qo'llaniladi) biznes mantiqini o'z ichiga olgan server komponentlarini yozish va qo'llab-quvvatlash texnologiyasining spetsifikatsiyasi. Bu Java EE ning bir qismidir. Ushbu texnologiya odatda biznes mantig'i quyidagi xizmatlardan kamida bittasini va ko'pincha ularning barchasini talab qilganda qo'llaniladi:
  • ma'lumotlarning doimiyligini qo'llab-quvvatlash: dastur to'xtatilgandan keyin ham ma'lumotlar xavfsiz bo'lishi kerak. Ko'pincha ma'lumotlar bazasi yordamida erishiladi;
  • taqsimlangan operatsiyalarni qo'llab-quvvatlash;
  • parallel ma'lumotlarni o'zgartirish va multithreading uchun qo'llab-quvvatlash;
  • tadbirlarni qo'llab-quvvatlash;
  • nomlash va kataloglarni qo'llab-quvvatlash (JNDI);
  • xavfsizlik va ma'lumotlarga kirishni cheklash;
  • dastur serverida avtomatlashtirilgan o'rnatishni qo'llab-quvvatlash;
  • masofaviy kirish.
Yuqorida sanab o'tilgan xizmatlar EJB texnologiyasining shubhasiz afzalligi hisoblanadi. Yana bir bunday afzallik shundaki, yuqorida sanab o'tilgan hamma narsa darhol qutidan tashqarida ishlaydi. Bular. dasturchi taqsimlangan tranzaktsiyalarni qo'llab-quvvatlash haqida o'ylashi shart emas. Dasturchi faqat hozir amalga oshirishga harakat qilayotgan biznes mantig'i haqida o'ylashi kerak. Muayyan dasturiy ta'minot komponenti sifatida EJB - bu EJB spetsifikatsiyasidan bir yoki bir nechta izohlarga ega bo'lgan Java klassi bo'lib, u ilovaning ba'zi biznes mantiqlarini o'z ichiga oladi. EJB spetsifikatsiyasining izohlari teglangan sinfga ma'lum kuchlar, vakolatlar va super kuchlarni beradi. Bu haqda quyida ko'proq o'qing.

EJB turlari

Keling, xulosa qilaylik. EJB bu maxsus izohlardan biri bilan belgilangan oddiy Java sinfidir. Bunday sinflar fasol deb ataladi. Sinf qanday izoh bilan belgilanganiga qarab, u EJB (loviya) ning u yoki bu turining vakili bo'ladi. Fasolning uchta asosiy turi mavjud:
  • Message Driven Beans (xabarga asoslangan loviya);
  • Entity Beans - JPA (Java Persistence API) spetsifikatsiyasida aniqlangan va ma'lumotlarni saqlash uchun ishlatiladi;
  • Seans loviya.
Ikkinchisi (sessiya loviyalari) bir nechta kichik turlarga bo'linadi:
  • fuqaroligi bo'lmagan (davlatsiz);
  • statistik (joriy sessiya holatini qo'llab-quvvatlash bilan);
  • singleton (butun dastur uchun bitta ob'ekt; EJB 3.1 dan boshlab).
EJB bilan tanishtirish - 2Quyida biz fasolning har bir turini batafsil ko'rib chiqamiz.

Seans loviya

Seans loviyalari yoki sessiya loviyalari loviyaning o'ziga xos turidir. Ular mijozning loviya usullarini chaqirish orqali dasturiy ravishda chaqirishi mumkin bo'lgan biznes mantiqini qamrab oladi. Usul chaqiruvi quyidagilarni amalga oshirishi mumkin:
  • mahalliy, seans fasoli bilan bir xil JVMdagi boshqa sinf tomonidan;
  • masofadan, tarmoq orqali, boshqa JVM dan, Java RMI (Remote Method Invocation) texnologiyasidan foydalangan holda.
"Seans" so'zi fasol faqat server ma'lum bir vazifani bajarayotganda mavjud bo'lishini va server ishlamay qolsa yoki o'chirilgan taqdirda qaytarib bo'lmaydigan darajada yo'q qilinishini anglatadi. Seans loviya namunasining hayot aylanishi EJB konteyneri tomonidan boshqariladi (siz EJB konteynerlari haqida ko'proq ma'lumotni seriyaning birinchi ma'ruzasida o'qishingiz mumkin ). Fuqaroligi bo'lmagan seans fasollari o'zlarining holati haqida ma'lumot saqlamaydi. Ushbu turdagi komponentlar turli mijozlar tomonidan ishlatilishi mumkin. Fuqaroligi bo'lmagan fasol bir operatsiyada bajarilishi mumkin bo'lgan biznes jarayonlarini amalga oshirish uchun ishlatiladi. Masalan, mijozlarning kredit tarixini tekshirish. Bitta fasol nusxasi bir nechta mijozlar tomonidan ishlatilishi mumkinligi sababli, ishlab chiquvchi fasol ma'lumotlariga xavfsiz kirishni ta'minlashi kerak. Ushbu turdagi loviya yaratish (shuningdek, barcha boshqa seans loviyalari) juda oddiy. Bu annotatsiya bilan oddiy Java sinfidir @Stateless. Quyida bir misol keltiramiz:
import javax.ejb.Stateless;

@Stateless
public class StatelessEjbExample {
    public String sayHi() {
        return "Hi, I'm Stateless EJB!";
    }
}
Joriy seans holatini (Statistik) qo'llab-quvvatlaydigan seans loviyalari bir mijozdan unga qo'ng'iroqlar orasidagi holati haqida ma'lumotni saqlab qoladi va mijozning aniq so'roviga binoan ularning mavjudligini to'xtatadi. Bunga davlat fasollari har bir mijoz uchun noyob bo'lganligi tufayli erishiladi. Ushbu turdagi loviya mas'ul bo'lishi mumkin bo'lgan vazifaga misol, har bir foydalanuvchi uchun onlayn-do'konda xarid qilish savatini yangilab turishdir. Ushbu fasollarning hayot aylanishi EJB konteyneri tomonidan boshqariladi. Bu fasol ham mijoz chiqib ketganda yo'q qilinadi. Bunday loviyalarni yaratish ham juda oson. Bu izoh bilan belgilangan Java sinfidir Stateful. Quyidagi misol:
import javax.ejb.Stateful;

@Stateful
public class StatefulEjbExample {
    public String sayHi() {
        return "Hi, I,m Stateful EJB";
    }
}
Singleton seans fasollari ilovaning amal qilish muddati davomida bir marta ishga tushiriladi va dasturning butun muddati davomida mavjud. Bunday loviya bir holat barcha mijozlar o'rtasida taqsimlanishi kerak bo'lgan holatlar uchun mo'ljallangan. Fuqaroligi bo'lmagan loviya kabi, mustaqil loviyalarda ishlab chiquvchi loviya ichidagi muhitni ip bilan xavfsiz tarzda tashkil etilishini ta'minlashi kerak. Keling, yuqorida muhokama qilingan hamkasblari kabi yaratilishi oson bo'lgan Singleton fasoliga misol keltiraylik. Bu izohga ega Java sinfi ekanligini taxmin qilish oson @Singleton. Biroq, bu holatda siz ehtiyot bo'lishingiz kerak. Sintaksis bo'yicha bir xil, ammo maqsadi bo'yicha har xil va turli paketlarda joylashgan ikkita izoh mavjud:
  • javax.ejb.Singleton
  • javax.inject.Singleton
EJB yaratish uchun siz annotatsiyadan foydalanishingiz kerak javax.ejb. Quyidagi misol:
import javax.ejb.Singleton;

@Singleton
public class SingletonEjbExample {
    public String sayHi() {
        return "Hi, I'm Singleton EJB!";
    }
}

Message Driven Beans

Message Driven Beans yoki MDBs yoki xabarga asoslangan fasol, masalan, seans fasollari, ba'zi biznes mantiqlarini amalga oshiradi. Ammo qarindoshlaridan farqli o'laroq, MDB bitta muhim farqga ega. Mijozlar hech qachon MDB usullarini to'g'ridan-to'g'ri chaqirmaydilar. Bunday fasollar ko'pincha JMS (Java Message Service) xabarlari uchun tinglovchi sifatida ishlaydi va tizim qismlari o'rtasida asinxron xabar almashinuvini tashkil qilish uchun xizmat qiladi. Bunday xabarga misol sifatida inventarizatsiyani avtomatlashtirilgan chakana savdo tizimidan ta'minotni boshqarish tizimiga etkazib berish bo'yicha so'rov bo'lishi mumkin. Quyida MDB loviya misoli keltirilgan. Seans loviyalaridan farqli o'laroq, uni yaratish biroz qiziqarliroq:
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();
        }
    }

}
Izoh MessageDrivenbizning MDB sinfimizni loviya qiladi. Izoh ichida JNDI yordamida (JNDI haqida bu yerda o'qing ) JMS taqsimotining nomi aniqlanadi, bizning sinfimiz tinglovchiga aylanadi. Bundan tashqari, bizning sinfimiz interfeys MessageListenerva uning usulini amalga oshiradi onMessage. Bu usul navbat/tarqatishdan izohda belgilangan nom bilan ba'zi xabar kelganda chaqiriladi MessageDriven.

Birlik fasollari

EJB texnologiyasining bir qismi JPA spetsifikatsiyasidir. JPA yoki Java Persistence API - bu Java ob'yektlarining (Entity fasollari) Ob'ektga aloqador xaritalash (ORM) ni ta'minlovchi spetsifikatsiyasi va bunday ob'ektlarni saqlash, olish va boshqarish uchun API taqdim etadi. JPA ma'lumotlar bazasidagi ma'lumotlarni Java ob'ektlari sifatida ko'rsatishga, shuningdek Java ob'ektlarini ma'lumotlar bazasida yozuvlar sifatida saqlashga imkon beradi. Har bir sinf bunday ob'ekt sifatida harakat qila olmaydi, lekin Entity beans. Entity Bean - bu ma'lumotlar bazasidagi jadvalni ifodalovchi Java klassi. Displey (xaritalash) maxsus izohlardan foydalanish orqali erishiladi. Ularning yordami bilan Java sinfi ma'lumotlar bazasidagi jadval bilan, shuningdek, Java sinfining maydonlari ma'lumotlar bazasi jadvali maydonlari bilan taqqoslanadi. Mana koddagi izohlar bilan Entity loviya misoli:
@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...
}
Shuni ta'kidlash kerakki, bu turdagi loviya faqat JPA spetsifikatsiyasini o'rganish kontekstida o'rganish mantiqiy.

Ariza yozish: EJB HelloWorld

Ushbu bo'limda biz kichik Java EE HelloWorld ilovasini yozamiz, uni GlassFish serverida joylashtiramiz. Ushbu maqolani o'qishdan oldin, mahalliy muhitni sozlash bo'yicha maqolani o'qib chiqish tavsiya etiladi .
  1. IntelliJ IDEA-da yangi Maven loyihasini yarating.

    Fayl -> Yangi -> Loyiha...

    EJB bilan tanishtirish - 3
  2. Keyingiga bosing .

  3. Maven loyihasi parametrlarini to'ldiring:

    EJB bilan tanishtirish - 4
  4. Finish tugmasini bosing

  5. Loyiha yaratilgan va quyidagi tuzilishga ega:

    EJB bilan tanishtirish - 5
Pom.xml fayli quyidagicha ko'rinadi: EJB bilan tanishtirish - 6Avvalo, biz Java EE API-ga bog'liqlikni qo'shishimiz kerak, shuningdek, veb-ilovalar arxivi (urush) shaklida loyihamizning qadoqlanishini ko'rsatishimiz kerak. Buning uchun pom.xml kodini quyidagi shaklga o'zgartirishingiz kerak:
<?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>
Keyin Java kodiga o'tishingiz mumkin. Bizning arizamiz eng oddiy bo'ladi. Bizda 1 ta servlet va 1 ta EJB bo'ladi. Bu fuqaroligi bo'lmagan seans loviya bo'ladi. EJB ichida biz "Salom dunyo" qatorini qaytaradigan faqat bitta usulni aniqlaymiz. Birinchidan, paketni yarataylik com.javarush.lectures. Keyin, paket ichida com.javarush.lecturesbiz o'z loviyamiz - DemoEJB yaratamiz. Fasol kodi quyida keltirilgan:
import javax.ejb.Stateless;

@Stateless
public class DemoEJB {
    public String helloWorld() {
        return "Hello world!";
    }
}
Yuqorida aytib o'tilganidek, hamma narsa juda oddiy. Bizning keyingi qadamimiz HTTP so'roviga javob sifatida EJB qiymatini uzatadigan servlet yaratishdir. Shuni ta'kidlash kerakki, servletlar ushbu maqolaning mavzusi emas, lekin siz hali ham EJBni namoyish qilish uchun ulardan foydalanishingiz kerak bo'ladi. DemoServletBuning uchun EJB bilan bir xil paketda yangi servlet yarataylik . Uning kodi quyida:
@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());
    }
}
Bu erda kod bo'yicha qisqacha sharhlar mavjud. Abstrakt @WebServlet("/helloWorld")- bizning sinfimizni so'nggi nuqtaga HTTP so'rovlarini qayta ishlaydigan servlet sifatida belgilaydi /helloWorld. Bizning sinfimiz bitta sohaga ega - DemoEJB ejb. Bu bizning yuqorida tavsiflangan fasolimiz. Sinf maydoniga izoh - @EJBqaramlik kiritishni (DI) amalga oshiradi. Bular. Ejb o'zgaruvchisi kerak bo'lganda avtomatik ravishda yangi misol bilan ishga tushiriladi. Bizning sinfimiz HttpServletning avlodidir va superklass usullaridan birini bekor qiladi - doGet. Ushbu usul HTTP GET so'rovlarini qayta ishlaydi va ikkita parametrni oladi - HttpServletRequestva HttpServletResponse. HttpServletRequestkiruvchi HTTP so'rovi haqida ma'lumot olish uchun xizmat qiladi. HttpServletResponseso'rovga javob yaratish uchun kerak. Usul ichida biz ob'ektni PrintWriterjavob ob'ektidan ( HttpServletResponse) yordamida olamiz getWriter(). Keyinchalik, dan foydalanib, olingan ob'ektga qandaydir qiymat yozishimiz mumkin write. Bu, aslida, biz aniqlagan EJB dan olingan qiymatni -a ob'ektiga yozishda foydalanamiz PrintWriter(qiymat "Salom dunyo!" qatoridir). HTTP so'rovini yuborgan mijoz ushbu qiymatni so'roviga javob sifatida oladi. Keyingi qadam dasturni GlassFish Java EE serverida ishga tushirishdir. Buni amalga oshirish uchun biz maqolada tasvirlanganidek, yangi konfiguratsiyani yaratamiz mahalliy muhitni o'rnatish . Quyida joriy loyiha uchun tugallangan konfiguratsiyaning skrinshoti keltirilgan. Boshlashdan oldin GlassFish serveri o'rnatilganligiga ishonch hosil qiling: Ishga tushirish konfiguratsiyasini yaratgandan so'ng, Run -> Run 'ejb_demo' menyusidan yoki Shift+F10EJB bilan tanishtirish - 7 tezkor tugmalaridan foydalanib dasturni ishga tushiring . Ishga tushgandan so'ng siz uning jurnallarini ko'rishingiz mumkin: Shuningdek, ochiladigan brauzer: Bularning barchasi dasturning mo'ljallanganidek ishlashini ko'rsatadi. EJB - 8 bilan tanishtirishEJB bilan tanishtirish - 9

Xulosa

Ushbu maqolada biz EJB - Enterprise JavaBeans bilan tanishdik. Quyidagi kabi savollarni ko'rib chiqdik:
  • EJB nima?
  • EJB tarixi
  • EJB ning har xil turlari
Eslatib o'tamiz, EJBlar quyidagi turlarda keladi:
  • Message Driven Beans (xabarga asoslangan loviya);
  • Entity Beans - JPA (Java Persistence API) ob'ektlar spetsifikatsiyasida belgilangan va ma'lumotlarni saqlash uchun ishlatiladi;
  • Seans loviyalari:
    • fuqaroligi bo'lmagan (davlatsiz)
    • statistik (joriy sessiya holatini qo'llab-quvvatlagan holda)
    • singleton (butun dastur uchun bitta ob'ekt; EJB 3.1 dan boshlab)
Biz EJB yordamida kichik HelloWorld ilovasini ham yozdik. PD sifatida siz ushbu maqolaning amaliy qismini o'zingiz takrorlashingiz mumkin. Va keyin ilovangizga qiymatni olish uchun davlat va yagona loviya ishlatadigan yana ikkita servlet qo'shing.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION