 | Уровень сложности: простой Синг Ли, Автор, Wrox Press
24.05.2005 Geronimo, проект сервера J2EE 1.4 от Apache Software Foundation, интегрирует в себе большой набор существующих служб с открытым исходным кодом для обеспечения совместимости с J2EE 1.4. В первой части этого цикла статей были рассмотрены причины появления Geronimo, цели его дизайна и архитектура, а также некоторые концепции и терминология. В этой завершающей части Синг Ли показывает практическое применение Geronimo. Используя последнюю версию Geronimo, вы протестируете и развернете Web-приложение, корпоративное приложение, Enterprise Java™Beans (EJB-компоненты) и другие компоненты.
Geronimo - сервер J2EE 1.4 с открытым исходным кодом от Apache Software Foundation, созданный в 2003 году. В первой части статьи приведено описание Geronimo с точки зрения дизайна системы, исследована его архитектура, рассмотрены некоторые ключевые структурные концепции и основная терминология. Сейчас продолжите экскурсию по Geronimo и детально исследуйте развертывание, настройку и возможности управления.
Вы узнаете, как этот разносторонний контейнер может помочь вам в вашей каждодневной работе по разработке J2EE-приложений. Начав с нетривиального примера корпоративного приложения, вы будете использовать программу развертывания Geronimo для развертывания и управления жизненным циклом многих стандартных J2EE-модулей. Вы протестируете работу в Geronimo Java Server Pages (JSP), сервлетов и библиотеки тегов в Web-архиве (WAR); сессионный EJB-компонент в корпоративном архиве (EAR); коннектор Java Database Connectivity (JDBC) в архиве ресурсов (RAR); компонент управления данными Container-Managed Persistence (CMP2), использующий язык запросов EJB Query Language (EJB-QL), пакетированный в EAR. Вы рассмотрите иерархию загрузчика классов (classloader) в Geronimo и увидите, как глубоко он зависит от конфигурации. И, наконец, вы изучите в действии поддержку управляемости в Geronimo. Используя консоль Java Management Extensions (JMX), вы посмотрите внутрь Geronimo и увидите развернутые вами Web-компоненты.
Выражаю искреннюю благодарность Гейру Магнуссону (Geir Magnusson, Jr.), Джереми Бойнзу (Jeremy Boynes), Дэвиду Дженксу (David Jencks) и Алану Д. Кабрера (Alan D. Cabrera) из команды Geronimo за ценные комментарии черновиков данной статьи.
Разделение луковицы Geronimo
Из обсуждения архитектуры в первой части вы знаете, что Geronimo работает как контейнер для других контейнеров с открытым исходным кодом (таких как Jetty, Tomcat и OpenEJB), обеспечивающих конфигурирование, управление, развертывание и другие важные службы.
На рисунке 1 изображена вложенность контейнера Geronimo, похожая на строение луковицы. Прежде всего, Geronimo сам является контейнером, охватывающим такие службы как Jetty или Tomcat. Jetty охватывает компоненты Web-приложения, которые вы развертываете (сервлеты, JSPs, библиотеки тегов и т.д.). Здесь важно отметить, что на каждой границе контейнера необходимы метаданные или информация дескриптора развертывания (XML-файл), как показано на рисунке 1:
Рисунок 1. Слой луковицы Geronimo, показывающий вложенность и необходимые метаданные

