Flex开发包(八)——blazeDS

与Spring的集成

实现flex做前台,通过BlazeDS和spring,hibernate进行集成。

  参考资料:

http://www.ibm.com/developerworks/cn/web/0912_zouxiang_flex_spring/

http://www.ibm.com/developerworks/cn/java/j-lo-jeeflex/

  实现步骤:

     1. 安装BlazeDS: 将 blazeDs.war复制到对应j2ee服务器的webapps目录下。

     2. 新建flex 项目,选择j2ee,并选择使用 blazeDS进行

image

  3。 修改web.xml中,加入listener

         <listener>
	      <listener-class>flex.messaging.HttpFlexSessionlistener-class>
	listener>
4。 添加spring相关配置
   下载spring flex integration的jar放入flex-libs中
  在web.xml中添加dispatchServlet,允许 Spring 自行管理 MessageBroker
 <servlet> 
     <servlet-name>Spring MVC Dispatcher Servletservlet-name> 
     <servlet-class> 
          org.springframework.web.servlet.DispatcherServlet 
     servlet-class> 
     <init-param> 
          <param-name>contextConfigLocationparam-name> 
          <param-value>/WEB-INF/applicationContext.xmlparam-value> 
     init-param> 
     <load-on-startup>1load-on-startup> servlet> 
 修改applicationContex.xm 将servlet请求映射到 spring 管理的messagebroker中 ,定义 MessageBrokerFactoryBean 工厂 Bean 用于创建 MessageBroker

重点: 一定要注意增加的Lib包


image

BlazeDS介绍

功能特点

1.       使用amf协议连接后端java程序

httpService通过http请求访问url,可以不使用BlazeDS,但BlazeDs提供了跨域访问和日志等服务。

WebService支持SOAP兼容的WebService

RemoteObject是效率最高、最常用的组件

2.       支持点对点、发布/订阅的消息服务

可以构建实时通信或多点数据同步的系统。

Flex通过客户端消息API发送消息到BlazeDS服务器中的destination,并从这接收消息。消息在Channel中传输,在Endpoint中处理。BlazeDS可以将消息推送到链接至它的客户端,此时BlazeDS使用destination广播消息,所有订阅此destinationFlex应用都可以接受消息。

BlazeDS还可以借助JMSAdapter支持嵌入或外部的JMS服务,使用JMStopicqueue

3.       配置服务、安全服务和日志服务

使用BlazeDs提供的安全服务接口集成自定义或标准的Java EE应用服务器的验证与授权服务,用于验证Flex用户的合法性,类似于spring的安全验证;还提供基于Https的加密通信。

可以对日志的级别、目标、类别进行配置

体系结构

客户端:

服务端


客户端调用序列图

 

服务器调用序列图

基本组件

         Operation代表远程服务中的一个方法,如 mx.rpc.remoting.OperationRemoteObject调用远程服务中的方法。

         AsyncRequest实现异步请求,并保证异步请求的正确性

         ChannelSetChannel:存在于前端,用来传递消息的管道,不同的协议或格式有对应的Channel,如AMF协议使用AMFChannelPollingChannel传递轮询消息。

         MessageBrokerServlet:完成ChannelEndPoint的匹配,并将EndPoint处理结果回写入Http响应流。当收到Http请求后,MessageBrokerServletservice方法将request,response保存到FlexContext对象中,然后验证客户端身份(可选),调用EndPoint处理请求。FlexContext是线程安全的容器,可以访问Request,Response,FlexClient,FlexSession对象。

         EndPoint:接收Channel传递来的消息

         Service EndPoint委托其来处理消息,防止EndPoint和消息类型耦合,如AmfEndPoint可以接受RemotingMessage,也可接收HttpMessageAmfEndPoint会把RemotingMessage委托给RemotingServiceEndPoint根据消息的destination获得合适的service,并调用serviceserviceMessage处理消息。有三类ServiceRemotingService(RemotingObject), HTTPServiceHttpServiceWebService,MessageService(Producer)

         DestinationAdapter:都是service的子组件。Destination表示消息的目的地,Adapter适配services和客户组件。Destination使用的Adapter不同代表不同的客户组件,如JMSAdapterdestination代表一个消息主题或队列,JavaAdapterdestination代表Java对象。Adapter解耦消息类型和处理方式,如ActionScriptAdapterJMSAdapter都可处理AsyncMessage,而Service解耦消息类型和传输协议。Service通过destination找到Adapter,通过Adapterinvoke方法激活destination代表的客户组件

