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

EJB менен тааныштыруу

Группада жарыяланган
Бул макалада биз EJB - Enterprise JavaBeans карап чыгабыз. Бул технология Java EE спецификациясынын бир бөлүгү болуп саналат. сыяктуу маселелерге токтолобуз:
  • EJB деген эмне;
  • EJB тарыхы кандай;
  • EJB кандай түрлөрү бар?
Биз ошондой эле EJB жана сервлеттерди колдонуп кичинекей HelloWorld тиркемесин жазабыз. EJB киргизүү - 1Бул макала Java SE менен ыңгайлуу болуп, Java EE үйрөнө баштаган окурмандар үчүн пайдалуу болот. Бул макаланын практикалык бөлүгүн толук түшүнүү үчүн алгач “ Жергorктүү чөйрөнү орнотуу ” макаласын окуп чыгуу сунушталат .

EJB кыскача тарыхы

1996-жылы, бул макаланын автору 5 жашта болгондо, Java иштеп чыгуучулар арасында популярдуу болгон. Мунун себеби достук API, таштандыларды автоматтык түрдө чогултуу ж.б. Java serverге жооптуу системаларда кеңири колдонулган. Бирок, тилдин бардык ырахаттарына карабастан, ошол убактагы программисттер JDKде ишке ашырыла элек белгилүү бир функцияларды талап кылышкан. Бул муктаждыктар болгон:
  • маалыматтардын туруктуулугун камсыз кылуу;
  • транзакциянын бүтүндүгү
  • маалыматтарга атаандашуу мүмкүнчүлүгү (көп агымдык башкаруу);
  • жана, балким, башка нерсе.
Мунун баары үй-бүлөдө өскөн, өз алдынча жазылган, жабык китепканалардын калкынын табигый өсүшүнө алып келди. Башкача айтканда, ар ким өз муктаждыктарын колунан келишинче аткарды. IBM 1997-жылы "Ар бир адам өз муктаждыктарын бирдей канааттандырышы керек" деген ураан менен чыгып, Enterprise Java Bean (EJB) спецификациясын чыгарганга чейин. Бул өнүгүү процессин унификациялоого жана типтүү проблемаларды (жогоруда муктаждыктар катары сүрөттөлгөн) чечүүнү алHowтарга алууга мүмкүндүк берген. Sun 2 жылдан бери IBMдин ойлоп табуусун адаптациялоодо жана 1999-жылы EJB 1.0 спецификациясын чыгарды. Технология ушундайча пайда болгон, ал мындан ары дагы колдонулуучу венада талкууланат.

EJB деген эмне

Кандайдыр бир мааниде EJB жамааттык термин, ал контекстке жараша жалпысынан Enterprise JavaBeans технологиясын же EJB технологиясынын бир бөлүгү болгон белгилүү бир Enterprise JavaBean программалык компонентин (буурчак) билдирет. Технология катары EJB аныктамасы Wikipedia'да берилген: Enterprise JavaBeans (ошондой эле EJB аббревиатурасы катары да колдонулат) бизнес логикасын камтыган server компоненттерин жазуу жана колдоо технологиясынын спецификациясы. Бул Java EE бөлүгү болуп саналат. Бул технология, адатта, бизнес логикасы төмөнкү кызматтардын жок дегенде бирин жана көбүнчө алардын бардыгын талап кылганда колдонулат:
  • берorштердин туруктуулугун колдоо: маалымат программаны токтоткондон кийин да коопсуз болушу керек. Көбүнчө маалымат базасын колдонуу менен жетишилет;
  • бөлүштүрүлгөн транзакцияларды колдоо;
  • параллелдүү маалыматтарды модификациялоону жана көп агымды колдоо;
  • иш-чараларды колдоо;
  • ат коюу жана каталогду колдоо (JNDI);
  • коопсуздук жана маалыматтарга жетүүнү чектөө;
  • тиркеме serverинде автоматташтырылган орнотууну колдоо;
  • алыстан жетүү.
Жогоруда саналган кызматтар EJB технологиясынын талашсыз артыкчылыгы болуп саналат. Дагы бир артыкчылыгы - жогоруда саналып өткөндөрдүн бардыгы дароо эле кутудан чыгып иштейт. Ошол. программист бөлүштүрүлгөн транзакцияларды колдоо жөнүндө ойлонуунун кереги жок. Программист азыр ишке ашырууга аракет кылып жаткан бизнес логикасы жөнүндө гана ойлонушу керек. Белгилүү бир программалык камсыздоо компоненти катары EJB бул EJB спецификациясынан бир же бир нече annotationлары бар Java классы, анда тиркеменин бизнес логикасынын кээ бирлери камтылган. EJB спецификациясынын annotationлары белгиленген класска белгилүү бир күчтөрдү, ыйгарым укуктарды жана супер күчтөрдү берет. Бул тууралуу төмөндө оку.

EJB түрлөрү

Жыйынтыктап көрөлү. EJB бул атайын annotationлардын бири менен белгиленген кадимки Java классы. Мындай класстар буурчак деп аталат. Класс кандай annotation менен белгиленгенине жараша, ал тигил же бул EJB түрүнүн (буурчак) өкүлү болот. буурчактын үч негизги түрү бар:
  • Message Driven Beans (билдирүү менен негизделген буурчак);
  • Entity Beans - JPA (Java Persistence API) спецификациясында аныкталган жана маалыматтарды сактоо үчүн колдонулат;
  • Session Beans.
Акыркы (сеанс буурчак) бир нече түргө бөлүнөт:
  • жарандыгы жок (мамлекетсиз);
  • штаттык (учурдагы сессиянын абалын колдоо менен);
  • singleton (бардык колдонмо үчүн бир an object; EJB 3.1 баштап).
EJB киргизүү - 2Төмөндө биз төө буурчактын ар бир түрүн кененирээк карап чыгабыз.

Session Beans

Сеанс буурчактары же сеанс буурчактары буурчактын белгилүү бир түрү. Алар кардар буурчактын ыкмаларын чакыруу менен программалык түрдө чакыра турган бизнес логикасын камтыйт. Метод чакыруусу төмөнкүлөрдү жасай алат:
  • жергorктүү түрдө, сессия төө буурчагы сыяктуу эле JVMдеги башка класс тарабынан;
  • алыстан, тармак аркылуу, башка JVMден, Java RMI (Remote Method Invocation) технологиясын колдонуу.
"Сеанс" деген сөз төө буурчактын server белгилүү бир тапшырманы аткарып жатканда гана жеткorктүү экендигин жана server иштебей калганда же өчүрүлгөндө кайра кайтарылгыс түрдө жок кылынарын билдирет. Сеанс буурчак инстанциясынын жашоо цикли EJB контейнери тарабынан башкарылат (Сиз EJB контейнерлери жөнүндө көбүрөөк маалыматты сериянын биринчи лекциясынан окуй аласыз ). Жарандыгы жок сеанс буурчактары алардын абалы жөнүндө маалыматты сактаbyte. Компоненттин бул түрү ар кандай кардарлар тарабынан колдонулушу мүмкүн. Жарандыгы жок төө буурчактар ​​бир операцияда бүтүрө турган бизнес процесстерин ишке ашыруу үчүн колдонулат. Мисалы, кардарлардын кредиттик тарыхын текшерүү. Бир фасоль инстанциясын бир нече кардар колдонушу мүмкүн болгондуктан, иштеп чыгуучу фасольдин маалыматтарына жип менен коопсуз кирүү мүмкүнчүлүгүн камсыз кылышы керек. Мындай түрдөгү төө буурчакты түзүү (ошондой эле бардык башка сеанс төө буурчактары сыяктуу) абдан жөнөкөй. Бул annotationсы бар кадимки Java классы @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
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 бир маанилүү айырмасы бар. Кардарлар 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ктүү чөйрөнү орнотуу боюнча макаланы окуп чыгууну сунуштайбыз .
  1. IntelliJ IDEAда жаңы Maven долбоорун түзүңүз.

    Файл -> Жаңы -> Долбоор...

    EJB киргизүү - 3
  2. Click Next .

  3. Maven долбоорунун параметрлерин толтуруңуз:

    EJB киргизүү - 4
  4. Finish дегенди басыңыз

  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(). Андан кийин, биз пайда болгон an objectке кандайдыр бир маанини write. Бул, чынында, биз аныктаган EJBден алынган маанини -a an objectине жазууда колдонобуз PrintWriter(маани "Салам дүйнө!" сапы). HTTP сурамын жөнөткөн кардар бул маанини анын суроосуна жооп катары алат. Кийинки кадам GlassFish Java EE serverинде тиркемени ишке киргизүү. Бул үчүн, биз жергorктүү чөйрөнү орнотуу боюнча макалада айтылгандай, жаңы конфигурацияны түзөбүз . Төмөндө учурдагы долбоор үчүн даяр конфигурациянын скриншоту. Баштоодон мурун сизде GlassFish serverи орнотулганын текшериңиз: Ишке киргизүү конфигурациясын түзгөндөн кийин, Run -> Run 'ejb_demo' менюсунан же Shift+F10EJB киргизүү - 7 ысык баскычын колдонуп, тиркемени ишке киргизиңиз . Ишке киргизгенден кийин, сиз анын журналдарын көрө аласыз: Жана ошондой эле ачылуучу браузер: Мунун баары тиркеме ойдогудай иштегендигин көрсөтүп турат. EJB киргизүү - 8EJB киргизүү - 9

Корутунду

Бул макалада биз EJB - Enterprise JavaBeans менен тааныштык. сыяктуу суроолорду карап чыктык:
  • EJB деген эмне?
  • EJB тарыхы
  • EJBтердин ар кандай түрлөрү
Эскерте кетсек, EJBs төмөнкү түрлөрү менен келет:
  • Message Driven Beans (билдирүү менен негизделген буурчак);
  • Entity Beans - JPA (Java Persistence API) субъекттеринин спецификациясында аныкталган жана маалыматтарды сактоо үчүн колдонулат;
  • Сеанс буурчактары:
    • жарандыгы жок (мамлекетсиз)
    • абалы боюнча (учурдагы сессиянын абалын колдоо менен)
    • singleton (бардык колдонмо үчүн бир an object; EJB 3.1 баштап)
Биз ошондой эле EJB аркылуу кичинекей HelloWorld тиркемесин жаздык. PD катары сиз бул макаланын практикалык бөлүгүн өзүңүз кайталай аласыз. Андан кийин колдонмоңузга дагы эки сервлет кошуңуз, алар бааны алуу үчүн штаттык жана синглтон буурчактарды колдонот.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION