IBM Lotus Expeditor - это предложение IBM, облегчающее расширение Java EE-приложений на клиенты с известной моделью программирования. IBM Lotus Expeditor Toolkit обеспечивает быструю разработку и развёртывание приложений, устраняя необходимость переписывать проекты Java EE для запуска в среде исполнения Lotus Expeditor. В нашей статье мы продемонстрируем, как этого достигнуть.
Чтобы извлечь из статьи максимальную пользу, вы должны быть знакомы с Java™ и разработкой Java EE, а также с разработкой плагинов с помощью технологии Eclipse 3.x. Помните, что проекты Java EE не являются проектами плагинов, а проекты Lotus Expeditor таковыми являются. В проектах Lotus Expeditor имеется manifest-файл пакета и файл plugin.xml, характерные для проектов плагинов, поэтому вы должны понимать, как работать с этими файлами.
Из этой статьи вы узнаете:
- Как выполнить миграцию существующих проектов Java EE Enterprise JavaBean (EJB) на Lotus Expeditor
- Какие функции Java EE не поддерживаются в Lotus Expeditor
- Как развернуть проект после миграции в среде исполнения Lotus Expeditor
Прежде чем начать выполнять шаги, описываемые в этой статье, убедитесь, что у вас установлены IBM Rational Application Developer V7.0, Lotus Expeditor Toolkit V6.1 и Lotus Expeditor Client V6.1. Бесплатную ознакомительную версию ПО Rational Application Developer for WebSphere можно загрузить с сайта developerWorks.
Миграция существующего проекта Java EE EJB на Lotus Expeditor
Разработка приложений Java EE выходит за рамки нашей статьи. Вместо этого, чтобы упростить процесс, мы импортируем существующий пример проекта Java EE, а затем выполним его миграцию. Прежде чем начать, убедитесь, что вы загрузили пример кода (sampleJ2EEProject.zip) из раздела Загрузка этой статьи.
Начнём с импорта примера проекта Java EE в Rational Application Developer:
- В Rational Application Developer перейдите в перспективу Java EE, выбрав Window - Open Perspective - Other - J2EE.
- Импортируйте файл sampleJ2EEProject.zip, выбрав File - Import.
- В мастере Import выберите "Existing projects into workspace", а затем нажмите Next.
- В мастере Import Projects, показанном на рисунке 1, выберите опцию Select archive file, укажите на загруженный вами ZIP-файл sampleJ2EEProject.zip, а затем нажмите Finish.
Рисунок 1. Мастер Import Projects
- Откройте мастер New Project, выбрав File - New - Project.
- В диалоговом окне New Project разверните пункт Client Services. Вы увидите несколько типов мастеров, используемых для создания различны типов проектов клиентских сервисов. Выберите опцию "Convert Project to Client Services Project", а затем нажмите Next, как показано на рисунке 2.
Рисунок 2. Мастер New Project
- Мастер Convert Existing Project, показанный на рисунке 3, содержит список проектов, не являющихся проектами клиентских сервисов, которые можно конвертировать. Имейте в виду, что после миграции проекта Java EE на Client Services эту операцию отменить нельзя; способа восстановить проект Java EE в том состоянии, в каком он был до конвертирования, не существует. В Lotus Expeditor Toolkit имеется опция "Copy project before conversion", создающая новую копию существующего проекта Java EE и конвертирующая её в проект клиентских сервисов. Выберите эту опцию и при необходимости укажите имя новой копии проекта. Для конвертирования можно одновременно выбирать только один проект. Нажмите Next.
Рисунок 3. Мастер Convert Existing Project
- На панели Target Definition, показанной на рисунке 4, вы увидите список дополнительных сервисов, например, Java Message Service (JMS) API, Managed Settings и MQ Everyplace. Не меняйте предлагаемые по умолчанию настройки, так как эти дополнительные сервисы мы использовать не будем. Нажмите Finish для конвертирования выбранного проекта EJB в проект клиентских сервисов.
Рисунок 4. Convert Existing Project: панель Target Definition
-
После нажатия кнопки Finish мастер запустит предмиграционный тест и отобразит ошибки и предупреждения, касающиеся элементов существующего EJB, для которых могут потребоваться изменения при запуске в среде исполнения Lotus Expeditor. При обнаружении ошибок или предупреждений появится диалоговое окно, в котором спрашивается, продолжать ли конвертирование или отменить его. Нажмите OK для продолжения конвертирования, как показано на рисунке 5.
Рисунок 5. Convert Existing Project: предупреждение
Проекты EJB, конвертируемые в проекты клиентских сервисов, называются проектами клиентских сервисов контейнера вложенных транзакций (embedded transaction container - ETC).
Для конвертирования примера web-проекта, BankWeb, в проект клиентских сервисов выполните те же шаги. Web-проекты, конвертируемые в проекты клиентских сервисов, известны под названием web-проектов клиентских сервисов.
Разработка логики контейнера вложенных транзакций
В отличие от типичных серверов/контейнеров Java EE EJB-контейнер вложенных транзакций в большей степени нацелен на устройства, обладающие ограниченными ресурсами. Хотя программные модели обоих типов контейнеров весьма схожи, некоторых их аспекты характерны только для контейнера вложенных транзакций. В следующих разделах описываются операции, связанные с этими уникальными особенностями вложенных транзакций.
Реализация поисковых (finder) методов
В ETC используется другой подход к реализации специальной поисковой функции. Для каждого объявленного в домашнем интерфейсе поискового метода (отличного от findByPrimaryKey) требуется предоставить бизнес-логику, необходимую для создания соответствующей коллекции. Реализация поисковых методов EJB в bean-классе не поддерживается данной средой исполнения. Инструменту необходимо, чтобы эта логика была упакована в абстрактный поисковый helper-класс, расширяющий BaseJDBCFinder; а инструмент расширяет этот абстрактный класс в конкретный поисковый helper-класс реализации JDBC.
Client Services предоставляет три реализации ObjectFactory для использования описательного JNDI. ObjectFactory предоставляет точку расширения Eclipse (которая описывается файлом определения схемы), позволяющую описывать Java-объекты, привязанные к JNDI, после выполнения клиентом JNDI-поиска.
Для создания экземпляра объекта источника данных IBM DB2 Everyplace нужно добавить точку расширения, как показано в листинге 1.
Листинг 1. Добавление точки расширения
<extension
point="com.ibm.pvc.jndi.provider.java.genericobject">
<object
jndi-name="BANKING"
class="com.ibm.db2e.jdbc.DB2eDataSource">
<method name="setUrl">
<method-parameter type="String"
value="jdbc:db2e:${_workspace}\\ejb\\BANKDb\">
</method-parameter>
</method>
</object>
</extension>
|
Контейнер вложенных транзакций требует использовать определённый источник данных, TxnDataSource, при подключении к базе данных для достижения контейнерно-управляемого сохранения состояния (Container Managed Persistence - CMP). Этот источник данных создаётся с помощью TxnDataSourceFactory. TxnDataSource используется только для CMP-доступа к базе данных. Во всех других случаях доступ к базе данных должен осуществляться с помощью источника данных.
Такое свёртывание (wrapping) зависящего от поставщика DataSource можно выполнять до JNDI-привязки или после поиска. Наиболее оптимальным является свёртывание до JNDI-привязки, поскольку эта операция выполняется лишь один раз по сравнению со свёртыванием после каждого поиска. Для выполнения такого свёртывания можно добавить точку расширения, как показано в листинге 2.
Листинг 2. Добавления точки расширения для свёртывания
<extension
point="com.ibm.pvc.jndi.provider.java.binding">
<binding jndi-name="BANKING"
objectFactory-id="com.ibm.pvc.txncontainer.TxnDataSourceObjectFactory">
</binding>
</extension>
|
Создание специального активатора пакетов
Инструментарий ETC создаёт проекты, которые ссылаются на активатор пакетов (bundle activator) по умолчанию, com.ibm.pvc.txncontainer.GenericActivator. Этот активатор регистрирует домашний интерфейс EJB. Для создания специального активатора пакетов для существующего проекта необходимо создать класс, расширяющий класс com.ibm.pvc.txncontainer.GenericActivator и вызывающий методы GenericActivator start() и stop() внутри собственных методов start() и stop(). Обновите имя класса в manifest-файле пакета, как показано на рисунке 6. На этом шаге обновляется manifest-файл EJB META-INF/MANIFEST.MF: в поле Bundle-Activator указывается класс специального активатора пакетов.
Рисунок 6. BankEJB: MANIFEST.MF
Создание локальной базы данных и таблиц
Перед вызовом компонентов entity beans обязательно создайте для них локальную базу данных и таблицы. При создании базы данных и таблиц лучше всего добавлять логику в метод start() активатора пакетов проекта ETC.
Между entity-компонентами поддерживаются контейнерно-управляемые связи (container-managed relationships - CMRs) в соответствии со спецификацией EJB. Для реализации функций контейнерно управляемой связи в ETC используется подход с использованием таблицы соединений. Рассмотрим два EJB-компонента, A и B, для которых определена связь R, так что CMR-поле определяется для A, B или обоих. При развёртывании этих EJB-компонентов с таблицами базы данных, обеспечивающими персистентное CMP-состояние для A и B, не ассоциируется никакое персистентное CMR-состояние. Вместо этого, персистентное CMR-состояние поддерживается в отдельной таблице соединений реляционной базы данных, причём используется принцип "на связь" (per-relationship).
Данные о связях хранятся в отдельной таблице базы данных (таблице соединений). Каждая строка таблицы соединений представляет связь между двумя entity-компонентами. В таблице соединений содержится набор столбцов для первичного ключа первого entity-компонента, набор столбцов для первичного ключа второго entity-компонента, а также дополнительный дискриминантный столбец. Имена столбцов таблицы соединений должны выбираться в соответствии со схемой, определяемой специальной информацией о развёртывании для соответствующих столбцов первичного ключа CMP. Единственным отклонением от этой схемы является то, что в начало имени каждого столбца добавляется либо r1_, либо r2_, в зависимости от того, ассоциируется ли столбец с ролью 1 или ролью 2 EJB. Убедитесь, что эти таблицы соединений существуют для каждой связи EJB, прежде чем вызывать компоненты entity beans.
Нижеописанные шаги относятся к web-проектам клиентских сервисов; их необходимо выполнить для конвертирования проекта Java EE в web-проект клиентских сервисов:
- Предоставление необходимых библиотек. В среде исполнения jclDesktop отсутствует пакет java.rmi, поэтому ссылка на PortableRemoteObject.narrow() помечается как ошибка. ETC никогда не разрешает доступ к EJB-компонентам на других серверах, поэтому мы можем заменить PortableRemoteObject.narrow() простым JNDI-поиском.
- Предоставление меню с ярлыками для запуска Web-приложения в среде исполнения Lotus Expeditor. Добавьте точку расширения в файл plugin.xml проекта BankWeb, как показано в листинге 3, чтобы проект можно было запускать в среде исполнения Lotus Expeditor с помощью ярлыка из меню.
Листинг 3. Добавление точки расширения в файл plugin.xml проекта
<extension id="kw4qri0g1j4t" point="com.ibm.eswe.workbench.WctWebApplication">
<WEBApplication DisplayName="XYZ Banking">
<WebApplicationUrl local="true" secured="false" url="/BankWeb/Banking.html">
</WebApplicationUrl>
<BrowserConfiguration showAddressbar="true" showToolbar="false">
</BrowserConfiguration>
</WEBApplication>
</extension>
|
Функции Java EE, не поддерживаемые в Lotus Expeditor
В Lotus Expeditor не поддерживаются следующие функции Java EE:
- Сессионные компоненты с сохранением состояния.
- Семантика передачи через экземпляр (pass-by-copy) для изменяемых сериализуемых объектов при запуске в одноадресном пространстве.
- В EJB 1.1 контейнер вложенных транзакций не сохраняет ссылки на удалённые или домашние интерфейсы EJB. Имейте в виду, что эта возможность не требуется от EJB 2.1.
- Управляемые сообщениями компоненты.
- Поддержка безопасности Java.
- EJB Query Language.
- Методы Home.
- Методы Select.
- Управляемые компонентом транзакции.
- Тип возврата функции Enumeration для определителей. Тип возврата функции Collection поддерживается.
- Определение уровня изоляции транзакции.
- Поддержка коллекций и итераторов за пределами транзакций, в которых они были созданы.
- Метод setTransactionTimeOut().
- BigDecimal, не поддерживаемый в J2ME (JSR169).
Развёртывание сконвертированного проекта на платформе исполнения клиентских сервисов Lotus Expeditor
Приложения клиентских сервисов запускаются в среде исполнения Lotus Expeditor. Lotus Expeditor Toolkit автоматически обрабатывает информацию, относящуюся к конкретным пакетам; следовательно, рекомендуется разрабатывать проекты, нацеленные на среду исполнения Lotus Expeditor или зависящие от других OSGi-сервисов, с помощью мастера создания проекта клиентских сервисов. Среда исполнения Lotus Expeditor не поддерживает развёртывание корпоративных приложений через файл EAR. Вместо этого, приложения развёртываются прямо в среде исполнения.
Теперь, когда мы завершили миграцию проекта Java EE на Client Services, развернём этот проект в среде исполнения Lotus Expeditor. Для развёртывания проекта выполните следующие шаги:
- В Project Explorer правой кнопкой мыши нажмите на проект BankWeb, а затем выберите Run - Run on Server.
- В диалоговом окне Run On Server, показанном на рисунке 8, сделайте следующее:
- Выберите опцию "Manually define a new server".
- Выберите Client Services v6.1.
- Нажмите Next.
- Оставьте значения по умолчанию для Client Services Server и нажмите Next.
- Добавьте проект BankEJB в список сконфигурированных проектов.
- Нажмите Finish для запуска среды исполнения клиентских сервисов Lotus Expeditor.
Рисунок 8. Определение сервера
Сконвертированный проект (migratedSampleJ2EEProject.zip) можно найти в разделе Загрузка этой статьи. Его можно использовать в справочных целях.
Теперь, когда мы развернули проект Java EE, убедимся, что всё прошло успешно. После запуска среды исполнения Lotus Expeditor нажмите на значок Open слева и выберите XYZ Banking. Появится страница XYZ Banking, показанная на рисунке 9.
Рисунок 9. Страница XYZ Banking
Нажмите Submit, и вы увидите страницу результатов, показанную на рисунке 10.
Рисунок 10. Страница результатов XYZ Banking
При помощи Lotus Expeditor можно перемещать ключевые компоненты ваших приложений с сервера на клиенты для настольных систем, ноутбуков, планшетных и карманных компьютеров, используя стандартные API и сервисы. Перенос компонентов приложений для запуска на клиенте может иметь впечатляющие результаты для бизнеса. Снижается время отклика, поскольку приложения выполняют бизнес-операции локально, на клиенте. В результате повышается удобство работы пользователей, снижается сетевой трафик между клиентом и сервером и уменьшается нагрузка на сервер. К тому же, мобильные пользователи смогут продолжать эффективно использовать свои клиентские приложения даже в тех случаях, когда они находятся вне зоны доступа к сети.
В статье показано, как выполнить миграцию проекта Java EE на проект клиентских сервисов. Мы сконвертировали проект EJB и динамический Web-проект в проект клиентских сервисов. Переводите ваши Java EE-приложения на Lotus Expeditor и получайте к ним доступ всегда, везде и вне зависимости от наличия подключения к сети.
| Имя | Размер | Метод загрузки |
|---|---|---|
| migratedSampleJ2EEProject.zip | 51KB | HTTP |
| sampleJ2EEProject.zip | 33KB | HTTP |
Научиться
- Оригинал статьи: Migrating J2EE projects to IBM Lotus Expeditor V6.1 (EN).
- Прочтите статью developerWorks Lotus: Сквозная интеграция с помощью повсеместной передачи сообщений и микроброкера IBM Lotus Expeditor (EN).
- Прочтите статью на сайте developerWorks Lotus: Создание автономного приложения в IBM Lotus Expeditor (EN).
- Прочтите статью на сайте developerWorks Lotus: Разработка и развёртывание насыщенных клиентских приложений на настольных системах и мобильных устройствах с помощью IBM Lotus Expeditor V6.1 .
- Прочтите статью на сайте developerWorks Lotus: Миграция приложений Eclipse RCP в IBM Lotus Expeditor.
- Прочтите статью на сайте developerWorks Lotus: Создание взаимодействующих компонентов для IBM Lotus Expeditor Property Broker.
- Прочтите статью на сайте developerWorks Lotus: Разработка OSGi-службы как Web-службы в IBM Lotus Expeditor.
- Прочтите статью на сайте developerWorks Lotus: Создание и развертывание простого Web Services Resource в IBM Lotus Expeditor.
- Прочтите публикацию из серии IBM Redbooks: Создание составных приложений в Lotus Expeditor V6.1 (EN).
- Посетите страницу developerWorks, посвященную Lotus Expeditor (EN).
- Обратитесь к Обучающему помощнику по IBM Lotus Expeditor (EN).
- Обратитесь к Информационному центру по IBM Lotus Expeditor (EN).
Обсудить
Сушант Наик (Sushant Naik) работает системным программистом в группе Embedded Transaction Container Tools подразделения IBM Pervasive Computing в лаборатории IBM India Software Lab. Ему можно написать по адресу sushnaik@in.ibm.com.