消息的传输过程

         Message:前后台传递数据的方式,最重要的属性是destinationbody,远程调用基于RPCMessage,消息服务使用AsyncMessage

         ProducerConsumer都有destination(消息的远程目的地)和subtopic(消息的类别)属性,使用步骤:

1.       发布消息:创建AsyncMessage的实例,调用Producer.send方法

2.       订阅消息:Consumer.subscribe订阅,订阅完后就可以接受消息,有两种方法:主动(使用实时轮询channel,监听acknowledge事件)和被动(调用ConsumerReceive接受)。不需要接收消息时,使用Consumer.unsubscribe取消订阅

3.       代码实例:

<mx:Producer id=”producer” destination=”echo” />

<mx:Consumer id=”consumer” destination=”echo” message=”onReceive(event)”>

点按钮时:

           Var msg:AsyncMessage=new AsyncMessage();

           msg.body=“测试数据”

           producer.send(msg)

接收消息:

           Init() consumer.subscribe()

           Function  onReceive(event:MessageEvent) {

              event.message.body;  //消息内容

消息服务配置 messaging-config.xml

           配置 echodestination

     <destination id=”echo”>

                    <channels>

                             <channel ref=”my-polling-amf” />

        </channels>

     </destination>

序列化机制

         提供了as对象和 Java对象、SOAP对象之间的序列化功能

使用方法:

         as类中 [RemoteClass]指定服务器端对应的类 (必须)

                   [RemoteClass(alias="cn.cstnet.cstnms.config.bean.TrafObj")]

         [Transient]标记as中不需要序列化的属性

         public属性、只读、静态属性不能序列化

As——》Java

         As中的Array索引可以为数字或字符串,如果为数字转换为List,如果为字符串转换为Map

         动态Object转换为Map        

         静态Object转换为Object

         Undifinednull——》null

Java——》As

         Collection——》ArrayCollection   

         Object[]——》Array

         Map/Dictionary——》动态Object

         Null——》null

自定义序列化

         Flex端可实现IExternalizableJava实现Externalizable

FlexClient和FlexSession

         FlexClient对应浏览器的flash player实例,BlazeDS服务器接收到flash player的链接请求后,创建FlexClient对象保存私有会话数据,在一个Player中只有一个实例存在。

         FlexSession代表Flex应用程序和BlazeDS服务的链接,是协议相关的,与Session的生命周期一致。

         如果firefox多个tab打开多个flash player,他们对应一个FlexSession,多个FlexClient。而一个flash player中如果用到多种协议,如HttpRTMP,则会创建两个FlexSession

BlazeDS配置

         Channel是前端用到的,需要使用 –services指定编译参数

         {context.root}对应工程属性 Flex Server

         对于每个<destination>可以指定adapterchannel,scope,如果Java对象是全局无状态对象,可指定其scopeapplication

日志

         可以配置级别、显示格式(前缀、时间、日期、级别和类别等)、目标(默认的目标是ConsoleTarget,改为flex.messaging.log.ServletLogTarget可使用servlet日志文件作为目标)、过滤条件(类似于log4j.logger.com.ibatis,可参考接口flex.messaging.log.LogCategories

运行期配置

假设需要根据数据库中的记录动态创建service  adapterdestination,有两种方式:

1.       使用Bootstrap Service,在启动时动态配置

创建类继承于AbstractBootstrapService,在initialize方法中创建RemotingDestination

xml中的<services>中配置该service

2.       使用远程对象,由外部条件触发

可以被动接受外部的输入,而不是主动从数据库中读取

定义远程java对象 DestinationBuilder;创建MessageDestination

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值