JavaRush /Java Blog /Random-TK /EJB bilen tanyşdyrmak
Анзор Кармов
Dereje
Санкт-Петербург

EJB bilen tanyşdyrmak

Toparda çap edildi
Bu makalada EJB - Enterprise JavaBeans-a serederis. Bu tehnologiýa Java EE spesifikasiýasynyň bir bölegidir. Issuesaly meselelere degip geçeris:
  • EJB näme?
  • EJB-iň taryhy näme?
  • EJB haýsy görnüşleri bar?
Şeýle hem, EJB we servletleri ulanyp, kiçijik HelloWorld programmasyny ýazarys. EJB bilen tanyşdyrmak - 1Bu makala Java SE bilen rahat bolan we Java EE öwrenip başlaýan okyjylar üçin peýdaly bolar. Bu makalanyň amaly bölegine doly düşünmek üçin ilki bilen “ environmenterli gurşawy gurmak ” atly makalany okamagyňyz maslahat berilýär.

EJB-iň gysgaça taryhy

1996-njy ýylda, bu makalanyň awtory 5 ýaşyndaka, Java eýýäm döredijileriň arasynda meşhur bolupdy. Munuň sebäbi dostlukly API, awtomatiki zibil ýygnamak we ş.m. Java arkasy üçin jogapkär ulgamlarda giňden ulanyldy. Şeýle-de bolsa, diliň ähli lezzetlerine garamazdan, şol döwrüň programmistleri JDK-da entek durmuşa geçirilmedik käbir funksiýalara mätäçdiler. Bu zerurlyklar:
  • maglumatlaryň dowamlylygyny üpjün etmek;
  • geleşigiň bitewiligi
  • maglumatlara bäsdeşlik ukyby (köp sapakly gözegçilik);
  • we başga bir zat bolmagy ähtimal.
Bularyň hemmesi öýde ösen, özbaşdak ýazylan, ýapyk kitaphanalaryň ilatynyň tebigy ösüşine sebäp boldy. Başgaça aýdylanda, her kim zerurlyklaryny mümkin boldugyça kanagatlandyrdy. IBMagny, “IBM her kim öz islegini birmeňzeş kanagatlandyrmaly” şygary bilen çykyp, 1997-nji ýylda Enterprise Java Bean (EJB) spesifikasiýasyny çykardy. Hut şu ösüş prosesini birleşdirmäge we adaty meseleleriň çözgüdini (ýokarda zerurlyklar hökmünde düşündirilýär) çarçuwada almaga mümkinçilik berdi. Gün 2 ýyl bäri IBM-iň beýnisini uýgunlaşdyrýar we 1999-njy ýylda EJB 1.0 spesifikasiýasyny çykardy. Tehnologiýa şeýle dünýä indi, has giňişleýin damarda ara alnyp maslahatlaşylar.

EJB näme

EJB belli bir manyda, kontekste baglylykda, ýa-da kärhana JavaBeans tehnologiýasynyň ýa-da EJB tehnologiýasynyň bir bölegi bolan belli bir kärhana JavaBean programma üpjünçiligi komponentini (noýba) aňladyp bilýän köpçülikleýin termin. EJB-ni tehnologiýa hökmünde kesgitlemesi Wikipediýada berilýär: Enterprise JavaBeans (köplenç EJB gysgaltmasy hökmünde hem ulanylýar), iş logikasyny öz içine alýan serwer komponentlerini ýazmak we goldamak tehnologiýasynyň spesifikasiýasydyr. Java EE-iň bir bölegi. Bu tehnologiýa, adatça, iş logikasy iň bolmanda aşakdaky hyzmatlardan birini talap edeninde ulanylýar we köplenç olaryň hemmesi:
  • maglumatlaryň dowamlylygy üçin goldaw: programmany togtatandan soň hem maglumatlar howpsuz bolmalydyr. Köplenç maglumat bazasyny ulanmak arkaly gazanylýar;
  • paýlanan amallara goldaw;
  • paralel maglumatlary üýtgetmek we köp okamak üçin goldaw;
  • hadysany goldamak;
  • at bermek we katalog goldawy (JNDI);
  • howpsuzlyk we maglumatlara elýeterliligi çäklendirmek;
  • programma serwerinde awtomatiki gurnama goldawy;
  • uzakdan giriş.
