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-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.
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ş.
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.
- 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).
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ə.
@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
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 MessageDriven
MDB 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 MessageListener
və 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 .-
IntelliJ IDEA-da yeni Maven layihəsi yaradın.
Fayl -> Yeni -> Layihə...
-
Sonrakı klikləyin .
-
Maven layihəsinin parametrlərini doldurun:
-
Bitir klikləyin
-
Layihə yaradılıb və aşağıdakı struktura malikdir:
<?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.lectures
paxlamı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. DemoServlet
Bunun üçü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 - @EJB
ası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 - HttpServletRequest
və HttpServletResponse
. HttpServletRequest
daxil olan HTTP sorğusu haqqında məlumat əldə etməyə xidmət edir. HttpServletResponse
sorğuya cavab yaratmaq üçün lazımdır. Metodun içərisində biz PrintWriter
cavab obyektindən ( HttpServletResponse
) istifadə edərək obyekti alırıq getWriter()
. Bundan sonra, write
. Bu, əslində, PrintWriter
müə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+F10 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.
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
- 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)
GO TO FULL VERSION