На рисунке 1 план развертывания j2ee-server-plan.xml указывает Geronimo, как развертывать и конфигурировать службу Jetty. На следующем слое дескриптор развертывания jetty-web.xml указывает службе Jetty, содержащейся внутри Geronimo, как развернуть и сконфигурировать компоненты вашего Web-приложения.
Естественно, стандартные независимые от контейнера дескрипторы развертывания, описанные в спецификации J2EE 1.4, тоже необходимы. К ним относятся web.xml для Web-приложений, ejb-ear.xml для EJB-архивов и application.xml для EAR-файлов.
В этой статье я сконцентрируюсь на конфигурировании и развертывании только готовых к развертыванию модулей J2EE. Конфигурирование и развертывание системных компонентов, таких как Jetty и Tomcat, выходит за рамки рассмотрения данной статьи, хотя механизм аналогичен.
Развертывание и управление жизненным циклом
В таблице 1 приводятся детали различных архивов, которые могут быть развернуты, их дескрипторы развертывания и связанные с ними планы развертывания в Geronimo.
Таблица 1. Готовые к развертыванию архивы с дескрипторами развертывания и планами развертывания в Geronimo
| Разворачиваемый архив | Стандартные дескрипторы развертывания в J2EE-спецификации | Специфический для Geronimo план развертывания |
|---|
| Архивный файл Web-приложения (WAR) | web.xml в каталоге WEB-INF | geronimo-jetty.xml | | JAR, содержащий EJB-компоненты | ejb-jar.xml в каталоге META-INF | openejb-jar.xml | | Корпоративный архивный файл Web-приложения (EAR) | application.xml, с web.xml внутри любого включенного WAR, и ejb-jar.xml внутри любого включенного EJB JAR | geronimo-application.xml | | Архив ресурсов коннектора J2EE (RAR) | ra.xml | geronimo-ra.xml | | Архив клиентского J2EE-приложения (JAR) | application-client.xml | geronimo-application-client.xml |
 | Если сомневаетесь, просто разверните его! Для предоставления наиболее приятных условий пользователям сервера Geronimo спроектирован с набором стандартных планов развертывания для WAR, EJB JAR, и EAR-файлов. Во многих ситуациях этих встроенных по умолчанию планов достаточно. Они делают развертываемыми большинство архивов без необходимости создания специфичных для Geronimo планов развертывания. |
|
Все J2EE-дескрипторы (второй столбец таблицы 1) должны быть упакованы в архив. J2EE-спецификация (смотрите раздел "Ресурсы") указывает месторасположение каждого ресурса, как показано на рисунке 2 (на котором изображены только архивы, расположенные на сервере). Однако расположение планов развертывания Geronimo несколько гибче; одно из возможных месторасположений показано на рисунке 2 прямоугольниками, ограниченными пунктирными линиями:
Рисунок 2. Расположение планов развертывания Geronimo в J2EE-архивах

 | Планы развертывания, конфигурации и компоновщики Вы, наверное, интересуетесь тем, что происходит внутри Geronimo при развертывании Web-модуля. Из первой части вы знаете, что ядро видит только конфигурации. Во время развертывания вызывается специализированный программный компонент, называемый компоновщиком, для преобразования XML-планов развертывания и дескрипторов развертывания в конфигурацию, с которой может работать ядро. Вы время исполнения ядро может оставаться свободным от XML, работая только с конфигурацией. Система Geronimo имеет много специализированных компоновщиков. Например, EARConfigBuilder знает, как создать конфигурацию для корпоративного J2EE-приложения, обрабатывая специфичные для Geronimo планы развертывания и стандартные J2EE-дескрипторы развертывания. |
|
Если вы сравните рисунок 2 с таблицей 1, то можете обнаружить план развертывания для Geronimo в каждом типе архивного файла. Geronimo дает вам возможность выбрать месторасположение этих планов развертывания:
- Внутри архива вместе со связанным дескриптором развертывания, как показано в квадрате, ограниченном точками, на рисунке 2
- Вне архива в виде независимого XML-файла, а также указанным в качестве входной информации при использовании программы развертывания для развертывания архива
Если вы расположили планы развертывания вне архива, вам не нужно использовать имя, указанное в третьем столбце таблицы 1; вы можете использовать для плана любое имя файла. Вынесение планов развертывания из архива имеет некоторые преимущества:
- Сами архивные файлы остаются обычными J2EE-архивами, которые могут быть развернуты на любом совместимом сервере.
- Легко выполняются изменения, поскольку нет необходимости разархивировать, изменять и повторно архивировать планы развертывания.
- Вы можете производить изменения в графическом режиме, используя программу, которая в свою очередь редактирует файл. Это может быть программа развертывания, совместимая с JSR-88, или даже агент автоматизированного управления системой.
Одним незначительным неудобством внешних планов развертывания является то, что до тех пор, пока не станут доступными автоматизированные программы, они требуют ручного отслеживания для хранения в одном месте связанных архивных файлов.
Для беглого знакомства с тем, что происходит в Geronimo при развертывании J2EE-модуля, взгляните на планы развертывания, конфигурации и компоновщики.
Пример "Really Big Pet Store"
Теперь, понимая взаимосвязь между дескрипторами развертывания и планами развертывания Geronimo, вы готовы развернуть Web-приложение в Geronimo. Пример, который я буду использовать в этой статье, называется "Really Big Pet Store" (очень большой зоомагазин). Он является частью приложения электронной коммерции (e-commerce), отображая каталог и управляя простой корзиной покупок. Магазин не большой; фактически он очень маленький. Однако в магазине продаются очень большие животные. На рисунке 3 изображен пример товаров магазина:
Рисунок 3. Перечень товаров магазина "Really Big Pet Store"

Мы будем работать с тремя версиями этого примера, каждая из которых более сложна и использует другой J2EE-пакет для развертывания:
- Автономное Web-приложение. В него входят сервлеты, JSP и библиотека тегов JSP, а также не используются какие-либо внешние ресурсы. Эта версия архивируется в WAR-файл.
- Модификация первой версии, обращающаяся к EJB-компоненту для получения информации о категории продуктов. EJB-компонент является сессионным компонентом и имеет локальный вид. Этот архив объединяется в EAR-файл.
- Дальнейшая эволюция второй версии, в которой сессионный EJB-компонент становится фасадом для EJB-компонента управления данными. EJB-компонент управления данными совместим с EJB2 и использует CMP для доступа к реляционной базе данных. Приложение объединяется в EAR-файл. Однако для него необходимо наличие адаптера ресурсов (JDBC-коннектора), архивированного в RAR-файл. Смотрите раздел "Загрузка", где приведена ссылка на исходный код примера "Really Big Pet Store".
Развертывание WAR
Первая версия примера архивируется в reallybigpet.war, который вы можете найти в каталоге war_only\dist дистрибутива исходного кода примера. В таблице 2 перечислены компоненты этой версии приложения. Все эти компоненты используются и в следующих версиях с изменениями, о которых будет сказано.
Таблица 2. Компоненты Web-приложения "Really Big Pet Store"
| Имя файла | Расположение файла с исходным кодом (каталог) | Описание |
|---|
| StoreController.java | src | Сервлет, выступающий как входной контроллер в этом приложении MVC-стиля. Контроллер перенаправляет входящие запросы на одну из двух JSP-страниц этого приложения. Далее, он обращается к необходимым бизнес-данным из EJB-компонента (неявно через ReallyBigStore.java), и присоединяет их к атрибутам сессии для отображения JSP-страницей презентационного уровня. | | ReallyBigStore.java | src | Вспомогательный класс, предоставляющий статические методы для библиотеки тегов JSP. Он также содержит вспомогательную функцию, получающую информацию о категориях и товарах. Первая версия генерирует свои собственные данные, последующие версии обращаются за этой информацией к EJB-компонентам. | | bigpetstore.jsp | jsp | Это совместимая с JSP 2.0 реализация витрины магазина, отображающая все товары, доступные для продажи. Код полностью свободен от встроенного Java-кода (не использует сценарии). Он интенсивно использует JavaServer Pages Standard Tag Library (JSTL), а также пользовательскую библиотеку тегов. | | checkoutcart.jsp | jsp | Эта JSP-страница реализует каркас корзины покупок для контроля заказов. Код не использует скриптлеты, а применяет JSTL. | | bigpetstore.css | jsp | Таблица стилей, используемая двумя JSP-страницами этого приложения. | | bigpetstore-taglib.jar | WEB-INF/lib | Пользовательская библиотека JSP-тегов, используемая приложением для предоставления данных без применения EJB-компонентов. | | Product.java, LineItem.java, Category.java | src | Корпоративные компоненты JavaBeans, используемые JSP-страницами при обработке информации о зоомагазине. |
Используя таблицу 2 в качестве справочника, вы можете исследовать различные файлы дистрибутива с исходным кодом для того, чтобы понять, как все работает. Сейчас основной интерес - это развертывание и запуск приложения в Geronimo. На рисунке 4 показано, что происходит при развертывании приложения:
Рисунок 4. Развертывание Web-модулей в Geronimo

Как видно из рисунка 4, для развертывания модуля на целевом сервере используется программа развертывания Geronimo, возможно, совместно с планом развертывания Geronimo. Сервер сохраняет метаданные в хранилище конфигураций и исполняемый код в хранилище бинарных данных. Это дает возможность перезапуска сервера с той же самой конфигурацией, если по какой-либо причине он был остановлен.
Запустите Geronimo, перейдя в каталог установки Geronimo и введя команду:
Для запуска конкретной конфигурации в конце команды можно также добавить название этой конфигурации (Смотрите в первой части статьи определение конфигурации). Для целей этого примера подходит системная конфигурация по умолчанию. Вы можете отобразить список всех модулей, выполняющихся при этой конфигурации, при помощи команды:
java -jar bin\deployer.jar list-modules
|
При этом программа запросит вас ввести имя пользователя и пароль. Используйте system в качестве имени пользователя и manager в качестве пароля. Обратите внимание, что для вывода списка модулей используется программа развертывания. Предоставлен командный файл под названием lm.bat для уменьшения утомительного ввода с клавиатуры.
Для развертывания архива reallybigpet.war скопируйте, прежде всего, Web-приложение в домашний каталог Geronimo и выполните команду:
java -jar bin\deployer.jar deploy reallybigpet.war
|
 | Промежуточные версии Geronimo До выпуска официальной версии 1.0 (и J2EE-сертификации) бинарные файлы Geronimo выпускаются в виде промежуточных версий. Каждая успешная версия предоставляет новые возможности. Промежуточные версии (milestone build) обозначаются буквой M и цифрой; например, третья промежуточная версия обозначается M3. Загрузка и использование промежуточных версий - это лучший способ получения относительно стабильной версии для тестирования и экспериментов. Внимательно читайте информацию по версии о том, какие функции отсутствуют или пока являются не стабильными. |
|
Вы можете также использовать командный файл dp.bat. По истечении некоторого времени программа развертывания должна закончить работу и сообщить об успешном развертывании. Обратите внимание на то, что в данном случае нет необходимости использовать отдельный план развертывания geronimo-jetty.xml. Сейчас прекрасно работает план Geronimo по умолчанию для WAR-файлов. Если вы повторно выполните команду просмотра списка модулей, то увидите работающий модуль. По умолчанию он называется reallybigpet, так же как и JAR-файл.
Вы можете попробовать поработать с приложением, используя URL http://localhost:8080/reallybigpet/store.cgi.
Управление жизненным циклом развернутого модуля
Как вы помните из первой части статьи, жизненный цикл компонентов GBean может управляться Geronimo. Вы можете использовать эту возможность для управления поведением Web-приложения. Для остановки приложения используйте команду:
java -jar bin\deployer.jar stop reallybigpet
|
Если вы попробуете обратиться к URL магазина после остановки приложения, Geronimo не ответит. Для повторного запуска приложения используйте команду:
java -jar bin\deployer.jar start reallybigpet
|
Для полного удаления бинарных файлов и метаданных этого модуля из Geronimo используйте команду undeploy:
java -jar bin\deployer.jar undeploy reallybigpet
|
После удаления модуля его снова необходимо развернуть для того, чтобы он опять стал доступен. Если вы обновляете уже развернутый модуль, вы можете использовать команду redeploy. Она эффективно удаляет существующую версию и развертывает новую за один шаг.
Развертывание EAR
Вторая версия примера приложения добавляет в смесь не сохраняющий состояния (stateless) сессионный EJB-компонент. Сервлет контроллера обращается к этому компоненту, чтобы получить список категорий для отображения. Если вы захотите исследовать исходный код, посмотрите в каталог ejb:
- CategoriesHomeLocal.java – домашний интерфейс.
- CategoriesLocal.java – объектный интерфейс.
- CategoriesBean.java – реализация EJB-компонента
Описание нового сессионного компонента вы можете найти в дескрипторе развертывания ejb-jar.xml, приведенном в листинге 1:
Листинг 1. Не сохраняющий состояния сессионный компонент
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN'
'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
<enterprise-beans>
<session>
<display-name>Categories Stateless Session Bean Local Interfaces</display-name>
<ejb-name>CategoriesEJB</ejb-name>
<local-home>com.ibm.dw.reallybigpet.ejb.CategoriesHomeLocal</local-home>
<local>com.ibm.dw.reallybigpet.ejb.CategoriesLocal</local>
<ejb-class>com.ibm.dw.reallybigpet.ejb.CategoriesBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
|
StoreController вызывает метод getCats() из класса ReallyBigPetStore для получения категорий и установки атрибута cats, как показано в листинге 2. Этот атрибут используется bigpetstore.jsp для отображения категорий.
Листинг 2. Извлечение бизнес-данных для представления в JSP
package com.ibm.dw.reallybigpet;
...
public class StoreController extends HttpServlet {
....
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
ArrayList cats = ReallyBigPetStore.getCats();
session.setAttribute("cats", cats);
...
}
...
}
|
Вместо генерирования своих собственных данных ReallyBigPetStore теперь обращается к сессионному компоненту для получения информации о категориях. В листинге 3 приведен код обращения к EJB:
Листинг 3. Получение данных о категориях через сессионный EJB-компонент
package com.ibm.dw.reallybigpet;
import java.util.*;
import com.ibm.dw.reallybigpet.ejb.CategoriesHomeLocal;
import com.ibm.dw.reallybigpet.ejb.CategoriesLocal;
import javax.naming.InitialContext;
import javax.naming.Context;
public class ReallyBigPetStore {
public ReallyBigPetStore() {
}
public static ArrayList getCats() {
CategoriesLocal cl = null;
try {
Context ic = new InitialContext();
Object o = ic.lookup("java:comp/env/CatEJB");
CategoriesHomeLocal ejbhome = (CategoriesHomeLocal) o;
cl = ejbhome.create();
} catch (Exception ex) {
ex.printStackTrace();
}
return cl.getCats();
}
}
|
Дескриптор развертывания для WAR-архива теперь необходим для ссылки на сессионный EJB-компонент. Новый файл web.xml с дополнительным элементом <ejb-local-ref> приведен в листинге 4.
Листинг 4. Дескриптор развертывания со ссылкой на локальный сессионный компонент
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
...
<ejb-local-ref>
<ejb-ref-name>CatEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>
com.ibm.dw.reallybigpet.ejb.CategoriesHomeLocal
</local-home>
<local>com.ibm.dw.reallybigpet.ejb.CategoriesLocal</local>
</ejb-local-ref>
</web-app>
|
Дескриптор развертывания application.xml для EAR, приведенный в листинге 5, указывает архивы внутри EAR и обеспечивает основу контекста (context-root) для приложения:
Листинг 5. Дескриптор развертывания обеспечивает основу контекста для EAR
<application
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/application_1_4.xsd"
version="1.4">
<module>
<ejb>bigpetstore-ejbs.jar</ejb>
</module>
<module>
<web>
<web-uri>reallybigpet.war</web-uri>
<context-root>/ReallyBigPetStore</context-root>
</web>
</module>
</application>
|
 | Получение самой последней версии Geronimo Самым простым способом получения последней версии Geronimo является загрузка последней нестабильной версии с сайта Geronimo (смотрите раздел "Ресурсы"). Другой способ - если вы авантюрист и имеете достаточный практический опыт работы с системами контроля версий, то можете скомпоновать абсолютно последнюю версию Geronimo, проверив код в репозитории. Это процесс больше является искусством, чем наукой. На вашей системе должны быть установлены и работать Subversion, CVS, Maven и Ant (смотрите раздел "Ресурсы"). Следуйте инструкциям официального Geronimo wiki. Разработчики проверяют изменения кода постоянно; если у вас что-нибудь не получится, вы можете повторить процедуру позднее. |
|
Теперь вы можете развернуть reallybigpet.ear (из каталога dist, но убедитесь в том, что предварительно удалили предыдущий пример).
Удивительно, но хотя архив содержит внешние к WAR EJB-компоненты, вам не нужно создавать дополнительный план развертывания geronimo-application.xml для работы модуля. Причина этого заключается в том, что Geronimo пытается как можно больше упростить развертывание. На самом деле он ищет подходящий EJB, просматривая домашний и объектный интерфейсы при разрешении ссылки.
Развертывание коннектора TranQL в RAR
Последняя версия приложения содержит еще один EJB-компонент. На этот раз это EJB-компонент управления данными (entity), использующий CMP2 и EJB-QL для доступа к реляционной базе данных. Эта внешняя зависимость значительно усложняет установку.
Вы должны записать соответствующие данные в реляционной базе данных. Для вашей RDBMS может быть адаптирован сценарий addtab.sql. Сценарий, приведенный в листинге 6, работает с сервером MySQL:
Листинг 6. SQL-сценарий для записи таблицы в УОИ-компонент управления данными CMP2
drop table petcats;
create table petcats (
id varchar(20) NOT NULL,
name varchar(50) NOT NULL,
PRIMARY KEY (id)
) ;
INSERT INTO petcats VALUES( '1', 'New');
INSERT INTO petcats VALUES( '2', 'Clearance');
|
Затем вам необходимо найти JDBC-драйвер для вашей RDBMS и скопировать его в подкаталог каталога репозитория Geronimo. Например, скопируйте драйвер MySQL для этого примера в каталог \mysql\jars.
Для развертывания JDBC-коннектора вы используете коннектор из TranQL, который является частью Geronimo. Коннектор обеспечивает организацию пула соединений и загружает указанный вами JDBC-драйвер. Для настройки этого коннектора вам необходим специфичный для Geronimo план развертывания, поскольку Geronimo не может догадаться, какой JDBC-драйвер вы хотите использовать. Просмотрите файл geronimo-ra.xml, расположенный в каталоге ddcmp. В листинге 7 приведен фрагмент этого файла:
Листинг 7. Развертывание TranQL JDBC-коннектора
<?xml version="1.0"?>
<connector xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector"
version="1.5" configId="PetsDB" parentId="org/apache/geronimo/Server">
<dependency>
<uri>mysql/jars/mysqldriver.jar</uri>
</dependency>
<resourceadapter>
<outbound-resourceadapter>
<connection-definition>
<connectionfactory-interface>
javax.sql.DataSource
</connectionfactory-interface>
<connectiondefinition-instance>
<name>PetsDataSource</name>
...
</resourceadapter>
</connector>
|
В geronimo-ra.xml вы должны отредактировать запись и настроить коннектор на ваш JDBC-драйвер. Обратите внимание на использование ID конфигурации PetsDB в данном случае.
Теперь вы можете развернуть адаптер ресурсов. Используйте команду:
java -jar bin\deployer deploy repository\tranql\rars\tranql-connector-1.0-M4.rar
geronimo-ra.xml
|
Вы должны заглянуть в каталог repository\tranql\rars, чтобы узнать точное название, поскольку оно разное для промежуточных версий и для последней версии Geronimo. (Смотрите вкладки "Промежуточные версии Geronimo" и "Получение самой последней версии Geronimo" для дополнительной информации). После успешного развертывания вы можете выполнить команду list-module и убедиться в том, что исполняется конфигурация (модуль) PetsDB.
Система Geronimo запускает экземпляр Derby RDBMS (смотрите раздел "Ресурсы") в качестве источника данных по умолчанию. Для данного примера вы можете использовать этот экземпляр базы данных. Дополнительную информацию вы можете найти в файле README.TXT, включенном в дистрибутив исходного кода примера.
Конфигурации Geronimo и загрузчики классов
При использовании плана развертывания для Geronimo, как в примере адаптера ресурсов, вы можете указать ID конфигурации (атрибут configId) и ID родительской конфигурации (атрибут parentId). Это даст вам возможность установить иерархию загрузчика классов, разрешая совместное использование кода развернутыми по отдельности модулями. На рисунке 5 изображена иерархия конфигураций:
Рисунок 5. Конфигурации и загрузчики классов

На рисунке 5 конфигурация A является предком конфигурации B, а конфигурация B - это EAR-модуль, содержащий WAR-файл. Белые круги обозначают загрузчики классов Geronimo (в действительности URLClassloader). В данном случае загрузчик классов конфигурации B является потомком загрузчика классов конфигурации A, что дает возможность доступа к коду конфигурации A из конфигурации B. WAR-файл всегда имеет свой собственный загрузчик классов, препятствуя другому коду в том же самом EAR обращаться к классам в WAR.
Развертывание CMP2 EJB в EAR
Последняя версия примера "Really Big Pet Store" использует EJB-компонент управления данными для получения информации о категориях. В данном случае за информацией о категориях к новому компоненту управления данными обращается сессионный компонент. Исходный код EJB-компонента управления данными находится в каталоге ejbcmp:
- CategoryHome – домашний интерфейс.
- CategoryRemote – удаленный интерфейс.
- CategoryBean – реализация EJB-компонента.
Ключ для отображения CMP2 EJB находится в дескрипторе развертывания ejb-jar.xml, приведенном в листинге 8.
Листинг 8. Дескриптор развертывания, показывающий отображения компонента CMP2 и запроса EJB-QL
<?xml version="1.0" encoding="US-ASCII"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1">
...
<enterprise-beans>
<entity>
....
<ejb-name>CategoryBean</ejb-name>
<home>com.ibm.dw.reallybigpet.ejb.cmp.CategoryHome</home>
<remote>com.ibm.dw.reallybigpet.ejb.cmp.CategoryRemote</remote>
<ejb-class>com.ibm.dw.reallybigpet.ejb.cmp.CategoryBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.String</prim-key-class>
<reentrant>false</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>CategoryBean</abstract-schema-name>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>name</field-name></cmp-field>
<primkey-field>id</primkey-field>
<resource-ref>
<description>
This is a reference to a JDBC database.
</description>
<res-ref-name>jdbc/basic/entityDatabase</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
...
<query>
<query-method>
<method-name>findAll</method-name>
<method-params/>
</query-method>
<ejb-ql>
<![CDATA[SELECT OBJECT(a) FROM CategoryBean AS a]]>
</ejb-ql>
</query>
</entity>
</enterprise-beans>
</ejb-jar>
|
В листинге 8 вы можете увидеть спецификацию постоянных полей компонента управления данными. Также, для извлечения всех категорий из RDBMS указан метод findAll() при помощи EJB-QL.
Для корректного развертывания компонента управления данными вы должны создать план развертывания для Geronimo - файл openejb-jar.xml, приведенный в листинге 9:
Листинг 9. План развертывания Geronimo со ссылкой на развернутый коннектор TranQL
<?xml version="1.0"?>
<openejb-jar
xmlns="http://www.openejb.org/xml/ns/openejb-jar"
configId="com/ibm/dw/ReallyBigPet"
parentId="PetsDB">
<cmp-connection-factory>
<application>null</application>
<module>PetsDB</module>
<name>PetsDataSource</name>
</cmp-connection-factory>
<enterprise-beans>
<entity>
<ejb-name>CategoryBean</ejb-name>
<jndi-name>CategoryBean</jndi-name>
<table-name>petcats</table-name>
<cmp-field-mapping>
<cmp-field-name>id</cmp-field-name>
<table-column>id</table-column>
</cmp-field-mapping>
<cmp-field-mapping>
<cmp-field-name>name</cmp-field-name>
<table-column>name</table-column>
</cmp-field-mapping>
<resource-ref>
<ref-name>jdbc/basic/entityDatabase</ref-name>
<application>null</application>
<module>PetsDB</module>
<name>PetsDBPool</name>
</resource-ref>
</entity>
</enterprise-beans>
</openejb-jar>
|
Листинг 9 создает ссылку на развернутый коннектор PetsDB и указывает точное отображение поля и таблицы. Обратите внимание, что этот файл является частью EJB JAR внутри EAR-файла. Они архивируются вместе для удобства.
Теперь вы можете развернуть последнюю версию приложения reallybigpet.ear. После успешного развертывания вы можете попробовать поработать с приложением (используя URL http://localhost:8080/ReallyBigPetStore/store.cgi) и просмотреть категории, извлекаемые из RDBMS.
Чтобы увидеть результат обновления таблицы базы данных, которую использует EJB-компонент управления данными CategoryBean, зайдите в интерфейс командной строки базы данных и ведите следующий SQL-запрос:
INSERT INTO petcats VALUES( '3', 'Promotional');
|
Теперь обновите ваш браузер. Вы должны увидеть, что для выбора, представленного JSP-страницей, стала доступна новая категория Promotional.
Взгляд внутрь JMX-структуры Geronimo при помощи MC4J
Для грандиозного финала загрузите и установите консоль MC4J JMX (смотрите раздел "Ресурсы") и просмотрите атрибуты и операции, отображаемые вашим развернутым Web-приложением.
MC4J уже имеет поддержку Geronimo, подключаясь через RMI-реестр. Выберите "Create Server Connection..." из меню Management. Выберите Geronimo в "Server Connection Type" и введите значение system для Principle и manager для Credentials. На рисунке 6 изображено, как выглядит приложение "Really Big Pet Store" в консоли управления JMX:
Рисунок 6. Вид развернутого Geronimo корпоративного приложения в консоли JMX

Внутри контейнера Geronimo управляет развернутыми компонентами как компонентами GBean (смотрите часть 1). Кроме предоставления возможности управления своим жизненным циклом для Geronimo, компонент GBean может также реализовывать атрибуты и операции, которые являются управляемыми через JMX. Эти атрибуты и операции экспонируются через компоненты JMX MBean. На рисунке 7 показано, как экспонируются атрибуты приложения через это JMX-подключение:
Рисунок 7. Компоненты корпоративного приложения, экспонируемые через JMX

Заключение
Geronimo - это не первый J2EE 1.4 контейнер с открытым исходным кодом. Но его уникальное предложение "приди и попробуй", его элегантный дизайн и огромная техническая и проверенная база исходного кода Apache, которую он использует, энергичное принятие глобальным сообществом разработчиков - все это отличает Geronimo от остальных продуктов. Аналогично знаменитому проекту Web-сервера Apache, Geronimo со временем будет развиваться для выполнения своего предназначения. Проект является важным символически подтверждением окончательной зрелости принципов открытого исходного кода в разработке Java-приложений.
Загрузка кода примера | Описание | Имя | Размер | Метод загрузки |
|---|
| Source code | j-geron2code.zip | 3.2 MB |
FTP |
Ресурсы - Оригинал статьи Tame this J2EE 1.4 bronco.
- Прочтите первую часть этого цикла "Механизм J2EE 1.4, который мог бы быть", являющуюся введением и обзором концепций Geronimo.
- Загрузите Gluecode Standard Edition - сервер приложений с открытым исходным кодом, основанный на Apache Geronimo.
- Gluecode Software CTO и главный создатель Geronimo Джереми Бойнз (Jeremy Boynes) делится своим видением перспектив Geronimo, направлений Java-программирования и состояния программного обеспечения с открытым исходным кодом в своем недавнем интервью для developerWorks.
- На официальном сайте проекта Geronimo находятся последние исходные коды и бинарные файлы, активное сообщество подписчиков почтовой рассылки и wiki.
- Для выполнения JMX-подключения к вашему серверу Geronimo загрузите последнюю версию MC4J, консоли управления JMX с открытым исходным кодом, работающей с различными серверами.
- Домом Geronimo является Apache Software Foundation, где вы можете прочитать детальный текст последней лицензии Apache License.
- Текст альтернативных видов лицензий на программное обеспечение с открытым исходным кодом можно найти в Lesser General Public License и General Public License на сайте GNU Project.
- Изучите более детально Jetty (контейнер сервлетов и JSP, интегрированный в Geronimo по умолчанию) на сайте проекта.
- Исследуйте Tomcat - альтернативный контейнер сервлетов и JSP-страниц для Geronimo.
- Исследуйте возможности OpenEJB - EJB-контейнера в Geronimo.
- Узнайте детали о проекте ActiveMQ. ActiveMQ используется для реализации очереди сообщений Geronimo через JMS.
- Derby - это служба реляционной базы данных и JDBC-провайдер, по умолчанию предоставляемый для Geronimo. Посетите Web-сайт проекта Derby, на котором размещена документация, исходный код и активное сообщество пользователей, подписанных на почтовую рассылку.
- Geronimo использует Apache Scout для реализации совместимости с JAXR for Web services.
- Geronimo интегрирует Axis (универсальный стек Web-служб) для достижения совместимости с WS-I Basic Profile.
- Одной из целей Geronimo является использование одного и того же набора средств для реализации как EJB, так и "легковесной" POJO-персистентности. Решением является проект TranQL.
- Команда разработчиков Geronimo плотно работает с группой ObjectWeb для поддержки транзакций. HOWL и JOTM являются ключевыми проектами ObjectWeb, относящимися к Geronimo.
- Для удовлетворения требований управляемости Geronimo использует библиотеку MX4J для реализации JMX.
- Geronimo использует отличную библиотеку генерирования кода cglib для установки каналов перехвата (interception pipelines) для ссылок inter-GBean.
- Geronimo использует Apache Maven для управления компоновкой кода нескольких проектов и Apache Ant для компоновки индивидуальных проектов. Для контроля версий большинства проектов применяется Subversion, несколько проектов все еще находятся под управлением CVS.
- Для получения дополнительной информации о Java Management Extensions (JMX) просмотрите цикл Синга Ли "От черных ящиков к предприятиям: JMX 1.1" (developerWorks, осень 2002).
- Дополнительную информацию по шаблону Inversion of Control и по внедрению зависимостей можно найти в среде Apache Jakarta Hivemind, Pico Containe и среде приложений Spring.
- Вы можете изучить альтернативный сертифицированный сервер J2EE 1.4 с открытым исходным кодом, доступный по лицензии LGPL, на Web-сайте Java Open Application Server (JOnAS).
- На странице J2EE-спецификаций размещены детальные спецификации J2EE 1.4.
- Менеджеры, архитекторы и разработчики, использующие Java-технологии, могут открыть окно в J2EE-технологии, прочитав цикл статей J2EE Pathfinder Кайла Гэбхарта (Kyle Gabhart).
- Прочтите статью "Освобождение Java: Интервью с Джейсоном Хантером (Jason Hunter)" (developerWorks, апрель 2002) для изучения истории участия проектов с открытым исходным кодом в Java Community Process.
- Подключайтесь к сообществу developerWorks, участвуя в блогах developerWorks.
- В зоне Java-технологий сайта developerWorks вы найдете статьи по каждому аспекту Java-программирования.
- Посетите Developer Bookstore для получения исчерпывающего списка технических книг, включающего сотни наименований, относящихся к Java.
 |
Об авторе
Выскажите мнение об этой странице
|  |