Aboveokarda sanalan hyzmatlar EJB tehnologiýasynyň şübhesiz artykmaçlygydyr. Şeýle artykmaçlygyň ýene biri, ýokarda sanalan zatlaryň hemmesiniň derrew gutulmagydyr. Bular. programmist paýlanan amallary goldamak hakda pikir etmegiň zerurlygy ýok. Programmist diňe häzirki wagtda durmuşa geçirjek bolýan iş logikasy hakda pikirlenmeli. Programma üpjünçiliginiň belli bir bölegi hökmünde EJB, programmanyň käbir iş logikasyny öz içine alýan EJB spesifikasiýasyndan bir ýa-da birnäçe düşündirişli Java synpydyr. EJB spesifikasiýasyndan bellikler bellikli synpa belli bir güýçleri, güýçleri we ägirt güýçleri berýär. Bu barada has giňişleýin okaň.

EJB görnüşleri

Gysgaça jemläliň. EJB, ýörite bellikleriň biri bilen bellenen adaty Java synpy. Şeýle sapaklara noýba diýilýär. Synpyň haýsy bellik bilen bellenendigine baglylykda, ol EJB (noýba) bir ýa-da başga bir görnüşiniň wekili bolar. Fasuliniň üç esasy görnüşi bar:
  • Habar bilen dolandyrylýan noýba (habar bilen dolandyrylýan noýba);
  • Entity fasuly - JPA (Java Persistence API) spesifikasiýasynda kesgitlenendir we maglumatlary saklamak üçin ulanylýar;
  • Sessiýa noýbasy.
Soňky (seans noýbasy) birnäçe kiçi görnüşe bölünýär:
  • raýatsyz (döwletsiz);
  • döwletli (häzirki sessiýa ýagdaýyny goldamak bilen);
  • singleton (tutuş programma üçin bir obýekt; EJB 3.1-den başlap).
EJB bilen tanyşdyrmak - 2Aşakda noýbanyň her görnüşine has jikme-jik serederis.

Sessiýa noýbasy

Sessiýa noýbasy ýa-da seans noýbasy, noýbanyň belli bir görnüşidir. Müşderiniň noýba usullaryny çagyryp, programma taýdan ulanyp boljak iş logikasyny öz içine alýar. Usul jaňy edip biler:
  • ýerli, seans noýbasy ýaly JVM-de başga bir synp tarapyndan;
  • uzakdan, tordan, başga bir JVM-den, Java RMI (Uzakdan usul çagyryş) tehnologiýasyny ulanyp.
“Sessiýa” sözi noýba diňe serweriň belli bir işi ýerine ýetirýän mahaly elýeterlidigini we serwer näsazlygy ýa-da ýapylmagy bilen dolulygyna ýok ediljekdigini aňladýar. Sessiýa noýbasynyň ýaşaýyş sikli EJB konteýner tarapyndan dolandyrylýar ( seriýanyň birinji leksiýasynda EJB konteýnerleri hakda has giňişleýin okap bilersiňiz ). Raýatsyz sessiýa noýbasy öz ýagdaýy barada maglumat saklamaýar. Komponentiň bu görnüşini dürli müşderiler ulanyp bilerler. Raýatlygy bolmadyk noýba, bir amalda tamamlanyp boljak iş amallaryny amala aşyrmak üçin ulanylýar. Mysal üçin, müşderileriň karz taryhyny barlamak. Singleekeje noýba mysalyny birnäçe müşderi ulanyp biljekdigi sebäpli, dörediji noýba maglumatlaryna sapakdan ygtybarly girmeli. Bu görnüşdäki noýba (beýleki sessiýa noýbasy ýaly) döretmek gaty ýönekeý. Bu düşündirişli adaty Java synpy @Stateless. Aşakda bir mysal getireliň:
import javax.ejb.Stateless;

@Stateless
public class StatelessEjbExample {
    public String sayHi() {
        return "Hi, I'm Stateless EJB!";
    }
}
Häzirki sessiýa ýagdaýyny goldaýan sessiýa noýbasy, şol bir müşderiden edilen jaňlaryň arasynda öz ýagdaýy barada maglumatlary saklaýar we müşderiniň aç-açan haýyşy boýunça barlygyny bes edýär. Bu, döwlet noýbasynyň her bir müşderi üçin özboluşlydygy sebäpli gazanylýar. Bu görnüşli noýba jogapkär bolup biljek meseläniň mysaly, söwda arabasyny onlaýn ulanyjyda her ulanyjy üçin täzeläp durmakdyr. Bu noýbalaryň ömrüni EJB konteýner dolandyrýar. Müşderi çykanda bu noýba hem ýok edilýär. Şeýle noýba döretmek hem aňsat. Bu düşündiriş bilen bellenen Java synpy Stateful. Aşakdaky mysal:
import javax.ejb.Stateful;

@Stateful
public class StatefulEjbExample {
    public String sayHi() {
        return "Hi, I,m Stateful EJB";
    }
}
“Singleton” seans noýbasy, programmanyň dowamlylygynyň dowamynda bir gezek başlaýar we programmanyň bütin ömri üçin bar. Şeýle noýba bir müşderiniň arasynda bir ştatyň paýlaşylmaly ýagdaýlary üçin niýetlenendir. Raýatsyz noýba ýaly, özbaşdak noýba görnüşinde öndüriji noýbanyň içindäki daşky gurşawyň sapak taýdan tertipli bolmagyny üpjün etmeli. Aboveokarda ara alnyp maslahatlaşylan kärdeşleri ýaly döretmek aňsat bolan “Singleton” noýbasyna mysal bereliň. Munuň düşündirişli Java synpydygyny çaklamak aňsat @Singleton. Şeýle-de bolsa, bu ýagdaýda seresap bolmaly. Sintaksisde birmeňzeş, ýöne maksady dürli we dürli paketlerde ýerleşýän iki sany düşündiriş bar:
  • javax.ejb.Singleton
  • javax.inject.Singleton
EJB döretmek üçin, annotasiýany ulanmaly javax.ejb. Aşakdaky mysal:
import javax.ejb.Singleton;

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

Habar bilen dolandyrylýan noýba

Habar bilen dolandyrylýan noýba, ýa-da MDB, ýa-da sessiýa noýbasy ýaly habarly noýba käbir iş logikasyny durmuşa geçirýär. Emma garyndaşlaryndan tapawutlylykda MDB-de bir möhüm tapawut bar. Müşderiler hiç haçan MDB usullaryna göni jaň etmeýärler. Şeýle noýba köplenç JMS (Java Message Service) habarlaryny diňleýji hökmünde çykyş edýär we ulgamyň bölekleriniň arasynda asynkron habar alyş-çalşyny guraýar. Şeýle habaryň mysaly, awtomatiki bölek satuw ulgamyndan üpjünçilik dolandyryş ulgamyna inwentarlary ibermek haýyşy bolup biler. Aşakda MDB noýbasynyň mysaly. Sessiýa noýbasyndan tapawutlylykda, onuň döredilmegi birneme gyzykly:
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();
        }
    }

}
Annotasiýa MessageDrivenMDB synpymyzy noýba edýär. Annotasiýanyň içinde JNDI ulanyp (JNDI hakda okaň ) , JMS paýlanyşynyň ady kesgitlenýär, synpymyz diňleýji bolýar. Mundan başga-da, synpymyz interfeýsi MessageListenerwe usuly ýerine ýetirýär onMessage. Bu usul, düşündirişiň içinde kesgitlenen at bilen nobatdan / paýlanyşdan käbir habar gelende çagyrylar MessageDriven.

Kärhana noýbasy

EJB tehnologiýasynyň bir bölegi JPA spesifikasiýasydyr. JPA, ýa-da Java Persistence API, Java obýektleriniň (Entity noýba) obýekt-baglanyşyk kartasyny (ORM) üpjün edýän we şular ýaly zatlary saklamak, almak we dolandyrmak üçin API üpjün edýän spesifikasiýa. JPA maglumatlar bazasyndan maglumatlary Java obýektleri hökmünde görkezmäge, şeýle hem Java obýektlerini maglumatlar bazasyndaky ýazgylar hökmünde ýatda saklamaga mümkinçilik berýär. Her synp beýle obýekt hökmünde hereket edip bilmeýär, ýöne kärhana noýbasy. Entity Bean, maglumatlar bazasyndaky tablisany görkezýän Java synpydyr. Ekran (kartalaşdyrmak) ýörite bellikleri ulanmak arkaly gazanylýar. Olaryň kömegi bilen Java synpy maglumatlar bazasyndaky tablisa bilen deňeşdirilýär, şeýle hem Java synp meýdanlary maglumatlar bazasynyň tablisalary bilen deňeşdirilýär. Ine, koddaky düşündirişler bilen “Entity” noýbasynyň mysaly:
@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...
}
Fasulye bu görnüşiniň diňe JPA spesifikasiýasyny öwrenmek kontekstinde öwrenmegiň manylydygyny bellemelidiris.

Programma ýazmak: EJB HelloWorld

Bu bölümde, GlassFish serwerinde ýerleşdirjek kiçijik Java EE HelloWorld programmasyny ýazarys. Bu makalany okamazdan ozal ýerli gurşawyňyzy gurmak baradaky makalany okamagyňyz maslahat berilýär .
  1. IntelliJ IDEA-da täze Maven taslamasyny dörediň.

    Faýl -> Täze -> Taslama ...

    EJB bilen tanyşdyrmak - 3
  2. "Indiki" düwmesine basyň .

  3. Maven taslamasynyň parametrlerini dolduryň:

    EJB bilen tanyşdyrmak - 4
  4. "Finish" -e basyň

  5. Taslama döredildi we aşakdaky gurluşy bar:

    EJB bilen tanyşdyrmak - 5
Pom.xml faýly şeýle görünýär: EJB bilen tanyşdyrmak - 6Ilki bilen Java EE API-e garaşlylyk goşmaly, şeýle hem web programma arhiwi (uruş) görnüşinde taslamamyzyň gaplanyşyny kesgitlemeli. Munuň üçin pom.xml koduny aşakdaky görnüşe üýtgetmeli:
<?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>
Ondan soň Java koduna geçip bilersiňiz. Biziň arzamyz iň ýönekeý bolar. Bizde 1 servlet we 1 EJB bolar. Bu raýatlygy bolmadyk sessiýa noýbasy bolar. EJB-iň içinde “Salam dünýä” setirini yzyna gaýtarjak diňe 1 usuly kesgitläris. Ilki bilen bukja döredeliň com.javarush.lectures. Soň bolsa, bukjanyň içinde com.javarush.lecturesnoýba - DemoEJB dörederis. Fasulye kody aşakda berilýär:
import javax.ejb.Stateless;

@Stateless
public class DemoEJB {
    public String helloWorld() {
        return "Hello world!";
    }
}
Öň aýdylyşy ýaly hemme zat gaty ýönekeý. Indiki ädimimiz, HTTP haýyşyna jogap hökmünde EJB-den bahany geçirjek servlet döretmekdir. Serwletleriň bu makalanyň mowzugy däldigini bellemelidiris, ýöne EJB-ni görkezmek üçin olary ulanmaly bolarsyňyz. DemoServletMunuň üçin EJB bilen bir paketde täze servlet döredeliň . Onuň kody aşakda:
@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());
    }
}
Ine kod hakda gysga teswirler. Abstrakt @WebServlet("/helloWorld")- synpymyzy HTTP haýyşlaryny ahyrky nokada çenli işleýän serwlet hökmünde kesgitleýär /helloWorld. Biziň synpymyzyň bir ugry bar - DemoEJB ejb. Bu öň kesgitlenen noýba. Synp meýdançasynyň üstünde düşündiriş - @EJBgaraşlylyk sanjymyny (DI) ýerine ýetirýär. Bular. Ejb üýtgeýjisi, zerur bolanda awtomatiki usulda täze mysal bilen başlaýar. Biziň synpymyz HttpServlet-iň neslidir we superklass usullaryndan birini ýok edýär - doGet. Bu usul HTTP GET haýyşlaryny işleýär we iki parametr alýar - HttpServletRequestwe HttpServletResponse. HttpServletRequestgelýän HTTP haýyşy barada maglumat almaga hyzmat edýär. HttpServletResponsehaýyşa jogap döretmek üçin zerur. Usulyň içinde, obýekti ulanyp, PrintWriterjogap obýektinden ( HttpServletResponse) alýarys getWriter(). Ondan soň, ulanylan netijä belli bir baha ýazyp bileris write. Aslynda, kesgitlän PrintWriterEJB-den alnan baha-obýekti ýazmak bilen ulanýan zadymyz (bahasy “Salam Dünýä!” Setiridir). HTTP haýyşyny iberen müşderi, islegine jogap hökmünde bu bahany alar. Indiki ädim, programmany GlassFish Java EE serwerinde işe girizmek. Munuň üçin ýerli gurşawy gurmak baradaky makalada beýan edilişi ýaly täze konfigurasiýa dörederis . Aşakda häzirki taslama üçin taýýar konfigurasiýanyň skrinshoty görkezilýär. Başlamazdan ozal GlassFish serweriniň gurnalandygyna göz ýetiriň: EJB bilen tanyşdyrmak - 7Işletmek konfigurasiýasyny döredeniňizden soň, Run -> Run 'ejb_demo' menýusyny ýa-da Shift + F10 düwmesini ulanyp programmany işe giriziň . Işledilenden soň, onuň gündeligini görüp bilersiňiz: EJB bilen tanyşdyrmak - 8Şeýle hem açylýan brauzer: EJB bilen tanyşdyrmak - 9Bularyň hemmesi programmanyň niýetlenilişi ýaly işleýändigini görkezýär.

Netije

Bu makalada EJB - Enterprise JavaBeans bilen tanyşdyk. Questionsaly soraglara garadyk:
  • EJB näme?
  • EJB Taryhy
  • EJB-leriň dürli görnüşleri
EJB-leriň aşakdaky görnüşlerde bolýandygyny ýadyňyzdan çykarmaň:
  • Habar bilen dolandyrylýan noýba (habar bilen dolandyrylýan noýba);
  • Kärhana noýbasy - JPA (Java Persistence API) guramalarynyň spesifikasiýasynda kesgitlenýär we maglumatlary saklamak üçin ulanylýar;
  • Sessiýa noýbasy:
    • raýatsyz (döwletsiz)
    • döwletli (häzirki sessiýa ýagdaýyny goldamak bilen)
    • singleton (tutuş programma üçin bir obýekt; EJB 3.1-den başlap)
Şeýle hem, EJB ulanyp, kiçijik HelloWorld programmasy ýazdyk. PD hökmünde bu makalanyň amaly bölegini özüňiz gaýtalap bilersiňiz. Soňra bolsa programmaňyza bahany almak üçin döwlet we ýeketäk noýba ulanjak ýene iki sany hyzmat goşuň.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION