JavaRush /Java Blogu /Random-AZ /EJB ilə tanış olun
Анзор Кармов
Səviyyə
Санкт-Петербург

EJB ilə tanış olun

Qrupda dərc edilmişdir
Bu yazıda biz EJB - Enterprise JavaBeans-a baxacağıq. Bu texnologiya Java EE spesifikasiyasının bir hissəsidir. kimi məsələlərə toxunacağıq:
  • EJB nədir;
  • EJB-nin tarixi nədir;
  • EJB-nin hansı növləri var?
EJB və servletlərdən istifadə edərək kiçik HelloWorld proqramı da yazacağıq. EJB təqdimatı - 1Bu məqalə Java SE ilə rahatlaşan və Java EE öyrənməyə başlayan oxucular üçün faydalı olacaq. Bu məqalənin praktik hissəsini tam başa düşmək üçün əvvəlcə “ Yerli mühitin qurulması ” məqaləsini oxumağınız tövsiyə olunur .

EJB-nin Qısa Tarixi

Hələ 1996-cı ildə, bu məqalənin müəllifinin 5 yaşı olanda Java artıq tərtibatçılar arasında məşhur idi. Bunun səbəbi dost API, avtomatik zibil yığılması və s. Java arxa plana cavabdeh olan sistemlərdə geniş istifadə olunurdu. Bununla belə, dilin bütün ləzzətlərinə baxmayaraq, o dövrün proqramçılarına hələ JDK-da tətbiq olunmayan müəyyən funksionallıq lazım idi. Bu ehtiyaclar bunlar idi:
  • məlumatların davamlılığının təmin edilməsi;
  • əməliyyat bütövlüyü
  • məlumatlara rəqabətli giriş (çox yivli nəzarət);
  • və çox güman ki, başqa bir şey.
Bütün bunlar evdə yetişdirilən, öz-özünə yazılan, qapalı kitabxanaların əhalisinin təbii artımına səbəb oldu. Yəni hər kəs öz ehtiyaclarını bacardığı qədər yerinə yetirirdi. Bu, IBM "Hər kəs öz ehtiyaclarını eyni şəkildə qarşılamalıdır" şüarı ilə çıxana və 1997-ci ildə Enterprise Java Bean (EJB) spesifikasiyasını buraxana qədər. Məhz bu, inkişaf prosesini birləşdirməyə və tipik problemlərin həllini (yuxarıda ehtiyaclar kimi təsvir edilmişdir) çərçivəyə götürməyə imkan verdi. Sun 2 ildir ki, IBM-in ideyasını uyğunlaşdırır və 1999-cu ildə EJB 1.0 spesifikasiyasını buraxır. Texnologiyanın necə doğulduğu, daha çox tətbiq olunan bir damarda müzakirə ediləcəkdir.

EJB nədir

EJB müəyyən mənada kontekstdən asılı olaraq ya ümumiyyətlə Enterprise JavaBeans texnologiyasının özünü, ya da EJB texnologiyasının bir hissəsi olan bəzi xüsusi Enterprise JavaBean proqram komponentini (lobya) ifadə edə bilən kollektiv termindir. EJB-nin texnologiya kimi tərifi Vikipediyada verilmişdir: Enterprise JavaBeans (həmçinin tez-tez EJB abbreviaturası kimi istifadə olunur) biznes məntiqini ehtiva edən server komponentlərinin yazılması və dəstəklənməsi texnologiyasının spesifikasiyasıdır. Java EE-nin bir hissəsidir. Bu texnologiya adətən biznes məntiqi aşağıdakı xidmətlərdən ən azı birini və çox vaxt onların hamısını tələb etdikdə istifadə olunur:
  • məlumatların davamlılığı üçün dəstək: proqram dayandırıldıqdan sonra belə məlumatlar təhlükəsiz olmalıdır. Çox vaxt verilənlər bazasından istifadə etməklə əldə edilir;
  • paylanmış əməliyyatlara dəstək;
  • paralel verilənlərin modifikasiyası və multithreading üçün dəstək;
  • hadisə dəstəyi;
  • adlandırma və kataloq dəstəyi (JNDI);
  • təhlükəsizlik və məlumatlara girişin məhdudlaşdırılması;
  • proqram serverində avtomatlaşdırılmış quraşdırma dəstəyi;
  • uzaqdan giriş.
Yuxarıda sadalanan xidmətlər EJB texnologiyasının şübhəsiz üstünlüyüdür. Digər belə bir üstünlük, yuxarıda sadalanan hər şeyin qutudan dərhal çıxmasıdır. Bunlar. proqramçıya paylanmış əməliyyatları dəstəkləmək barədə düşünməyə ehtiyac yoxdur. Proqramçı yalnız hazırda həyata keçirməyə çalışdığı biznes məntiqi haqqında düşünməlidir. Xüsusi proqram komponenti kimi EJB, tətbiqin bəzi biznes məntiqini ehtiva edən EJB spesifikasiyasından bir və ya bir neçə annotasiyaya malik Java sinfidir. EJB spesifikasiyasındakı şərhlər etiketlənmiş sinfə müəyyən səlahiyyətlər, səlahiyyətlər və super güclər verir. Bu barədə aşağıda daha ətraflı oxuyun.

EJB növləri

Gəlin ümumiləşdirək. EJB xüsusi annotasiyalardan biri ilə işarələnmiş adi Java sinfidir. Belə siniflərə lobya deyilir. Sinfin hansı annotasiya ilə qeyd olunduğundan asılı olaraq, bu və ya digər növ EJB (lobya) nümayəndəsi olacaq. Fasulyenin üç əsas növü var:
  • Message Driven Beans (message driven lobya);
  • Entity Beans - JPA (Java Persistence API) spesifikasiyasında müəyyən edilir və məlumatların saxlanması üçün istifadə olunur;
  • Sessiya lobya.
Sonuncu (sessiya lobya) bir neçə alt növə bölünür:
  • vətəndaşlığı olmayan (dövlətsiz);
  • statuslu (cari sessiya vəziyyətini dəstəkləməklə);
  • singleton (bütün proqram üçün bir obyekt; EJB 3.1-dən başlayaraq).
EJB təqdimatı - 2Aşağıda hər bir lobya növünə daha ətraflı baxacağıq.

Sessiya lobya

Session lobya və ya seans lobya, lobya xüsusi növüdür. Onlar müştərinin lobya metodlarını çağırmaqla proqramlı şəkildə çağıra biləcəyi biznes məntiqini əhatə edir. Bir metod çağırışı edə bilər:
  • yerli olaraq, sessiya lobyası ilə eyni JVM-də başqa bir sinif tərəfindən;
  • uzaqdan, şəbəkə üzərindən, başqa JVM-dən, Java RMI (Remote Method Invocation) texnologiyasından istifadə etməklə.
“Sessiya” sözü lobyanın yalnız server müəyyən tapşırığı yerinə yetirərkən mövcud olduğunu və serverin nasazlığı və ya bağlanması halında geri qaytarıla bilməyəcək şəkildə məhv edildiyini nəzərdə tutur. Seans lobya nümunəsinin həyat dövrü EJB konteyneri tərəfindən idarə olunur ( Serialın ilk mühazirəsində EJB konteynerləri haqqında ətraflı oxuya bilərsiniz ). Vətəndaşlığı olmayan sessiya lobyaları vəziyyətləri haqqında məlumat saxlamır. Bu tip komponent müxtəlif müştərilər tərəfindən istifadə edilə bilər. Vətəndaşlığı olmayan lobya bir əməliyyatda tamamlana bilən biznes proseslərini həyata keçirmək üçün istifadə olunur. Məsələn, müştərilərin kredit tarixçəsini yoxlamaq. Tək lobya nümunəsi birdən çox müştəri tərəfindən istifadə oluna bildiyi üçün tərtibatçı paxlanın məlumatlarına iplə təhlükəsiz girişi təmin etməlidir. Bu növ lobya yaratmaq (həmçinin bütün digər seans lobyaları) olduqca sadədir. Bu annotasiya ilə müntəzəm Java sinfidir @Stateless. Aşağıda bir misal verək:
import javax.ejb.Stateless;

@Stateless
public class StatelessEjbExample {
    public String sayHi() {
        return "Hi, I'm Stateless EJB!";
    }
}
Cari sessiya vəziyyətini dəstəkləyən sessiya lobyaları (Statistika) eyni müştəridən ona edilən zənglər arasında vəziyyətləri haqqında məlumatı saxlayır və müştərinin açıq sorğusu əsasında onların mövcudluğunu dayandırır. Bu, dövlət lobyasının hər bir müştəri üçün unikal olması səbəbindən əldə edilir. Bu növ paxlanın cavabdeh ola biləcəyi bir işin nümunəsi, onlayn mağazada alış-veriş səbətini hər bir istifadəçi üçün aktual saxlamaqdır. Bu lobyaların həyat dövrü EJB konteyneri tərəfindən idarə olunur. Bu lobya da müştəri çıxanda məhv olur. Belə lobya yaratmaq da olduqca asandır. Bu annotasiya ilə işarələnmiş Java sinfidir Stateful. Aşağıdakı nümunə:
import javax.ejb.Stateful;

@Stateful
public class StatefulEjbExample {
    public String sayHi() {
        return "Hi, I,m Stateful EJB";
    }
}
Singleton seans lobyaları tətbiqin müddəti ərzində bir dəfə işə salınır və tətbiqin bütün ömrü boyu mövcuddur. Belə lobya bir vəziyyətin bütün müştərilər arasında bölüşdürülməli olduğu vəziyyətlər üçün nəzərdə tutulmuşdur. Vətəndaşlığı olmayan lobya kimi, müstəqil lobyalarda tərtibatçı paxlanın içindəki mühitin iplə təhlükəsiz şəkildə təşkil olunmasını təmin etməlidir. Yuxarıda müzakirə edilən həmkarları kimi yaradılması asan olan Singleton lobyasına misal verək. Bunun annotasiya ilə Java sinfi olduğunu təxmin etmək asandır @Singleton. Ancaq bu vəziyyətdə diqqətli olmaq lazımdır. Sintaksis baxımından eyni olan, lakin məqsədlərinə görə fərqli və müxtəlif paketlərdə yerləşən iki annotasiya var:
  • javax.ejb.Singleton
  • javax.inject.Singleton
EJB yaratmaq üçün siz javax.ejb. Aşağıdakı nümunə:
import javax.ejb.Singleton;

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

Mesajla idarə olunan lobya

Mesajla idarə olunan lobya və ya MDB-lər və ya mesajla idarə olunan lobya, seans lobyaları kimi bəzi biznes məntiqini həyata keçirir. Lakin qohumlarından fərqli olaraq, MDB bir mühüm fərqə malikdir. Müştərilər heç vaxt MDB metodlarını birbaşa çağırmırlar. Bu cür paxlalar ən çox JMS (Java Mesaj Xidməti) mesajları üçün dinləyici rolunu oynayır və sistemin hissələri arasında asinxron mesaj mübadiləsini təşkil etməyə xidmət edir. Belə bir mesaja misal olaraq inventarın avtomatlaşdırılmış pərakəndə satış sistemindən təchizat idarəetmə sisteminə çatdırılması tələbi ola bilər. Aşağıda bir MDB lobya nümunəsidir. Sessiya lobyasından fərqli olaraq, onun yaradılması bir az daha maraqlıdır:
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();
        }
    }

}
Annotasiya MessageDrivenMDB sinifimizi paxlalı edir. Annotasiyanın içərisində JNDI istifadə edərək (JNDI haqqında burada oxuyun ), sinifimizin dinləyiciyə çevrildiyi JMS paylanmasının adı müəyyən edilir. Bundan əlavə, bizim sinif interfeysi MessageListenervə onun metodunu həyata keçirir onMessage. Bu üsul annotasiya daxilində müəyyən edilmiş adla növbədən/paylamadan bəzi mesaj gəldikdə çağırılacaq MessageDriven.

Müəssisə lobya

EJB texnologiyasının bir hissəsi JPA spesifikasiyasıdır. JPA və ya Java Persistence API, Java obyektlərinin (Entity lobya) Obyekt-Relational Xəritəçəkmə (ORM) təmin edən spesifikasiyadır və bu cür obyektlərin saxlanması, əldə edilməsi və idarə edilməsi üçün API təmin edir. JPA verilənlər bazasından verilənləri Java obyektləri kimi təqdim etməyə, həmçinin Java obyektlərini verilənlər bazasında qeydlər kimi saxlamağa imkan verir. Hər sinif belə bir obyekt kimi çıxış edə bilməz, lakin Entity lobya. Entity Bean verilənlər bazasındakı cədvəli təmsil edən Java sinfidir. Göstərmə (xəritələmə) xüsusi annotasiyalardan istifadə etməklə əldə edilir. Onların köməyi ilə Java sinfi verilənlər bazasındakı cədvəllə, eləcə də Java sinifinin sahələri verilənlər bazası cədvəlinin sahələri ilə müqayisə edilir. Kodda şərhləri olan Entity lobya nümunəsi:
@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...
}
Qeyd etmək lazımdır ki, bu növ lobya yalnız JPA spesifikasiyasını öyrənmək kontekstində öyrənmək məna daşıyır.

Ərizə yazmaq: EJB HelloWorld

Bu bölmədə biz GlassFish serverində yerləşdirəcəyimiz kiçik Java EE HelloWorld proqramı yazacağıq. Bu məqaləni oxumazdan əvvəl yerli mühitinizin qurulması ilə bağlı məqaləni oxumağınızı şiddətlə tövsiyə edirik .
  1. IntelliJ IDEA-da yeni Maven layihəsi yaradın.

    Fayl -> Yeni -> Layihə...

    EJB təqdimatı - 3
  2. Sonrakı klikləyin .

  3. Maven layihəsinin parametrlərini doldurun:

    EJB təqdimatı - 4
  4. Bitir klikləyin

  5. Layihə yaradılıb və aşağıdakı struktura malikdir:

    EJB təqdimatı - 5
pom.xml faylı belə görünür: EJB təqdimatı - 6İlk növbədə, Java EE API-dən asılılıq əlavə etməliyik, həmçinin layihəmizin qablaşdırmasını veb proqram arxivi (müharibə) şəklində göstərməliyik. Bunu etmək üçün pom.xml kodunu aşağıdakı forma dəyişdirməlisiniz:
<?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>
Sonra Java koduna keçə bilərsiniz. Tətbiqimiz ən sadə olacaq. Bizdə 1 servlet və 1 EJB olacaq. Bu, vətəndaşlığı olmayan bir sessiya olacaq. EJB daxilində biz “Salam Dünya” sətirini qaytaracaq yalnız 1 metod müəyyən edəcəyik. Əvvəlcə bir paket yaradaq com.javarush.lectures. Sonra paketin içərisində com.javarush.lecturespaxlamızı - DemoEJB yaradacağıq. Fasulye kodu aşağıda verilmişdir:
import javax.ejb.Stateless;

@Stateless
public class DemoEJB {
    public String helloWorld() {
        return "Hello world!";
    }
}
Daha əvvəl deyildiyi kimi, hər şey olduqca sadədir. Növbəti addımımız HTTP sorğusuna cavab olaraq EJB-dən dəyəri ötürəcək bir servlet yaratmaqdır. Qeyd etmək lazımdır ki, servletlər bu məqalənin mövzusu deyil, lakin siz hələ də EJB-ni nümayiş etdirmək üçün onlardan istifadə etməlisiniz. DemoServletBunun üçün EJB ilə eyni paketdə yeni servlet yaradaq . Onun kodu aşağıdadır:
@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());
    }
}
Budur kodla bağlı bəzi qısa şərhlər. Abstract @WebServlet("/helloWorld")- klassımızı HTTP sorğularını son nöqtəyə emal edəcək servlet kimi təyin edir /helloWorld. Sinifimizin bir sahəsi var - DemoEJB ejb. Bu, əvvəllər müəyyən edilmiş lobyamızdır. Sinif sahəsi üzərində annotasiya - @EJBasılılıq inyeksiyasını (DI) yerinə yetirir. Bunlar. ejb dəyişəni lazım olduqda avtomatik olaraq yeni instansiya ilə işə salınır. Sinifimiz HttpServlet nəslindəndir və superclass metodlarından birini əvəz edir - doGet. Bu üsul HTTP GET sorğularını emal edir və iki parametr alır - HttpServletRequestHttpServletResponse. HttpServletRequestdaxil olan HTTP sorğusu haqqında məlumat əldə etməyə xidmət edir. HttpServletResponsesorğuya cavab yaratmaq üçün lazımdır. Metodun içərisində biz PrintWritercavab obyektindən ( HttpServletResponse) istifadə edərək obyekti alırıq getWriter(). Bundan sonra, write. Bu, əslində, PrintWritermüəyyən etdiyimiz EJB-dən əldə etdiyimiz dəyəri -a obyektinə yazmaqla istifadə etdiyimiz şeydir (dəyər “Salam Dünya!” sətridir). HTTP sorğusunu göndərən müştəri bu dəyəri sorğusuna cavab olaraq alacaq. Növbəti addım tətbiqi GlassFish Java EE serverində işə salmaqdır. Bunu etmək üçün, yerli mühitin qurulması ilə bağlı məqalədə təsvir edildiyi kimi yeni bir konfiqurasiya yaradacağıq . Aşağıda cari layihə üçün hazır konfiqurasiyanın ekran görüntüsü verilmişdir. Başlamazdan əvvəl GlassFish serverinin quraşdırıldığına əmin olun: Başlatma konfiqurasiyasını yaratdıqdan sonra Run -> Run 'ejb_demo' menyusundan və ya Shift+F10EJB təqdimatı - 7 isti düymələrindən istifadə edərək proqramı işə salın . Başladıqdan sonra onun qeydlərini görə bilərsiniz: Həmçinin açılan brauzer: Bütün bunlar proqramın nəzərdə tutulduğu kimi işlədiyini göstərir. EJB təqdimatı - 8EJB təqdimatı - 9

Nəticə

Bu yazıda biz EJB - Enterprise JavaBeans ilə tanış olduq. kimi sualları nəzərdən keçirdik:
  • EJB nədir?
  • EJB Tarixi
  • EJB-lərin müxtəlif növləri
Xatırladaq ki, EJB-lər aşağıdakı növlərdə olur:
  • Message Driven Beans (message driven lobya);
  • Entity Beans - JPA (Java Persistence API) subyektlərinin spesifikasiyasında müəyyən edilir və məlumatların saxlanması üçün istifadə olunur;
  • Sessiya lobya:
    • vətəndaşlığı olmayan (dövlətsiz)
    • statuslu (cari sessiya vəziyyətini dəstəkləməklə)
    • singleton (bütün proqram üçün bir obyekt; EJB 3.1-dən başlayaraq)
EJB-dən istifadə edərək kiçik HelloWorld proqramı da yazdıq. PD olaraq bu məqalənin praktik hissəsini özünüz təkrarlaya bilərsiniz. Və sonra tətbiqinizə dəyəri almaq üçün statuslu və təkton lobyadan istifadə edəcək daha iki servlet əlavə edin.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION