|
Untitled Document

Судхансу Пати
Построение полнофункциональных интернет-приложений уровня предприятия
с использованием Flex и WebLogic Server
(Building Enterprise RIA Using Flex and WebLogic Server
by Sudhansu Pati )
Источник: сайт публикаций о технологиях корпорации Oracle, 21.04.2008, http://www.oracle.com/technology/pub/articles/dev2arch/2008/04/enterprise-ria-flex-weblogic-server.html
Резюме
В этой статье содержатся рекомендации для построения полнофункциональных интернет-приложений ( Rich Internet Applications – RIA ) корпоративного уровня с использованием для этой цели Flex и WebLogic Server компании BEA с упором на организацию данных и обмен сообщениями. В учебных примерах ( Tutorial ) объясняются шаги, необходимые для конфигурирования демонстрационного проекта Flex Data Services в среде BEA Workshop Studio . Если вы хотите испытать построенное автором полноценное приложение Flex , которое выполняется в среде WebLogic Server, кликните www.golf4geeks.com.
Введение
По мере развития полнофункциональных интернет-приложений ( RIA ) разработчики и архитекторы сталкиваются с проблемой объединения RIA с «доморощенными» серверными приложениями. Если приложение на стороне сервера построено с использованием стандартных технологий типа J2EE и . NET , часть связанного с интеграцией бремени минимизируется за счет использования поставляемых продавцом компонентов.
Хотя имеется несколько платформ RIA , которые можно рассматривать при построении приложений RIA следующего поколения, одним из главных фигурантов является платформа Flash runtime . Технология Adobe Flex предлагает получившую название Flex Builder среду разработки WYSIWYG для построения приложений RIA , которые могут выполняться во Flash-плеере.
Данные, обмен сообщениями, защищенность и производительность – вот некоторые из критичных соображений при проектировании корпоративных приложений. И полнофункциональные интернет-приложения не являются исключением из этого правила. Чтобы удовлетворить вышеупомянутым конструктивным требованиям, можно использовать WebLogic Server в качестве среды выполнения. Этот сервер не только предлагает одну из лучших платформ J2EE в терминах надежности, доступности, масштабируемости и производительности ( reliability , availability , scalability , and performance – RASP ), но также предлагает такие ценные корпоративные функциональные возможности, как: JMS и управление данными.
Flex обеспечивает механизмы для оснащения Web- и http- сервисов. Однако для построения приложений масштаба предприятия следует подумать об использовании платформы LiveCycle Data Services Platform компании Adobe . Кратко говоря, LiveCycle Data Services Platform обеспечивает данные, обмен сообщениями и возможности удалённого взаимодействия для взаимодействия с компонентами J2EE быстрым, безопасным и надежным способом.
Управление данными с использованием Flex Data Services , Hibernate и WebLogic Server
Система Flex Data Services поставляется с адаптером, который называется JavaAdapter и помогает надежно управлять данными между клиентскими приложениями и базой данных через сервер WebLogic Server . У JavaAdapter имеются два ассемблера – HibernateAssembler и SQLAssembler . В предлагаемом примере показан образец HibernateAssembler , который может обращаться к Hibernate Entities и выполнять Hibernate Queries . Если будет принято решение об использовании другого средства ORM , можно написать адаптер, соответствующий вашим требованиям.
Получить доступ к данным в Flex -приложении и манипулировать ими просто. Используя тэг MXML или код ActionScript , можно создать компонент DataService и выполнить операцию fill () к Hibernate Query (или запросу SQL , если используется SQLAssembler ). Операция fill заполняет ArrayCollection. Если вы манипулируете объектами в ArrayCollection, Flex Data Services автоматически синхронизирует данные с основной базой данных. Когда множество клиентов пробуют обновить одни и те же данные, конфликты данных разрешает функциональный механизм разрешения противоречий Flex Data Services .
В Tutorial 1 ( http://www.oracle.com/technology/pub/articles/dev2arch/2008/04/enterprise-ria-flex-weblogic-server.html#tutorial1 ) показан пример управления данными с использованием Flex Data Services , Hibernate и WebLogic JMS .

Управление данными с использованием Flex Data Services , Hibernate и WebLogic Server
Обмен сообщениями с использованием Flex Data Services и WebLogic JMS Server
В проекте Flex Data Services имеется адаптер по имени JMSAdaper , который делает возможным взаимодействие между клиентскими приложениями и сервером JMS . Кроме того, Flex предлагает другой адаптер (по имени ActionScriptAdapter ) , который выступает брокером сообщений между компонентами производителя и потребителя Flex , используя стандартную систему обмена сообщениями Adobe . Заметьте, что эта, используемая по умолчанию система обмена сообщениями работает не на основе JMS . В приложениях Flex вы можете определить как компоненты производителя, так и компоненты потребителя, которые будут обмениваться сообщениями, используя либо стандартную систему обмена сообщениями, либо внешнюю систему JMS .
В Tutorial 2 ( http://www.oracle.com/technology/pub/articles/dev2arch/2008/04/enterprise-ria-flex-weblogic-server.html#tutorial2 ) показан пример обмена сообщениями с использованием WebLogic JMS .

Обмен сообщениями во Flex с использованием WebLogic JMS
Демонстрационное приложение в вашей среде
В примере в качестве базы данных используется Oracle . Загрузить Oracle 10g Express Edition можно по ссылке : http://www.oracle.com/technology/software/products/database/index.html
Не требуется инсталлировать Adobe LiveCycle Data Services , потому что в примере уже содержатся ресурсы из LiveCycle DS . Следующая ниже ссылка предлагается просто как справочная информация:
- загрузка Adobe LiveCycle Data Services Express Edition http://www.adobe.com/cfusion/tdrc/index.cfm?product=livecycle%5Fdataservices
Создание домена WebLogic Domain
Действия |
Значения |
Запуск WebLogic Configuration Wizard ( окно 1) |
Создание нового домена WebLogic |
WebLogic Configuration Wizard (окно 2) |
Сервер WebLogic Server |
WebLogic Configuration Wizard (окно 3) |
Имя пользователя: weblogic
Пароль: weblogic |
WebLogic Configuration Wizard (окно 4) |
Инструментарий разработки: Sun SDK |
WebLogic Configuration Wizard (окно 5) |
Нет |
WebLogic Configuration Wizard (окно 6) |
Имя домена : flexdomain
Местоположение домена : <WebLogic_Install_Dir>/user_projects/domains |
Создание конфигурации JMS в сервере WebLogic Server
Действия |
Значения |
Запуск WebLogic Administration Console Кликнуть
Services → Messaging → JMS Servers |
|
Кликнуть Lock and Edit
Кликнуть New |
Имя: FlexDemoJMSServer
Постоянное хранилище: нет |
Кликнуть Next |
Адресат : AdminServer |
Кликнуть Finish |
|
Кликнуть JMS Modules на левой панели.
Кликнуть New на правой панели. |
Имя: FlexDemoJMSModule |
Кликнуть Next |
Выберите Admin Server |
Кликнуть Next |
Сделайте отметку в экранной кнопке
Would you like to add resources to this JMS system module |
Кликнуть Finish |
|
Кликнуть New |
Выберите Topic |
Кликнуть Next |
Имя: FlexDemoTopic
Имя JNDI : FlexDemoTopic
Шаблон: Нет |
Кликнуть Next , а затем Кликнуть
Create a New Subdeployment |
Имя подразвертывания: FlexDemoSubdep |
Кликнуть OK |
Адресаты: FlexDemoJMSServer |
Кликнуть Finish.
Кликнуть Activate Changes |
|
Создание базы данных и источника данных WebLogic
Действия |
Значения |
Открыть браузер администратора Oracle http:// localhost :8080/ apex
войти в систему как system /<пароль> |
|
Создать нового пользователя |
Имя пользователя: flexdemo
Пароль: password |
Выйти из системы и снова войтие в нее как flexdemo / password |
|
Кликнуть SQL → SQL Commands → Enter Command |
CREATE TABLE CUSTOMER(
CUSTOMERID VARCHAR2(16) NOT NULL PRIMARY KEY,
EMAIL VARCHAR2(50) NOT NULL,
FIRSTNAME VARCHAR2(20) NULL,
LASTNAME VARCHAR2(20) NULL
); |
Кликнуть Run |
|
Откройте WebLogic Admin Console http://localshot:7001/console |
войти как weblogic/weblogic |
Кликнуть Services → JDBC → Data Sources в левой панели . Кликнуть Lock and Edit |
|
Кликнуть New из правой панели |
Имя : CustomerDS
Имя JNDI: CustomerDS
Тип базы данных : Oracle
Драйвер базы данных: Драйвер Oracle (тонкий) версии: 9.0.1,9.2.0,10 |
Кликнуть Next |
Поддерживает глобальные транзакции
Однофазный контроль завершения транзакций |
Кликнуть Next |
Имя базы данных: XE
Имя хоста: localhost
Порт: 1521
Имя пользователя базы данных: flexdemo
Пароль : password |
Кликнуть Next
Кликнуть Test Configuration |
|
Кликнуть Next |
Выберите AdminServer |
Кликнуть Finish , а затем Кликнуть Activate Changes |
|
Настройте проекты Workshop Studio
Действия |
Значения |
Запустить Workshop Studio 10.2. В каталоге < WorkshopStudio _ Install _ Dir > \ user _ projects \ workspaces \ FlexDemo
создать рабочее пространство FlexDemo |
|
Кликнуть File → New → Project |
Выбор Flex Project |
Кликнуть Next |
Выбор FlexDataServices
Выбор Compile application locally in Flex Builder |
Кликнуть Next |
Снять отметку с кнопки Use default local Flex Data Services location
Найдите каталог <WLS_Install_Dir>\user_projects\domains\ flexdomain\autodeploy\flexdemo |
Кликнуть OK |
Корневой URL: http://localhost:7001/flexdemo
Корень контекста : /flexdemo |
Кликнуть Next |
Снять отметку с кнопки Use default location
Найдите каталог <WLS_Install_Dir> \user_projects\domains\ flexdomain \autodeploy\flexdemo\flexclient |
Кликнуть Next |
Удалить bin из output Folder |
Кликнуть правой кнопкой мыши по flexclient → Properties → Flex Build Path |
Кликнуть Remove to remove the entry that points to fds.swc , а затем Кликнуть Add SWC Folder. Найдите каталог <WLS_Install_Dir> \user_projects\domains\flexdomain\ autodeploy\flexdemo\ <WEB-INF>\flex\libs |
Кликнуть Finish |
|
Кликнуть File → New → Project |
Выбрать Java Project |
Кликнуть Next |
Выбрать Create project from existing source.
Найти каталог <WLS_Install_Dir> \user_projects\domains\flexdomain\ autodeploy\flexdemo/WEB-INF |
Кликнуть OK → Next → Finish |
|
Кликнуть правой кнопкой мыши по flexproject → Project → Properties → Java Build Path → Libraries |
Удостовериться, что пути для wlclient . jar и wljmsclient . jar правильны. |
Кликнуть Windows → Show View → Others → Servers . Кликнуть правой кнопкой мыши под панелью Servers New → Server |
Выбрать BEA WebLogic Server 10.0. |
Кликнуть Next |
Домашняя страница WebLogic: <WLS_Install_Dir> \wlserver100 |
Кликнуть Next |
Домашняя страница домена : <WLS_Install_Dir> \user_projects\domains\flexdomain |
Кликнуть Finish |
|
Кликнуть правой кнопкой мыши по flexclient . mxml → Run As → Flex Application , чтобы запустить показ демонстрационных версий. |
|
Tutorial 1: Управление данными с использованием Flex Data Services , Hibernate и сервера WebLogic Server
Как только вы создали источник данных WebLogic (обратитесь к Set up the database and WebLogic Data Source ( http://www.oracle.com/technology/pub/articles/dev2arch/2008/04/enterprise-ria-flex-weblogic-server.html#setup_the_database ) ), следующим шагом должно стать конфигурирование конфигурационных файлов Data Services .
Шаг 1 : Первый подлежащий проверке конфигурационный файл – это файл service-config.xml, расположенный под каталогом flexproject / flex .
Удостоверьтесь, что у вас имеется следующий элемент.
<service-include file-path="data-management-config.xml" />
Шаг 2 : В файле data-management-config.xml обеспечьте имя JNDI источника данных WebLogic и другие параметры . Ниже приводится текст следующего доступного файла data - management - config . xml .
<?xml version="1.0" encoding="UTF-8"?>
<service id="data-service" class="flex.data.DataService">
<adapters>
<adapter-definition id="actionscript"
class="flex.data.adapters.ASObjectAdapter" default="true"/>
<adapter-definition id="java-adapter"
class="flex.data.adapters.JavaAdapter"/>
</adapters>
<default-channels>
<channel ref="my-amf" />
<channel ref="my-polling-amf" />
</default-channels>
<destination id="customer-dataservice">
<adapter ref="java-adapter"/>
<properties>
<source>flex.data.assemblers.HibernateAssembler</source>
<scope>application</scope>
<metadata>
<identity property="CUSTOMERID"/>
</metadata>
<network>
<session-timeout>20</session-timeout>
<paging enabled="false" pageSize="10"/>
<throttle-inbound policy="ERROR" max-frequency="500"/>
<throttle-outbound policy="REPLACE" max-frequency="500"/>
</network>
<server>
<update-conflict-mode>PROPERTY</update-conflict-mode>
<delete-conflict-mode>OBJECT</delete-conflict-mode>
<hibernate-entity>
com.j2ee.demo.beans.Customer
</hibernate-entity>
<fill-configuration>
<allow-hql-queries>false</allow-hql-queries>
<use-query-cache>false</use-query-cache>
</fill-configuration>
</server>
</properties>
</destination>
<properties>
<use-cluster-broadcast>true</use-cluster-broadcast>
</properties>
</service>
Шаг 3 : Вы должны создать Hibernate Entities , конфигурационные файлы и Hibernate Queries (если они используются во Flex ). В Workshop Studio предлагается визард ( wizard) для автоматического создания Hibernate Entities и конфигурационных файлов. В Workshop Studio перейдите к проекту Flex . Перейдите к файлам hibernate.cfg.xml , Customer . java и Customer.htm.xml . Обратите внимание на то, что в файле Customer.htm.xml определен з апрос Hibernate Query , который называется getAllCustomers . Этот запрос используется в файле DataView . mxml .
Шаг 4 : В приложении Flex можно создать компонент DataService , отсылающий к имени пункта назначения в файле data-management-config.xml . Операция fill () получает данные из базы данных и заполняет ArrayCollection. Если вы обновляете объекты в ArrayCollection, то «за кулисами» производится автоматическая синхронизация базы данных. Следующий фрагмент кода является примером заполнения ArrayCollection для customers данными из таблицы базы данных CUSTOMER .
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
width="800" height="500" creationComplete="initiateDataView();">
<mx:Script>
<![CDATA[
import com.flex.demo.beans.Customer;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.core.Application;
private function initiateDataView():void
{
ds.fill(customers,"getAllCustomers",{});
}
private function customerResultHandler(event:ResultEvent):void
{
}
private function customerFaultHandler(event:FaultEvent):void
{
Alert.show(event.fault.toString());
}
]]>
</mx:Script>
<mx:ArrayCollection id="customers" />
<mx:DataService id="ds" destination="customer-dataservice"
result="customerResultHandler(event)"
fault="customerFaultHandler(event)"
autoCommit="false"/>
</ mx:TitleWindow>
Шаг 5: Кликните правой кнопкой мыши по flexclient.mxml → Run As → Flex Application . Вы должны увидеть в браузере показанный ниже ГИП. Введите некоторые значения в расположенную слева форму, а затем кликните Submit . Вы должны увидеть запись в расположенной справа сетке данных ( data grid ), а также в таблице базы данных.

Когда вы нажимаете на кнопку передачи на выполнение ( submit ), во Flex создается новый объект Customer и добавляется к ArrayCollection – customers . Система Flex Data Services автоматически синхронизирует новую запись из ArrayCollection с базой данных.
Tutorial 2: Обмен сообщениями с использованием Flex Data Services и JMS WebLogic
Как только вы создали JMS Topic (отсылаем вас к Create a JMS configuration in WebLogic Server ), следующий шаг должен обновить конфигурационные файлы сервисов данных.
Шаг 1: Первый подлежащий проверке конфигурационный файл service-config.xml расположен под каталогом flexproject / flex , как показано на приведенном ниже рисунке:
Удостоверьтесь, что у вас имеется следующий элемент:
<service-include file-path="messaging-config.xml" />
Шаг 2: В файле messaging-config.xml обеспечьте имя WebLogic JNDI Topic и другие параметры . В примере предлагается следующий файл messaging-config.xml .
<?xml version="1.0" encoding="UTF-8"?>
<service id="message-service"
class="flex.messaging.services.MessageService">
<adapters>
<adapter-definition id="actionscript"
class="flex.messaging.services.messaging.adapters.ActionScriptAdapter"
default="true" />
<adapter-definition id="jms"
class="flex.messaging.services.messaging.adapters.JMSAdapter" />
</adapters>
<default-channels>
<channel ref="my-polling-amf" />
</default-channels>
<destination id="FlexDemoTopic">
<properties>
<server>
<durable>false</durable>
<durable-store-manager>
flex.messaging.durability.FileStoreManager
</durable-store-manager>
</server>
<jms>
<message-type>javax.jms.TextMessage</message-type>
<connection-factory>weblogic.jms.ConnectionFactory</connection-factory>
<destination-jndi-name>FlexDemoTopic</destination-jndi-name>
<destination-name>FlexDemoTopic</destination-name>
<delivery-mode>NON_PERSISTENT</delivery-mode>
<message-priority>DEFAULT_PRIORITY</message-priority>
<acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>
<transacted-sessions>false</transacted-sessions>
</jms>
</properties>
<channels>
<channel ref="my-polling-amf" />
</channels>
<adapter ref="jms" />
</destination>
</service>
Шаг 3: Постройте приложение Flex , использующее конфигурации Data Servises , определенные в файле messaging-config.xml . Во Flex имеется функциональная возможность генерировать и потреблять сообщения JMS . Следующие фрагменты кода показывают, как генерировать и потреблять сообщения в ActionScript и MXML .
Сгенерируйте сообщения JMS во Flex , используя ActionScript
package com.flex.demo.messaging
{
import mx.messaging.*;
import mx.messaging.messages.*;
import mx.messaging.events.*;
public class JMSLogger
{
private var producer:Producer = new Producer();
public function sendToJMS(msg:String):void {
var message:AsyncMessage = new AsyncMessage();
message.body = msg;
producer.destination="FlexDemoTopic";
producer.id="FlexJMSProducer";
producer.send(message);
}
}
}
Употребите сообщения JMS во Flex, используя MXML
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
width="600" height="400"
creationComplete="initiateService()">
<mx:Script>
<![CDATA[
import mx.messaging.messages.AsyncMessage;
import mx.messaging.events.MessageFaultEvent;
import mx.messaging.messages.IMessage;
import mx.controls.Alert;
public function initiateService():void
{
consumer.subscribe();
}
private function messageHandler(message:IMessage):void
{
Alert.show(message.body.toString();
}
private function faultHandler(event:MessageFaultEvent):void {
Alert.show(event.message.toString());
}
]]>
</mx:Script>
<mx:Consumer id="consumer" destination="FlexDemoTopic"
message="messageHandler(event.message)"
fault="faultHandler(event)"/>
</mx:TitleWindow>
Шаг 4: Есть две другие конфигурации, о которых следует помнить.
flex-config.xml: Удостоверьтесь, что корень контекста соответствует имени папки, размещенной под каталогом < WLS _ Install _ Dir > \ user _ projects \ domains \ flexdomain \ autodeploy
< context - root >/ flexdemo </ context - root >
application.xml: Этот файл расположен под каталогом <WLS_Install_Dir> \user_projects\domains\flexdomain\autodeploy\flexdemo \META-INF
Удостоверьтесь , что корень контекста соответствует имени папки , размещенной под каталогом <WLS_Install_Dir>\user_projects\domains\flexdomain\autodeploy
<context-root>flexdemo</context-root>
Шаг 5: Кликнуть правой кнопкой мыши по flexclient . mxml → Run As → Flex Application . Вы должны увидеть показанный ниже ГИП. Введите на левой панели какой-нибудь текст и подождите несколько секунд, чтобы сообщение появилось в сетке данных.

Когда вы кликаете по кнопке Submit , введенное сообщение посылается в тему на сервере WebLogic Server , которая называется FlexDemoTopic . Затем потребитель подбирает сообщение JMS и отображает его в сетке данных.
Поиск неисправностей
Ошибка: Если при выполнении демонстрационного приложения вы получаете следующую ошибку, следуйте приведенным ниже правилам ее разрешения:
VerifyError : Error #1053: Illegal override of subtopic in mx . messaging . Consumer (Ошибка #1053: Несанкционированное перекрывание подтемы в mx . messaging . Consumer
Разрешение:
Кликнуть правой кнопкой мыши по flexclient → Properties → Flex Build Path . Удалите элемент, который указывает на fds . swc . Кликнуть Add SWC Folder . Перейдите к каталогу <WLS_Install_Dir> \user_projects\domains\flexdomain\autodeploy\flexdemo \ <WEB-INF> \flex\libs
Заключение
Чтобы строить мощные полнофункциональные Интернет-приложения уровня предприятия, следует воспользоваться богатством Flex и функциональными возможностями сервера WebLogic Server уровня предприятия. Визарды и функциональные возможности WYSIWYG BEA Workshop Studio устраняют потребность в обширном обучении и повышают эффективность обучения разработчиков при построении сложных RIA .
|