Flex消息传递简介
本教程演示了如何在Flex应用程序中使用消息传递。“消息传递”可算是相当普通的一个词。但请看 Flex文档 是怎样定义这个词的:
消息传递系统允许各应用程序进行对等异步通信,方法是通过Message Service收发数据(或消息)包。消息通常由消息头和消息体组成。消息头包含标识符和路由信息。消息体包含应用程序数据。
因此,我们将构建这样一个应用程序,它允许通过DS消息服务向我们的Flex客户端应用程序异步发送数据。以下是一些主要的DS消息传递术语:
生产者:创建消息并将它发送到收信方的应用程序。
使用者:通过收信方接收消息的应用程序。
消息收信方:用于消息发布-订阅和点对点消息传递的资源。
消息通道:连接生产者、使用者与收信方的方法(使用端点)。
消息端点:负责消息数据编码和解码的接口。
消息适配器:用于定义消息传递实现。其选项包括使用DS或外部Java Message Service (JMS)提供者所提供的ActionScriptAdapter,或者。
DS提供了许多有用的特性,包括:持久的消息队列、安全性和外部消息系统集成。DS将部署为WAR文件,它可以运行在任何Java EE Servlet容器(像Apache Tomcat或BEA WebLogic)中。ActionScriptAdapter消息提供者不要求任何额外的Java EE特性。本教程将介绍实现一个非常基本的消息传递应用程序的设置和配置。
软件需求
本教程使用下列软件产品构建和运行消息传递应用程序:
BEA Workshop Studio / Flex Bundle trial
Adobe LiveCycle Data Services ES
Apache Tomcat 5.5
应用程序概述
在本教程中,您将学习如何创建简单的Flex生产者和使用者客户端。Flex用户接口运行于Flash Player客户端,而DS是服务器端网关,向Flex客户端应用程序发送消息并接收来自Flex客户端应用程序的消息。
多个Flex客户端可以发送和接收来自同一消息队列的消息。生产者用户接口将允许您向收信方发送消息,而使用者的用户接口将接收创建的消息;因此,当不含任何用户轮询代码的消息显示在屏幕上时,这就演示了DS的“数据推送”特性。
图1给出了源文件一览。具体来说,我将重点关注:
services-config.xml:定义messaging-config.xml文件用法和通道定义
messaging-config.xml:定义收信方和适配器
flex_client.mxml:创建和接收消息的客户端代码
图1. 已完成的应用程序中的消息传递文件一览(单击放大图片)
现在,我将介绍如何创建应用程序。
构建应用程序的步骤
以下内容将介绍Flex项目的创建和应用程序的配置,以及应用程序的部署和运行。
设置IDE
首先,下载和安装软件需求一节中提到的软件,并启动BEA Workshop Studio。接着,导入flex.war文件,并创建新的Flex Server项目。(此文件随DS安装;DS的下载链接请参见软件需求一节。)
现在,选择File→Import,然后选择WAR文件选项。指定随DS提供的flex.war文件的位置(在windows中默认位置是:C:\lcds\flex.war)。将Web项目名称指定为flex_server。
最后,选择Finish。
图2. 从DS导入flex.war文件
配置Flex Server和应用程序
接下来,我们将配置flex_server消息传递应用程序。设置消息传递服务器端应用程序包括消息通道、端点、收信方和适配器的配置。
编辑services-config.xml文件。编辑<services>部分中的server-includes代码,只在配置中包括messaging-config.xml。
<services>
<service-include file-path="messaging-config.xml" />
</services>
将以下内容添加到<channel>部分。此处的配置目标是用于消息收发的消息端点。此处创建的my-polling-amf通道将提供给messaging-config.xml文件中配置的收信方使用。
<channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling"
class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>1</polling-interval-seconds>
</properties>
</channel-definition>
下面是完整的services-config.xml文件,供您参考:
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
<services>
<service-include file-path="messaging-config.xml" />
</services>
<channels>
<channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling"
class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>1</polling-interval-seconds>
</properties>
</channel-definition>
</channels>
<logging>
<target class="flex.messaging.log.ConsoleTarget" level="Debug">
<properties>
<prefix>[Flex] </prefix>
<includeDate>true</includeDate>
<includeTime>true</includeTime>
<includeLevel>true</includeLevel>
<includeCategory>false</includeCategory>
</properties>
<filters>
<pattern>Endpoint.*</pattern>
<pattern>Service.*</pattern>
<pattern>Configuration</pattern>
</filters>
</target>
</logging>
<system>
<redeploy>
<enabled>false</enabled>
</redeploy>
</system>
</services-config>
编辑messaging-config.xml文件以配置simple-topic收信方,Flex Client应用程序将会引用它进行收发消息。
更新opening service标记,在messageTypes中包括AsyncMessage类。
<service id="message-service"
class="flex.messaging.services.MessageService"
messageTypes="flex.messaging.messages.AsyncMessage">
</service>
创建该simple-topic收信方作为一个非持久性主题,它将使用上述services-config.xml文件定义的my-polling-amf通道。这是将用来收发消息的消息队列。
<destination id="simple-topic">
<properties>
<network>
<session-timeout>0</session-timeout>
<throttle-inbound policy="ERROR" max-frequency="50"/>
<throttle-outbound policy="REPLACE" max-frequency="500"/>
</network>
<server>
<durable>false</durable>
</server>
</properties>
<channels>
<channel ref="my-polling-amf"/>
</channels>
</destination>
下面是完整的messaging-config.xml文件,供您参考:
<?xml version="1.0" encoding="UTF-8"?>
<service id="message-service"
class="flex.messaging.services.MessageService"
messageTypes="flex.messaging.messages.AsyncMessage">
<adapters>
<adapter-definition id="actionscript"
class="flex.messaging.services.messaging.adapters.ActionScriptAdapter"
default="true" />
</adapters>
<destination id="simple-topic">
<properties>
<network>
<session-timeout>0</session-timeout>
<throttle-inbound policy="ERROR" max-frequency="50"/>
<throttle-outbound policy="REPLACE" max-frequency="500"/>
</network>
<server>
<durable>false</durable>
</server>
</properties>
<channels>
<channel ref="my-polling-amf"/>
</channels>
</destination>
</service>
创建服务器
现在我们可以创建运行应用程序的服务器:
选择File→New→Other。
选择Server→Server。
选择Next。
选择Apache→Tomcat v5.5。
选择Next。
图3. 选择运行应用程序的服务器
指定Tomcat的安装位置,并选择要使用的JRE。选择Next。
图4. 指定Tomcat服务器位置
选择Available项目列表中的flex_server。
选择Add将项目添加到Configured项目列表。
选择Finish。
图5. 添加项目到 Configured项目列表
客户端应用程序
现在,我们将创建消息传递客户端应用程序。
创建新的Flex Client Project:选择File→New→Project并指定Flex Project,然后选择Next。
图6. 在BEA Workshop中创建Flex Project
指定Flex Data Services,选中“Compile application on the server when the page is viewed”选项,然后选择Next。
图7. 配置 Flex Client应用程序数据访问方式
更新服务器属性(Root folder、Root URL和Context root),然后选择Next。
图8. 配置Flex Server信息
指定flex_client作为Project名称,然后选择Finish。
图9. 编辑project名称并结束。
现在,我们需要创建客户端。更新项目创建的flex_client.mxml页面,如下所示:
<?xml version="1.0" encoding="iso-8859-1"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*"
pageTitle="Flex Messaging - Example Application"
creationComplete="mySubscriber.subscribe()">
<!-- Messaging Declarations -->
<mx:Producer id="myPublisher" destination="simple-topic" />
<mx:Consumer id="mySubscriber" destination="simple-topic"
message="receiveMessage(event)" />
<!-- UI Declarations -->
<mx:Panel title="Incoming Messages Panel">
<mx:TextArea id="output" backgroundColor="#eeeeee"
width="385" height="220" />
</mx:Panel>
<mx:Panel title="Input Panel (type your text and click enter)">
<mx:TextInput id="input" width="385" enter="sendMessage()" />
</mx:Panel>
<!-- Event-Handling Script -->
<mx:Script>
<![CDATA[
import mx.messaging.events.MessageEvent;
import mx.messaging.messages.AsyncMessage;
private function sendMessage():void
{
var msg:AsyncMessage = new AsyncMessage();
msg.body = input.text;
myPublisher.send(msg);
input.text = "";
}
private function receiveMessage(msgEvent:MessageEvent):void
{
var msg:AsyncMessage = AsyncMessage(msgEvent.message);
output.text += msg.body + "\n";
}
]]>
</mx:Script>
</mx:Application>
flex_client.mxml中代码的作用:
mx:Producer标记创建的类用于接收来自simple-topic队列的消息。
mx:Consumer标记创建的类用于创建simple-topic队列中的消息。
从收信方收到新的消息时,应用程序将调用receiveMesssage(事件)方法。该功能将显示在Incoming Messages Panel的输出中。
提交输入消息时,应用程序将调用sendMessage()方法。每一次被调用时,它都会为队列创建一个新的消息,方法是通过使用我们创建的mx:Producer发送该消息至服务器上的simple-topic队列。
Panel标记创建一个带有输入框和显示区的简单用户接口。
运行应用程序
现在来运行这个应用程序!启动服务器:
在J2EE Perspective中,右键单击底部面板中的Tomcat服务器,然后选择Start。
图10. 启动Tomcat服务器
图11. 运行flex_client.mxml页
使用应用程序
要使用应用程序,请在Input Panel中输入您的消息文本,然后按下回车键。这样,消息将被发送到flex_server应用程序中的simple-topic收信方。
Consumer对象mySubscriber将从simple-topic收信方接收消息,然后调用receiveMessage函数在Incoming Messages Panel中显示消息。
图12. Flex Messaging应用程序
结束语
您已经构建了一个基本的Flex消息传递应用程序,它可以使用BEA Workshop Studio收发消息。DS可以提供消息传递功能,并且非常灵活。它允许您用极少的代码或配置实现异步应用程序通信。除了能够使用DS特定的消息传递之外,DS还支持Flex应用程序参与JMS消息传递,使异构系统的集成更加方便。
自此,您可以参考 文档 学习更高级的Flex消息传递配置和使用方法。
参考资料
观看视频:它演示了如何创建应用程序
Flex.org:Flex主页
Adobe Flex开发人员中心
使用BEA Workshop Studio和Java创建基于Flex的RIA:关于Adobe Developer Connection的文章
Flex消息传递文档
BEA的Workshop Studio:Flex微指令:2008年1月31日之前有很大的折扣
原文出处:http://dev2dev.bea.com/pub/a/2008/01/flex-messaging-workshop.html