张 威
(湖北工业大学计算机学院, 湖北 武汉 430068)
基于Xfire实现跨平台的Flex消息订阅服务
张 威
(湖北工业大学计算机学院, 湖北 武汉 430068)
通过分析当前RIA中流行的解决方案----Flex,针对Flex的异步通信机制,结合Xfire提供一个跨平台的消息订阅服务,利用了BlazeDS作为中间件,可以实现消息的广播传输,很好地应对互联网中跨平台的各种主动消息推送。
Xfire;Flex;BlazeDS;消息订阅服务;RIA
互联网应用中,经常会有消息的主动推送服务,诸如进入一个网站,就会有各种各样的推广来提供给用户。当用户浏览某一个商品后,服务器就会根据用户的习惯行为与浏览记录来为用户定制专门的商品信息服务,主动推送各种消息。各种门户网站用户也可以订阅自己感兴趣的内容,一旦订阅,服务器就会主动推送最新的内容给用户。利用Flex来构建Web应用,同样也需要这种消息订阅服务,考虑到平台异构性与交互性,需要引入一个Web Service来作为外部访问的接口。
由于移动终端的迅猛发展,要部署一个Web应用就必须要考虑到跨平台移植性,而Flex则利用Adobe Player的广泛装机量,真正实现了跨平台。为实现各种客户端能够访问服务器端,屏蔽各种编程语言的差异,需要提供一个跨平台的服务调用机制,Web Service就是一种这样的技术,Xfire是一种非常优秀的Web Service框架,构建快速、稳定。
1.1 Xfire
Xfire是一代新的Web Service引擎。Xfire是codehaus推出的在设计上面向文档的Java SOAP框架, 通过提供简单的API和支持标准协议, 可以方便地开发面向服务的应用程序,内建在STAX基于流的XML解析引擎的基础上, Xfire拥有能够脱离Web服务器的单元测试能力,能够支持普通的Java对象、面向XML绑定的Java架构,并且是利用XML流式STAX来处理XML文档,支持通用的传输协议,如HTTP、JMS等,另外还有个强大丰富的API库。
Xfire的高性能主要得益于Xfire使用的内存非常小,且提供了几种性能优化的方法,诸如Java虚拟机内部传输。但是Xfire同样也有些局限性,Xfire在开发WSDL模块工具的时候,经常要使用到注解,这点非常不方便,支持的附件很少,并且没有简单易用的开发文档[1]。
1.2 Flex
Flex是当前应用最广最成熟的RIA 技术之一,它非常适合去构建一个良好网络交互能力和绚丽表现效果的Web应用。Flex主要是作为客户端,通过异步方式和服务器通信,将获取的数据通过组件展现给用户[2]。在Flex应用程序框架中, Flex表示服务器提供基于标准的、声明的编程方法和流程,并提供运行时服务,用于开发和部署客户端应用程序的表示层。 Flex具有非常便利的页面展示特性,诸如内置的字段校验、过滤器、视频播放器、数据格式以及特效等,而这些正是Flex与传统HTML应用程序的差异[3]。
Flex的客户端应用程序框架由MXML、ActionScript及Flex类库构成。用户直接在MXML文件中利用内置组件以及ActionScript编写Flex应用程序, Flex提供了强大的通用组件,可以直接调用,诸如表格、曲线图、柱形图、菜单、折叠面板等各种页面布局组件, 再用ActionScript 定义客户逻辑与程序控制。也包含了Web服务连接、用户界面组件与数据源之间的数据绑定、动画效果等不可视组件。MXML专注于表示层的逻辑,将表示层与业务逻辑分开,提高了应用程序的复用性。Flex可以很方便地利用各种中间件来实现与服务器端Java的通信,诸如BlazeDS、LCDS。
1.3 BlazeDS
Flex与服务器通信可以用HTTPService、WebService、URLLoader来完成,但数据流传输较小,当需要Flex与后台服务器之间传输大量的数据或者不同对象的序列化时候,则利用实现了AMF协议的BlazeDS。BlazeDS可以用来与服务器端的Java对象远程交互,也可以在客户端之间传递消息。一般可以利用BlazeDS的远程技术来调用POJO或者EJB方法,可以利用其消息系统从客户端向服务器端发送消息,并且由服务器端向客户端推送消息[4]。
BlazeDS为客户端与服务器之间通信提供了一系列的服务,实现了它们之间的实时消息传递,可以利用这一点来实现服务器端的消息主动推送服务。BlazeDS核心功能就是RPC Service和Messaging Service。远程过程调用服务为Flex前台访问服务器端的J2EE提供了一种异步请求机制,服务器端处理请求后返回数据到客户端。消息服务可以使得客户端程序通过往返的消息和服务端异步通讯。
2.1 服务流程图
整个服务设计理念是为了实现跨平台的消息服务,使得分布于各个地方的异构化平台都能最终发送与接收消息服务。Flex本来就是跨平台的,不论是Windows平台下还是Linux平台下,都可以正常访问,这也得益于Flash Player的广泛装机量,并且在移动终端领域中的市场份额,Android手机上依然可以访问Flex平台,内置于Web中,可以轻松的随时随地访问。Flex和服务器端的Java程序用BlazeDS通信即可。
为了融合异构平台的交互与通信,实现软件开发环境下的跨平台,需要使用Web Service服务,这里就用到Xfire作为Web Service的实现,图1为服务流程图。
图1 服务流程图
2.2 Flex前端实现
在J2EE项目中,整合Flex作为其表示层,只需要利用开发工具MyEclipse,构建一个Web Project,然后再右键点击“添加/更改项目类型”为Flex项目类型。项目创建好后,将BlazeDS下的WEB-INF和META-INF文件夹内容复制到创建的Flex项目下的WebRoot目录中,至此开发环境构建好。
这里采用BlazeDS作为Flex访问后台Java程序的中间件。消息主动推送利用BlazeDS的消息服务功能实现。Flex内置有Producer和Consumer两个ActionScript类,这两个类是内置的消息机制类,也是设计模式中使用到的一种“生产者和消费者模式”。
BlazeDS的核心功能是消息服务,一个消息属性有一个唯一消息ID、多个BlazeDS 消息头、多个自定义的消息头和消息正文。客户端程序调用消息生产者发送消息,可以在Flex 程序中使用生产者组件定义一个生产者。客户端程序调用消息消费者接受消息,可以在Flex 程序中使用消费者组件定义一个消费者。消费者组件订阅服务端地址,接收消息生产者发送到该地址的消息,这里主要用到的就是消息消费者组件,而消息生产者由Java后台的Servlet来实现。BlazeDS的消息服务中,消息的发送与接收都必须要经过一个通道封装,这个通道包含了服务目的地址、内容以及网络协议,并且负责消息的格式化,最后将其传送到一个端点上,所以发送消息与订阅消息必须要指定具体的通道以及端点目的地。
在WebRoot/WEB-INF/flex/messaging-config.xml中,添加消息发送的通道名以及端点。
Flex的MXML文件中,在组件的creationComplete方法中定义初始化消息消费者,这样就能保证每次组件初始化后,就会主动得到消息。
var consumer:Consumer = new Consumer();
consumer.destination ="node-data-feed";
consumer.subtopic = "node";
consumer.channelSet = new ChannelSet(["my-streaming-amf"]);
consumer.addEventListener(MessageEvent.MESSAGE, messageHandler);
consumer.subscribe();
利用Consumer组件来设置通道名以及端点地址,监听事件为MessageEvent.MESSAGE,最后利用subscribe()来订阅消息,所有发送到这个端点的消息都会主动反馈给该组件,可以在该监听方法messageHandler进行消息的获取。
2.3 服务器Servlet端实现
利用Servlet来实现业务逻辑,Web Service中的接口就能够通过HTTP方式来访问。在Servlet只需要设置解析Web Service以HTTP协议传递过来的各种参数具体值。这里用到了MessageBroker 和AsyncMessage ,两者都是Flex与Java消息通信的Java语言具体实现类。MessageBroker 负责消息发送,而AsyncMessage 包含了消息端点、消息头、消息正文、客户端ID、消息ID等信息。
MessageBroker msgBroker = MessageBroker.getMessageBroker(null);
String clientID = UUIDUtils.createUUID();
String mess = "&";
AsyncMessage msg = new AsyncMessage();
msg.setDestination("node-data-feed");
msg.setHeader("DSSubtopic", "node");
msg.setClientId(clientID);
msg.setMessageId(UUIDUtils.createUUID());
msg.setTimestamp(System.currentTimeMillis());
msg.setBody(mess);
msgBroker.routeMessageToService(msg, null);
2.4 Xfire的Web Service实现
在MyEclipse中直接创建一个Xfire的Web Service项目,会自动生成服务名,以及服务接口和服务实现类,此服务名就是外部访问该服务接口时候的名称。在项目根目录下会自动生成一个WebServices文件夹,该文件夹中的services.xml主要就是服务的各种描述,具体代码如下:
在提供给外部调用的方法中,添加访问Servlet的方法,这里利用URL类,直接通过HTTP协议来与服务器端的Servlet通信,代码如下:
String path = "http://" + Servlet主机IP+ ":" + Servlet主机Web服务器端口号+ "/"+Servlet名+"/" +其余参数
URL messUrl = new URL(path);
messUrl.openStream();
2.5 消息订阅服务总结
本系统利用Xfire来实现异构化平台之间的通信,当外部访问Xfire提供的各种接口后,最终都会直接调用服务器端的Servlet,而Servlet会将这些消息传递给指定的通道与端点所确定的位置,当用户打开页面,Flex组件初始化完毕后,就会主动在已设定好的通道与端点中拉送消息,当有消息后,这些消息会发送给那些已经订阅消息的组件,整个消息订阅就完成了。
本文通过Web Service中的Xfire技术和Flex进行分析与阐述,介绍了各个技术的特点以及应用场合,并且分析了Flex与Java后台通信的中间件BlazeDS。通过对几个技术的阐明与分析,最终实现了一个基于Xfire下的Flex消息订阅服务,可以很好地实现异构化平台之间的交互。手机终端、PC终端都可以访问Web Service接口,在服务中实现了跨平台,在Web页面中也实现了跨平台。构建高可靠性、稳定性、灵活性的Web服务,需要在基本功能实现的基础上,进一步地研究与实现。
[1] 刘 通,张亚男. 基于Xfire的分布式Java Web Services的应用[J].长春工业大学学报,2008,29(02):183-185.
[2] 吴 波.Flex异步通信方式的比较[J].广播与电视技术,2012(02):133-138.
[3] 王 非. WebServices应用研究与RIA系统中的实现[J].计算机应用与软件,2010,27(03): 168-170.
[4] 虾 皮.细细品味Flex-BlazeDS开发指南[EB/OL]. (2012-05-26)[2014-09-01]http://www.cnblogs.com/xia520pi/archive/2012/05/26/2519343.html.
[责任编校: 张岩芳]
The Cross-platform Flex News Subscription Service Based on Xfire
ZHANG Wei
(SchoolofComputerScience,HubeiUniv.ofTech. ,430068Wuhan,China)
The paper analysed the asynchronous mechanism of Flex-the widely used solution in RIA, this paper provided a cross-platform news subscription service which is integrated with Xfire and utilizes BlazeDS. The service can implement the news broadcast transmission, and push the cross-platform news on the Internet very well. Keywords: Xfire;Flex;BlazeDS; news subscription service; RIA
2014-10-21
张 威(1988-), 男, 河南息县人,湖北工业大学硕士研究生,研究方向为计算机网络
1003-4684(2015)01-0039-04
TP3
A