JavaRush /Java блогы /Random-KK /EJB таныстыру
Анзор Кармов
Деңгей
Санкт-Петербург

EJB таныстыру

Топта жарияланған
Бұл мақалада біз EJB - Enterprise JavaBeans қарастырамыз. Бұл технология Java EE спецификациясының бөлігі болып табылады. сияқты мәселелерге тоқталамыз:
  • EJB дегеніміз не;
  • EJB тарихы қандай;
  • EJB қандай түрлері бар?
Біз сондай-ақ EJB және сервлеттерді пайдаланып шағын HelloWorld қосымшасын жазамыз. EJB енгізу - 1Бұл мақала Java SE-мен ыңғайлы болған және Java EE тілін үйрене бастаған оқырмандар үшін пайдалы болады. Осы мақаланың практикалық бөлігін толық түсіну үшін алдымен « Жергілікті ортаны орнату » мақаласын оқып шығу ұсынылады .

EJB қысқаша тарихы

1996 жылы, осы мақаланың авторы 5 жаста болғанда, Java әзірлеушілер арасында танымал болды. Бұған ыңғайлы API, қоқыстарды автоматты түрде жинау және т.б. Java serverге жауапты жүйелерде кеңінен қолданылды. Дегенмен, тілдің барлық ләззаттарына қарамастан, сол кездегі бағдарламашыларға JDK-де әлі енгізілмеген белгілі бір функционалдық қажет болды. Бұл қажеттіліктер болды:
  • деректердің тұрақтылығын қамтамасыз ету;
  • транзакцияның тұтастығы
  • деректерге бәсекелестік қолжетімділік (көп ағынды басқару);
  • және, ең алдымен, басқа нәрсе.
Осының бәрі үйдегі, өз бетімен жазылған, жабық кітапханалар халқының табиғи өсуіне әкелді. Басқаша айтқанда, әркім өз қажеттіліктерін мүмкіндігінше қанағаттандырды. Бұл IBM «Әркім өз қажеттіліктерін бірдей қанағаттандыруы керек» деген ұранмен шыққанға дейін және 1997 жылы Enterprise Java Bean (EJB) спецификациясын шығарғанға дейін. Бұл даму процесін бір жүйеге келтіруге және типтік мәселелердің шешімін (жоғарыда қажеттілік ретінде сипатталған) шеңберге қабылдауға мүмкіндік берді. Sun 2 жыл бойы IBM компаниясының идеясын бейімдеді және 1999 жылы EJB 1.0 спецификациясын шығарды. Технология осылай дүниеге келді, ол әрі қарай қолданбалы венада талқыланады.

EJB дегеніміз не

EJB белгілі бір мағынада контекстке байланысты жалпы Enterprise JavaBeans технологиясының өзін немесе EJB технологиясының бөлігі болып табылатын кейбір нақты Enterprise JavaBean бағдарламалық құралының құрамдас бөлігін (бұршақ) білдіруі мүмкін ұжымдық термин. Технология ретінде EJB анықтамасы Уикипедияда берілген: Enterprise JavaBeans (сонымен қатар EJB аббревиатурасы ретінде жиі пайдаланылады) – бизнес логикасы бар server құрамдастарын жазу және қолдау технологиясының спецификациясы. Ол Java EE бөлігі болып табылады. Бұл технология әдетте бизнес логикасы келесі қызметтердің кем дегенде біреуін және көбінесе олардың барлығын қажет еткенде қолданылады:
  • деректер тұрақтылығын қолдау: деректер бағдарламаны тоқтатқаннан кейін де қауіпсіз болуы керек. Көбінесе деректер базасын пайдалану арқылы қол жеткізіледі;
  • бөлінген транзакцияларды қолдау;
  • деректерді параллельді модификациялау және көп ағынды қолдау;
  • іс-шараларды қолдау;
  • атауды және каталогты қолдау (JNDI);
  • қауіпсіздік және деректерге қол жеткізуді шектеу;
  • қолданбалы serverде автоматтандырылған орнатуды қолдау;
  • қашықтан қол жеткізу.
Жоғарыда аталған қызметтер EJB технологиясының сөзсіз артықшылығы болып табылады. Тағы бір артықшылығы - жоғарыда аталғандардың бәрі бірден жұмыс істейді. Анау. бағдарламашыға бөлінген транзакцияларды қолдау туралы ойлаудың қажеті жоқ. Бағдарламашы тек қазіргі уақытта іске асыруға тырысып жатқан бизнес логикасы туралы ойлауы керек. Арнайы бағдарламалық құрал құрамдас бөлігі ретінде EJB қолданбаның кейбір іскери логикасын қамтитын EJB спецификациясының бір немесе бірнеше annotationлары бар Java класы болып табылады. EJB спецификациясындағы annotationлар тегтелген сыныпқа белгілі бір қуаттарды, өкілеттіктерді және үлкен күштерді береді. Бұл туралы төменде оқыңыз.

EJB түрлері

Қорытындылайық. EJB - арнайы annotationлардың бірімен белгіленген кәдімгі Java класы. Мұндай сыныптар бұршақ деп аталады. Класс қандай annotationмен белгіленгеніне байланысты, ол EJB (бұршақ) бір немесе басқа түрінің өкілі болады. Бұршақтардың үш негізгі түрі бар:
  • Message Driven Beans (хабарламаға негізделген бұршақ);
  • Entity Beans - JPA (Java Persistence API) спецификациясында анықталған және деректерді сақтау үшін пайдаланылады;
  • Сеанс бұршақтары.
Соңғысы (сеанс бұршақтары) бірнеше кіші түрлерге бөлінеді:
  • азаматтығы жоқ (мемлекетсіз);
  • күй (ағымдағы сеанс күйін қолдау арқылы);
  • singleton (барлық қолданба үшін бір нысан; EJB 3.1 бастап).
EJB енгізу - 2Төменде біз бұршақтың әрбір түрін толығырақ қарастырамыз.

Сеанс бұршақтары

Сеанс бұршақтары немесе сеанс бұршақтары бұршақтың белгілі бір түрі болып табылады. Олар клиент бұршақтың әдістерін шақыру арқылы бағдарламалы түрде шақыра алатын бизнес логикасын инкапсуляциялайды. Әдіс шақыруы орындай алады:
  • жергілікті түрде, сеанс бұршағы сияқты JVM ішіндегі басқа сынып бойынша;
  • қашықтан, желі арқылы, басқа JVM жүйесінен, Java RMI (Remote Method Invocation) технологиясын пайдалана отырып.
«Сеанс» сөзі бұршақтың server белгілі бір тапсырманы орындаған кезде ғана қолжетімді болатынын және server істен шыққан немесе өшірілген жағдайда қайтарылмайтын түрде жойылатынын білдіреді. Сеанс бұршағы данасының өмірлік циклі EJB контейнерімен басқарылады (EJB контейнерлері туралы толығырақ серияның бірінші лекциясынан оқуға болады ). Азаматтығы жоқ сеанс бұршақтары күйі туралы ақпаратты сақтамайды. Компоненттің бұл түрін әртүрлі клиенттер пайдалана алады. Азаматтығы жоқ бұршақтар бір операцияда аяқталуы мүмкін бизнес-процестерді жүзеге асыру үшін пайдаланылады. Мысалы, клиенттердің несие тарихын тексеру. Жалғыз бұршақ данасын бірнеше клиенттер пайдалана алатындықтан, әзірлеуші ​​бұршақтың деректеріне ағынды қауіпсіз қатынасты қамтамасыз етуі керек. Осы түрдегі бұршақты (сонымен бірге барлық басқа сеанс бұршақтары сияқты) жасау өте қарапайым. Бұл annotationсы бар кәдімгі Java класы @Stateless. Төменде мысал келтірейік:
import javax.ejb.Stateless;

@Stateless
public class StatelessEjbExample {
    public String sayHi() {
        return "Hi, I'm Stateless EJB!";
    }
}
Ағымдағы сеанс күйін (күйін көрсететін) қолдайтын сеанс бөліктері бір клиенттен оған қоңыраулар арасындағы күйі туралы ақпаратты сақтайды және клиенттің нақты сұрауы бойынша олардың болуын тоқтатады. Бұған мемлекеттік бұршақтар әрбір клиент үшін бірегей болғандықтан қол жеткізілді. Бұршақтың бұл түрі жауап беретін тапсырманың мысалы ретінде интернет-дүкенде әр пайдаланушы үшін жаңарған қоржынды сақтау болып табылады. Бұл бұршақтардың өмірлік циклі EJB контейнерімен басқарылады. Бұл бұршақтар да клиент шыққан кезде жойылады. Мұндай бұршақтарды жасау өте оңай. Бұл annotationмен белгіленген Java класы Stateful. Төмендегі мысал:
import javax.ejb.Stateful;

@Stateful
public class StatefulEjbExample {
    public String sayHi() {
        return "Hi, I,m Stateful EJB";
    }
}
Жалғыз сеанс бұршақтары қолданбаның қызмет ету мерзімі ішінде бір рет іске қосылады және қолданбаның бүкіл қызмет ету мерзімінде болады. Мұндай бұршақтар бір күйді барлық клиенттер арасында бөлісу керек жағдайларға арналған. Азаматтығы жоқ бұршақтар сияқты, жеке бұршақтарда әзірлеуші ​​бұршақтың ішіндегі ортаның жіпке қауіпсіз түрде ұйымдастырылғанын қамтамасыз етуі керек. Жоғарыда талқыланған аналогтары сияқты жасау оңай Singleton бұршағына мысал келтірейік. Бұл annotationсы бар Java класы екенін болжау оңай @Singleton. Дегенмен, бұл жағдайда абай болу керек. Синтаксис бойынша бірдей, бірақ мақсаты әр түрлі және әртүрлі пакеттерде орналасқан екі annotation бар:
  • javax.ejb.Singleton
  • javax.inject.Singleton
EJB жасау үшін annotationны пайдалану керек 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 әдістерін тікелей шақырмайды. Мұндай бұршақтар көбінесе 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 нысандарының (Entity бұршақтары) Объектілермен қатынасты салыстыруды (ORM) қамтамасыз ететін және осындай нысандарды сақтауға, шығарып алуға және басқаруға арналған API қамтамасыз ететін спецификация. JPA дерекқордағы деректерді Java нысандары ретінде көрсетуге, сонымен қатар Java нысандарын дерекқордағы жазбалар ретінде сақтауға мүмкіндік береді. Әрбір класс мұндай нысан ретінде әрекет ете алмайды, бірақ Entity beans. Entity Bean — дерекқордағы кестені көрсететін Java класы. Бейнелеу (карталау) арнайы annotationларды қолдану арқылы жүзеге асырылады. Олардың көмегімен Java класы деректер қорындағы кестемен салыстырылады, сонымен қатар Java класының өрістері мәліметтер қоры кестесінің өрістерімен салыстырылады. Мұнда 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

Бұл бөлімде біз GlassFish serverінде орналастыратын шағын Java EE HelloWorld қосымшасын жазамыз. Осы мақаланы оқымас бұрын, жергілікті ортаны орнату туралы мақаланы оқып шығу ұсынылады .
  1. IntelliJ IDEA жүйесінде жаңа Maven жобасын жасаңыз.

    Файл -> Жаңа -> Жоба...

    EJB енгізу - 3
  2. Келесі түймесін басыңыз .

  3. Maven жобасының параметрлерін толтырыңыз:

    EJB енгізу - 4
  4. Аяқтау түймесін басыңыз

  5. Жоба құрылды және келесі құрылымға ие:

    EJB енгізу - 5
pom.xml файлы келесідей көрінеді: EJB енгізу - 6Біріншіден, біз Java EE API-ге тәуелділікті қосуымыз керек, сонымен қатар веб-қосымшалар мұрағаты (соғыс) түрінде жобамыздың қаптамасын көрсетуіміз керек. Ол үшін pom.xml codeын келесі пішінге өзгерту керек:
<?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(). Әрі қарай, нәтижені пайдаланып, алынған нысанға белгілі бір мән жаза аламыз write. Бұл, шын мәнінде, біз анықтаған EJB-дан алынған мәнді -a нысанына жазу арқылы қолданатын нәрсе PrintWriter(мән «Сәлем әлем!» жолы). HTTP сұрауын жіберген клиент бұл мәнді сұрауына жауап ретінде алады. Келесі қадам - ​​қолданбаны GlassFish Java EE serverінде іске қосу. Мұны істеу үшін біз жергілікті ортаны орнату туралы мақалада сипатталғандай жаңа конфигурация жасаймыз . Төменде ағымдағы жоба үшін дайын конфигурацияның скриншоты берілген. Бастамас бұрын GlassFish serverі орнатылғанына көз жеткізіңіз: Іске қосу конфигурациясын жасағаннан кейін, Run -> Run 'ejb_demo' мәзірін немесе Shift+F10EJB - 7-мен таныстыру жылдам пернесін пайдаланып қолданбаны іске қосыңыз . Іске қосылғаннан кейін сіз оның журналдарын көре аласыз: Сондай-ақ ашылатын шолғыш: Мұның бәрі қолданбаның жоспарланғандай жұмыс істейтінін көрсетеді. EJB - 8-мен таныстыруEJB - 9-мен таныстыру

Қорытынды

Бұл мақалада біз EJB – Enterprise JavaBeans бағдарламасымен таныстық. сияқты сұрақтарды қарастырдық:
  • EJB дегеніміз не?
  • EJB тарихы
  • Әртүрлі EJB түрлері
Еске салайық, EJB келесі түрлерде келеді:
  • Message Driven Beans (хабарламаға негізделген бұршақ);
  • Entity Beans - JPA (Java Persistence API) нысандар спецификациясында анықталған және деректерді сақтау үшін пайдаланылады;
  • Сеанс бұршақтары:
    • азаматтығы жоқ (мемлекетсіз)
    • күй (ағымдағы сеанс күйін қолдау арқылы)
    • singleton (барлық қолданба үшін бір нысан; EJB 3.1 бастап)
Біз сондай-ақ EJB көмегімен шағын HelloWorld қосымшасын жаздық. PD ретінде сіз осы мақаланың практикалық бөлігін өзіңіз қайталай аласыз. Содан кейін мәнді алу үшін күй және жалғыз бұршақтарды пайдаланатын қолданбаңызға тағы екі сервлет қосыңыз.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION