Бул макалада биз EJB - Enterprise JavaBeans карап чыгабыз. Бул технология Java EE спецификациясынын бир бөлүгү болуп саналат. сыяктуу маселелерге токтолобуз:
- EJB деген эмне;
- EJB тарыхы кандай;
- EJB кандай түрлөрү бар?
EJB кыскача тарыхы
1996-жылы, бул макаланын автору 5 жашта болгондо, Java иштеп чыгуучулар арасында популярдуу болгон. Мунун себеби достук API, таштандыларды автоматтык түрдө чогултуу ж.б. Java serverге жооптуу системаларда кеңири колдонулган. Бирок, тилдин бардык ырахаттарына карабастан, ошол убактагы программисттер JDKде ишке ашырыла элек белгилүү бир функцияларды талап кылышкан. Бул муктаждыктар болгон:- маалыматтардын туруктуулугун камсыз кылуу;
- транзакциянын бүтүндүгү
- маалыматтарга атаандашуу мүмкүнчүлүгү (көп агымдык башкаруу);
- жана, балким, башка нерсе.
EJB деген эмне
Кандайдыр бир мааниде EJB жамааттык термин, ал контекстке жараша жалпысынан Enterprise JavaBeans технологиясын же EJB технологиясынын бир бөлүгү болгон белгилүү бир Enterprise JavaBean программалык компонентин (буурчак) билдирет. Технология катары EJB аныктамасы Wikipedia'да берилген: Enterprise JavaBeans (ошондой эле EJB аббревиатурасы катары да колдонулат) бизнес логикасын камтыган server компоненттерин жазуу жана колдоо технологиясынын спецификациясы. Бул Java EE бөлүгү болуп саналат. Бул технология, адатта, бизнес логикасы төмөнкү кызматтардын жок дегенде бирин жана көбүнчө алардын бардыгын талап кылганда колдонулат:- берorштердин туруктуулугун колдоо: маалымат программаны токтоткондон кийин да коопсуз болушу керек. Көбүнчө маалымат базасын колдонуу менен жетишилет;
- бөлүштүрүлгөн транзакцияларды колдоо;
- параллелдүү маалыматтарды модификациялоону жана көп агымды колдоо;
- иш-чараларды колдоо;
- ат коюу жана каталогду колдоо (JNDI);
- коопсуздук жана маалыматтарга жетүүнү чектөө;
- тиркеме serverинде автоматташтырылган орнотууну колдоо;
- алыстан жетүү.
EJB түрлөрү
Жыйынтыктап көрөлү. EJB бул атайын annotationлардын бири менен белгиленген кадимки Java классы. Мындай класстар буурчак деп аталат. Класс кандай annotation менен белгиленгенине жараша, ал тигил же бул EJB түрүнүн (буурчак) өкүлү болот. буурчактын үч негизги түрү бар:- Message Driven Beans (билдирүү менен негизделген буурчак);
- Entity Beans - JPA (Java Persistence API) спецификациясында аныкталган жана маалыматтарды сактоо үчүн колдонулат;
- Session Beans.
- жарандыгы жок (мамлекетсиз);
- штаттык (учурдагы сессиянын абалын колдоо менен);
- singleton (бардык колдонмо үчүн бир an object; EJB 3.1 баштап).
Session Beans
Сеанс буурчактары же сеанс буурчактары буурчактын белгилүү бир түрү. Алар кардар буурчактын ыкмаларын чакыруу менен программалык түрдө чакыра турган бизнес логикасын камтыйт. Метод чакыруусу төмөнкүлөрдү жасай алат:- жергorктүү түрдө, сессия төө буурчагы сыяктуу эле JVMдеги башка класс тарабынан;
- алыстан, тармак аркылуу, башка JVMден, Java RMI (Remote Method Invocation) технологиясын колдонуу.
@Stateless
. Төмөндө бир мисал келтирели:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Учурдагы сеанс абалын (Statful) колдогон сеанс буурчактары ошол эле кардардан ага чалуулардын ортосундагы алардын абалы жөнүндө маалыматты сактап калат жана кардардын ачык өтүнүчү боюнча алардын болушун токтотот. Бул мамлекеттик төө буурчак ар бир кардар үчүн уникалдуу болгондугунун аркасында жетишилет. Төө буурчактын бул түрү жооптуу боло турган тапшырманын мисалы ар бир колдонуучу үчүн интернет-дүкөндөгү корзинаны жаңыртып туруу болуп саналат. Бул буурчактардын жашоо цикли EJB контейнери тарабынан башкарылат. Бул төө буурчак да кардар чыкканда жок кылынат. Мындай буурчактарды түзүү да абдан оңой. Бул annotation менен белгиленген Java классы Stateful
. Төмөндө мисал:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
Singleton сессиясынын буурчактары тиркеменин иштөө мөөнөтүнүн ичинде бир жолу башталат жана колдонмонун бүткүл өмүрү бою бар. Мындай буурчак бир мамлекет бардык кардарлардын ортосунда бөлүштүрүлүшү керек болгон жагдайлар үчүн иштелип чыккан. Жарандыгы жок төө буурчактар сыяктуу эле, өз алдынча төө буурчактарда иштеп чыгуучу төө буурчактын ичиндеги чөйрө жип коопсуз түрдө уюштурулушун камсыз кылышы керек. Келгиле, Singleton буурчакты мисал келтирели, аны түзүү жогоруда талкууланган кесиптештери сыяктуу эле оңой. Бул annotationсы бар Java классы экенин божомолдоо оңой @Singleton
. Бирок, бул учурда этият болушу керек. Синтаксиси боюнча окшош, бирок максаты боюнча айырмаланган жана ар кандай пакеттерде жайгашкан эки annotation бар:
- 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
Message Driven Beans, же MDBs, же билдирүүгө негизделген буурчак, сеанс төө буурчактары сыяктуу бизнес логикасын ишке ашырат. Бирок анын туугандарынан айырмаланып, MDB бир маанилүү айырмасы бар. Кардарлар MDB ыкмаларын эч качан түз чакырышпайт. Мындай буурчактар көбүнчө JMS (Java Message Service) билдирүүлөрүнүн угуучулары катары иштешет жана системанын бөлүктөрүнүн ортосунда асинхрондук билдирүү алмашууну уюштуруу үчүн кызмат кылат. Мындай билдирүүнүн мисалы катары инвентаризацияны автоматташтырылган чекене системадан камсыздоону башкаруу системасына жеткирүү өтүнүчү боло алат. Төмөндө MDB буурчак мисалы болуп саналат. Сеанстын буурчактарынан айырмаланып, аны түзүү бир аз кызыктуураак: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
. Бул ыкма annotationнын ичинде аныкталган аты менен кезектен/бөлүштүрүүдөн кандайдыр бир билдирүү келгенде чакырылат MessageDriven
.
Entity буурчак
EJB технологиясынын бир бөлүгү JPA спецификациясы болуп саналат. JPA, же Java Persistence API, Java an objectилеринин Объект-байланыш картасын (ORM) камсыз кылуучу спецификация (Entity буурчак) жана мындай an objectтерди сактоо, алуу жана башкаруу үчүн API менен камсыз кылат. JPA маалымат базасынан берorштерди Java an objectилери катары көрсөтүүгө, ошондой эле Java an objectилерин маалымат базасында жазуулар катары сактоого мүмкүндүк берет. Мындай an object катары ар бир класс иштей алbyte, бирок Entity буурчактары. Entity Bean – бул маалымат базасындагы tableны көрсөткөн Java классы. Дисплей (карта түзүү) атайын annotationларды колдонуу аркылуу ишке ашат. Алардын жардамы менен Java классы маалымат базасындагы table менен салыштырылат, ошондой эле Java классынын талаалары маалыматтар базасынын tableсынын талаалары менен салыштырылат. Бул жерде codeдогу комментарийлер менен Entity буурчактын мисалы:@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 serverине орнотобуз. Бул макаланы окуудан мурун, жергorктүү чөйрөнү орнотуу боюнча макаланы окуп чыгууну сунуштайбыз .-
IntelliJ IDEAда жаңы Maven долбоорун түзүңүз.
Файл -> Жаңы -> Долбоор...
-
Click 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>
Андан кийин, сиз Java codeуна өтсөңүз болот. Биздин колдонмо эң жөнөкөй болот. Бизде 1 сервлет жана 1 EJB болот. Бул жарандыгы жок сессия төө буурчагы болот. EJB ичинде биз "Hello World" сабын кайтара турган 1 гана ыкманы аныктайбыз. Биринчиден, пакетти түзөлү com.javarush.lectures
. Андан кийин, пакеттин ичинде com.javarush.lectures
биз буурчакты түзөбүз - DemoEJB. буурчак codeу төмөндө келтирилген:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
Жогоруда айтылгандай, баары абдан жөнөкөй. Биздин кийинки кадамыбыз HTTP сурамына жооп катары EJBден маани өткөрүп турган сервлет түзүү. Белгилей кетчү нерсе, сервлеттер бул макаланын темасы эмес, бирок EJB көрсөтүү үчүн аларды колдонушуңуз керек болот. DemoServlet
Бул үчүн, келгиле, EJB менен бир пакетте жаңы сервлет түзөлү . Анын codeу төмөндө:
@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());
}
}
Бул жерде code боюнча кыскача комментарийлер бар. Абстракт @WebServlet("/helloWorld")
- биздин классты акыркы чекитке чейин HTTP сурамдарын иштете турган сервлет катары аныктайт /helloWorld
. Биздин класстын бир талаасы бар - DemoEJB ejb
. Бул биздин мурун аныкталган буурчак. Класс талаасындагы annotation — @EJB
көз карандылыкты киргизүүнү (DI) аткарат. Ошол. ejb өзгөрмөсү талап кылынганда жаңы инстанция менен автоматтык түрдө инициализацияланат. Биздин класс HttpServletтин тукуму жана суперкласстын ыкмаларынын бирин жокко чыгарат - doGet
. Бул ыкма HTTP GET сурамдарын иштетет жана эки параметрди алат - HttpServletRequest
жана HttpServletResponse
. HttpServletRequest
кирүүчү HTTP сурамы жөнүндө маалымат алуу үчүн кызмат кылат. HttpServletResponse
суроо-талапка жооп түзүү үчүн зарыл. Методдун ичинде биз an objectти PrintWriter
жооп an objectинен ( HttpServletResponse
), колдонуу менен алабыз getWriter()
. Андан кийин, биз пайда болгон an objectке кандайдыр бир маанини write
. Бул, чынында, биз аныктаган EJBден алынган маанини -a an objectине жазууда колдонобуз PrintWriter
(маани "Салам дүйнө!" сапы). HTTP сурамын жөнөткөн кардар бул маанини анын суроосуна жооп катары алат. Кийинки кадам GlassFish Java EE serverинде тиркемени ишке киргизүү. Бул үчүн, биз жергorктүү чөйрөнү орнотуу боюнча макалада айтылгандай, жаңы конфигурацияны түзөбүз . Төмөндө учурдагы долбоор үчүн даяр конфигурациянын скриншоту. Баштоодон мурун сизде GlassFish serverи орнотулганын текшериңиз: Ишке киргизүү конфигурациясын түзгөндөн кийин, Run -> Run 'ejb_demo' менюсунан же Shift+F10 ысык баскычын колдонуп, тиркемени ишке киргизиңиз . Ишке киргизгенден кийин, сиз анын журналдарын көрө аласыз: Жана ошондой эле ачылуучу браузер: Мунун баары тиркеме ойдогудай иштегендигин көрсөтүп турат.
Корутунду
Бул макалада биз EJB - Enterprise JavaBeans менен тааныштык. сыяктуу суроолорду карап чыктык:- EJB деген эмне?
- EJB тарыхы
- EJBтердин ар кандай түрлөрү
- Message Driven Beans (билдирүү менен негизделген буурчак);
- Entity Beans - JPA (Java Persistence API) субъекттеринин спецификациясында аныкталган жана маалыматтарды сактоо үчүн колдонулат;
- Сеанс буурчактары:
- жарандыгы жок (мамлекетсиз)
- абалы боюнча (учурдагы сессиянын абалын колдоо менен)
- singleton (бардык колдонмо үчүн бир an object; EJB 3.1 баштап)
GO TO FULL VERSION