Lecture14 (Лекции по Технологии программирования. Компонентный подход), страница 3
Описание файла
Файл "Lecture14" внутри архива находится в папке "Лекции по Технологии программирования. Компонентный подход". PDF-файл из архива "Лекции по Технологии программирования. Компонентный подход", который расположен в категории "". Всё это находится в предмете "основы программной инженерии" из 6 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 3 страницы из PDF
Для создания такого компонента нужно определитьтолько его класс. Обращения к компоненту организуются в виде посылки сообщений к объектуэтого класса как к реализующему интерфейс javax.jms.MessageListener. Вместе с этиминтерфейсом класс компонента EJB, управляемого сообщениями, обязан реализовыватьинтерфейс javax.ejb.MessageDrivenBean.Первый интерфейс требует определения метода void onMessage(javax.jms.Message),который разбирает содержимое пришедшего сообщения и определяет способ его обработки.Кроме того, нужно определить методы void ejbCreate() для создания компонента и voidejbRemove() для освобождения ресурсов при его удалении.Жизненный цикл компонента, управляемого сообщениями выглядит в целом так же, как ижизненный цикл сеансового компонента без состояния (Рис.
77). Вся необходимая информацияпередается такому компоненту в виде данных обрабатываемого им сообщения.Пример реализации класса компонента, управляемого сообщениями, приведен ниже. Данныйкомпонент получает идентификатор издателя, название и ISBN книги и добавляет такую книгу ккнигам, изданным данным издателем.package ru.msu.cmc.prtech.examples;importimportimportimportimportimportimportimportimportjavax.ejb.EJBException;javax.ejb.MessageDrivenBean;javax.ejb.MessageDrivenContext;javax.jms.MapMessage;javax.jms.Message;javax.jms.MessageListener;javax.naming.Context;javax.naming.InitialContext;javax.naming.NamingException;public class TransferProcessorBeanimplements MessageDrivenBean, MessageListener{Context context;public void setMessageDrivenContext (MessageDrivenContext mdc)throws EJBException{try { context = new InitialContext(); }catch (NamingException e) { throw new EJBException(e); }}public void ejbCreate() { }public void onMessage (Message msg){MapMessage message = (MapMessage)msg;try{Integer publisherPK = (Integer)message.getObject("Publisher");String title= (String)message.getObject("Title");String isbn= (String)message.getObject("ISBN");PublisherHomeRemote publisherHome =(PublisherHomeRemote)context.lookup("PublisherHomeRemote ");PublisherRemote publisher = publisherHome.findByPK(publisherPK);publisher.addBook(title, isbn);}catch (Exception e) { throw new EJBException(e); }}}public void ejbRemove () throws EJBException{try { context.close(); }catch (NamingException e) { }}Дескрипторы развертывания компонентов EJBПомимо декларации интерфейсов и классов компонентов, для построения EJB компонентанеобходимо написать дескриптор развертывания — XML файл в специальном формате,определяющий набор компонентов приложения и их основные свойства.Чаще всего дескрипторы развертывания не пишут вручную, их готовят с помощьюспециализированных инструментов для развертывания J2EE приложений или сред разработки(например, такими возможностями обладает среда NetBeans 4.0 [3]).
Здесь мы опишем толькочасть содержимого дескрипторов развертывания. Полное описание используемых в них тегов и ихназначения см. в [2].Дескриптор развертывания упаковывается вместе с байт-кодом классов компонентовприложения в JAR-архив. При развертывании такой архив помещают в выделенную директорию,в которой сервером J2EE ищет развертываемые приложения. После этого сервер сам осуществляетзапуск приложения и поиск кода компонентов, необходимых для обработки поступающихзапросов, на основании информации, предоставленной дескриптором.Заголовок дескриптора развертывания для набора EJB компонентов версии 2.1 выглядитследующим образом.<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans2.0//EN" http://java.sun.com/j2ee/dtds/ejb-jar_2_1.dtd">Дескриптор развертывания содержит следующие теги.•<ejb-jar>Обязательный элемент.Это корневой тег дескриптора развертывания набора EJB компонентов, содержащий всеостальные теги.•<enterprise-beans>Обязательный элемент, должен появиться внутри <ejb-jar> ровно один раз.Содержит набор описаний отдельных EJB компонентов в виде элементов <entity>,<session>, <message-driven>.•<entity> и <session>Эти теги вложены в тег <enterprise-beans> и служат для описания, соответственно,компонентов данных и сеансовых компонентов.
Они могут содержать следующиевложенные теги.o <ejb-name>Требуется ровно один.Задает имя компонента.o <home>Необязателен, начиная с EJB 2.0. В EJB 1.1 требуется ровно один.Указывает полное имя удаленного исходного интерфейса.o <remote>Необязателен, начиная с EJB 2.0. В EJB 1.1 требуется ровно один.Указывает полное имя удаленного интерфейса.o <local-home>Необязателен.Указывает полное имя локального исходного интерфейса.o <local>Необязателен.Указывает полное имя локального интерфейса.o <ejb-class>Требуется ровно один.Указывает полное имя класса компонента.o <primkey-field>Необязателен, используется в описании компонентов данных.Указывает имя поля, являющегося первичным ключом (если он состоит только изодного поля и синхронизацией компонента с базой данных управляет контейнер).o <prim-key-class>Требуется ровно один, используется в описании компонентов данных.Указывает имя класса первичного ключа.
Можно отложить точное определение классапервичного ключа до развертывания, тогда в этом поле указывается java.lang.Object.o <persistence-type>Требуется ровно один, используется в описании компонентов данных.Имеет значения Bean или Container, в зависимости от того, управляется лисинхронизация компонента с базой данных самим компонентом или контейнером.o <cmp-version>Необязателен.Указывает версию спецификаций EJB, в соответствии с которой разработан компонент,что определяет способ управления этим компонентом. Может иметь значения 2.x и 1.x.o <abstract-schema-name>Необязателен.Задает уникальный идентификатор компонента для использования в запросах на языкеEJB QL, который используется для описания запросов к схеме данных при реализациикомпонента данных, самостоятельно управляющего связью с СУБД.o <cmp-field>Один или более, используется в описании компонентов данных.Каждый такой элемент описывает одно поле данных, синхронизация которого с СУБДуправляется EJB контейнером.
Он может содержать тег <description> с описаниемполя и должен содержать тег <field-name> с именем поля. В EJB 2.0 это имя совпадаетс именем абстрактного свойства (для которого в классе компонента декларированыметоды getName() и setName()), а в EJB 1.1 — с именем одного из полей классакомпонента.o<security-role-ref>Один или более, необязателен.Указывает роли, используемые данным компонентом. Они при работе приложенияслужат для авторизации доступа — сопоставляются с ролями, которым разрешен доступк тому или иному методу.Может содержать тег <description> (необязателен) и теги <role-name> (обязателен),<role-link> (необязателен, служит для сопоставления указанного имени роли слогической ролью, описанной в <security-role> раздела <assembly-descriptor>).o<security-identity>Необязателен.Определяет, какую логическую роль будет играть данный компонент при обращениях кдругим компонентам.
Для этого может быть использован вложенный тег <runas><role-name>…</role-name></run-as> для указания имени конкретной логическойроли, или <use-caller-identity/> для указания того, что нужно использовать рольвызывающего клиента.o<session-type>Требуется ровно один, используется в описании сеансовых компонентов.Имеет значения Stateful или Stateless, в зависимости от того, использует ли данныйкомпонент состояние сеанса.o<transaction-type>Требуется ровно один, используется в описании сеансовых компонентов.Имеет значения Container или Bean, в зависимости от того, управляет ли транзакциямиданного компонента контейнер или он сам. В первом случае соответствующиетранзакции должны быть описаны в разделе <assembly-descriptor>, см.
далее.o<query>Один или более, необязателен.Используется для описания запросов, с чьей помощью реализуются некоторые методыкомпонентов данных, которые сами управляют связью с базой данных. Запросыописываются на языке EJB QL [X] и привязываются к методам компонента с помощьютегов <query-method>. Сам код запроса описывается внутри элемента CDATA вовложенном теге <ejb-ql>.Например<query><query-method><method-name>findByName</method-name><method-params><method-param>java.lang.String</method-param></method-params></query-method><ejb-ql><!CDATA[SELECT OBJECT(c) FROM Client c WHERE c.name = ?1]]</ejb-ql></query>•<relationships>Необязателен.
Вложен в <ejb-jar>.Описывает набор отношений между компонентами, которые соответствуют связям в схемебазы данных и автоматически поддерживаются контейнером. Каждое отношениеописывается с помощью вложенного тега <ejb-relation>.o <ejb-relation>Описывает одно отношение и может иметь следующие элементы. <ejb-relation-name>Необязателен, только один.