加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

BlazeDS的功能原理及配置实例

发布时间:2020-12-15 01:31:48 所属栏目:百科 来源:网络整理
导读:BlazeDS Test Drive里面示例了主要的功能: HTTPService Web Services Remote-Object Messaging 其实现是基于一个叫flex.messaging.MessageBroker的Servlet。各种消息通道的配置都存在于WEB-INF/flex/services-config.xml及其包含的3个XML文件中。下面简单介

BlazeDS Test Drive里面示例了主要的功能:

  • HTTPService
  • Web Services
  • Remote-Object
  • Messaging
  • 其实现是基于一个叫flex.messaging.MessageBroker的Servlet。各种消息通道的配置都存在于WEB-INF/flex/services-config.xml及其包含的3个XML文件中。下面简单介绍这四种不同的功能。

    • HTTPService:

    向服务器发送HTTP请求,典型用途是获取服务器端的XML内容。服务器端可以采用任何技术:JSP、Servlet、ASP、PHP等,只要在请求的URL里面指定即可。这是个异步请求,服务器会返回resultfault事件,分别对应成功和失败。可以把返回的结果直接绑定到DataGrid上。利用useProxy属性和crossdomain.xml可以跨域访问,这是解决沙箱效应的方法之一。

    另一种方法就是不用HTTPService,而是写一个JS或PHP脚本,用Ajax(XMLHTTP Object) 去访问跨域URL。(跑题了)

    示例:在proxy-config.xml配置HTTPService要请求的URL地址,在程序中用“destination”映射关系来访问该URL,如示例中的“catalog”。将J返回的XML内容绑定到<mx:DataGrid>控件上。

    ?

    1. main.mxml??
    2. ????<mx:HTTPService?id="srv"?destination="catalog"?useProxy="true"/>??
    3. ????<mx:DataGrid?dataProvider="{srv.lastResult.catalog.product}"?width="100%"?height="100%"/>???
    4. ????<mx:Button?label="Get?Data"?click="srv.send()"/>??
    ?

    ?

    ?

    1. ????
    2. WEB-INF/flex/proxy-config.xml??
    3. ??<destination?id="catalog">??
    4. ????<properties>??
    5. ????????????<url>/{context.root}/testdrive-httpservice/catalog.jsp</url>??
    6. ????????</properties>??
    7. ????</destination>??

    ?

    ?
    • WebService?:

    可以访问基于SOAP的web服务,其返回的对象自动被反序列化为ActionScript对象。数据绑定、沙箱问 题等与HTTPService相同。

    示例:在proxy-config.xml配置WebService要请求的wsdl地址,在程序中用“destination”映射关系来访问该URL,如示例中的“ws-catalog”。将返回的对象绑定到<mx:DataGrid>控件上。

    ?

    1. main.mxml??
    2. ????<mx:WebService?id="srv"?destination="ws-catalog"?useProxy="true"?showBusyCursor="true"/>??
    3. ??????
    4. ????<mx:DataGrid?dataProvider="{srv.getProducts.lastResult}"?width="100%"?height="100%">??
    5. ????????<mx:columns>??
    6. ????????????<mx:DataGridColumn?dataField="productId"?headerText="Product?Id"/>??
    7. ????????????<mx:DataGridColumn?dataField="name"?headerText="Name"/>??
    8. ????????????<mx:DataGridColumn?dataField="price"?headerText="Price"/>??
    9. ????????</mx:columns>??
    10. ????</mx:DataGrid>??
    11. ??????
    12. ????<mx:Button?label="Get?Data"?click="srv.getProducts()"/>??
    ?

    ?

    ?

    1. proxy-config.xml??
    2. ????<destination?id="ws-catalog">??
    3. ????????<properties>??
    4. ????????????<wsdl>http://livecycledata.org/services/ProductWS?wsdl</wsdl>??
    5. ????????????<soap>*</soap>??
    6. ????????</properties>??
    7. ????????<adapter?ref="soap-proxy"/>??
    8. ????</destination>??
    ?

    ?

    • Remote-Object:

    让用户可以直接访问服务器上的对象的方法,要被访问的对象是一个JAVA类,和Servlet、JSP差不多,但是远程请求的这部分被隐藏起来了。返回的JAVA对象被自动反序列化为Actionscript对象,如果不加以指定类型,就成为一个动态对象。远程访问也是异步的,resultfault事件,分别对应成功和失败。

    示例:在remoting-config.xml配置远程对象的类名,在程序中用“destination”映射关系来访问该类的示例,如示例中的“product”。将返回的java.util.ArrayList对象绑定到<mx:DataGrid>控件上。

    ?

    1. main.mxml??
    2. ????<mx:RemoteObject?id="srv"?destination="product"/>??
    3. ??????
    4. ????<mx:DataGrid?dataProvider="{srv.getProducts.lastResult}"?width="100%"?height="100%"/>???
    5. ????<mx:Button?label="Get?Data"?click="srv.getProducts()"/>?????
    ?

    ?

    ?

    1. remoting-config.xml??
    2. ????<destination?id="product">??
    3. ????????<properties>??
    4. ????????????<source>flex.samples.product.ProductService</source>??
    5. ????????</properties>??
    6. ????</destination>??
    ?

    ?

    ?

    view plain copy to clipboard print ?
    1. package?flex.samples.product;??
    2. import?java.util.ArrayList;??
    3. public?class?ProductService?{??
    4. ????????public?List?getProducts()?{??
    5. ???????????List?list?=?new?ArrayList();??
    6. ???????????list.add(new?Product(100,?"abc"));??
    7. ???????????return?list;??
    8. ????????}??
    9. }??
    10. public?class?Product?implements?Serializable?{??
    11. ????????private?int?productId;??
    12. ????????private?String?name;??
    13. ????????public?Product(int?productId,?String?name)???{...}??
    14. ????public?int?getProductId()?{??
    15. ????????return?productId;??
    16. ????}??
    17. ????public?void?setProductId(int?productId)?{??
    18. ????????this.productId?=?productId;??
    19. ????public?String?getName()?{??
    20. ????????return?name;??
    21. ????}??
    22. ????public?void?setName(String?name)?{??
    23. ????????this.name?=?name;??
    24. ????}??
    25. }??
    ?

    ?

    • Messaging

    消息本身包含消息头和消息体,消息头的格式是固定的,消息体的内容可以随意写。接触过状态机、分布式嵌入式系统编程的会很容易理解。

    消息服务允许Flex客户端可以发布(Publish)和订阅(Subscribe)消息,相应的,客户端的被称为生产者(Producer)和消费者(Consumer),其实也就是发送和接受消息了。

    当一个消息被发到已订阅的目的地(destination)时,就会触发一个客户端的message事件。发布的任何消息会发给所有订阅的人,即使是生产者自己。如果某一订阅方只想收到特定的消息,可以在订阅时使用selecor属性来指定过滤条件,只有符合条件的消息才会被服务器转发。如果想要服务器产生消息,可以产生一个flex.messaging.messages.AsyncMessage类的实例,用flex.messaging.MessageBroker发送出去。

    示例:在服务器端发布消息。通过JSP或Servlet建立一个无限循环线程产生消息。在messaging-config.xml配置消息通道(channel),在程序中用“destination”映射关系来访问该通道,如示例中的“feed”。

    ?

    ?

    ?

    ?

    ?

    ?

    1. ???
    2. WEB-INF/flex/messaging-config.xml??
    3. ???<destination?id="feed">??
    4. ????????<!--?Destination?specific?channel?configuration?can?be?defined?if?needed??
    5. ????????<channels>??
    6. ????????????<channel?ref="my-streaming-amf"/>??
    7. ????????</channels>??????????
    8. ?????????-->??
    9. ????</destination>??
    ?

    ?

    示例:客户端可以发布和订阅消息,在messaging-config.xml配置消息目的地,在程序中用“destination”映射关系来访问该类的示例,如示例中的“chat”。注意,通道及其端点(endpoint)真正的定义是在service-config.xml中,messaging-config.xml中仅仅是引用它们。

    ?

    1. <mx:Producer?id="producer"?destination="chat"/>??
    2. <mx:Consumer?id="consumer"?destination="chat"?message="messageHandler(event.message)"?selector="prop1?=?10"?/>??
    3. <mx:Script>??
    4. ????<!--[CDATA[??
    5. ??????
    6. ????????import?mx.messaging.messages.AsyncMessage;??
    7. ????????import?mx.messaging.messages.IMessage;??
    8. ??????????
    9. ????????private?function?send():void??
    10. ????????{??
    11. ????????????var?message:IMessage?=?new?AsyncMessage();??
    12. ????????????message.headers?=?new?Array();????
    13. ???????????????????????????????message.headers["prop1"]?=?10;??
    14. ???????????????????????????????message.body.chatMessage?=?msg.text;??
    15. ????????????producer.send(message);??
    16. ????????????msg.text?=?"";??
    17. ????????}??
    18. ??????????????????????????
    19. ????????private?function?messageHandler(message:IMessage):void??
    20. ????????{??
    21. ????????????log.text?+=?message.body.chatMessage?+?"/n";??????
    22. ????????}??
    23. ??????????
    24. ????]]-->??
    25. </mx:Script>??
    ?

    ?

    ?

    1. WEB-INF/flex/messaging-config.xml??
    2. ????<destination?id="chat"/>??
    ?

    ?

    ?

    1. WEB-INF/flex/service-config.xml??
    2. ????????<channel-definition?id="my-streaming-amf"?class="mx.messaging.channels.StreamingAMFChannel">??
    3. ????????????<endpoint?url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf"?class="flex.messaging.endpoints.StreamingAMFEndpoint"/>??
    4. ????????</channel-definition>??
    ?

    ?

    可以看到,messaging包括两大类不同的消息通道。分别是streaming channel和polling channel,每一类又有一些扩展类型。

    采用polling channel,可以配置为每隔一段时间就轮询一次,也可以配置让服务器在无数据时等待,直到有数据时才响应(长轮询)。轮询响应完成后后就结束连接。

    采用streaming channel时,服务器的响应一直保持连接状态,这样服务器一次连接后,可以持续下发数据到客户端。由于HTTP连接不是双工的,所以一条AMF或HTTP通道实际上需要2条浏览器连接,分别用于上行和下行数据。这第二条连接仅在需要向服务器发送数据时才建立,之后立即释放。这种通道特别适合实时性高、客户端刷新的应用。比起轮询,这种模式有效减少了反复建立连接的开销。

    IE和Firefox浏览器在每个session最大连接数上有些不同。如果因此导致streaming channel建立失败,则BlazeDS会自动使用messaging-config.xml配置的下一个连接。

    实例:定义多个默认通道,作为备份。

    ?

    1. WEB-INF/flex/messaging-config.xml??
    2. ????<default-channels>??
    3. ????????<channel?ref="my-streaming-amf"/>??
    4. ????????<channel?ref="my-polling-amf"/>??
    5. ????????????????<channel?ref="per-client-qos-polling-amf"/>??
    6. </default-channels>??
    ?

    ?

    如果不在XML中配置消息通道,也可以在Actionscript脚本中动态赋值。

    ?

    ?
    1. <mx:Script>??
    2. ????<!--[CDATA[??
    3. ????????import?mx.messaging.channels.StreamingAMFChannel;??
    4. ????????import?mx.messaging.ChannelSet;??
    5. ????????import?mx.messaging.channels.AMFChannel;??
    6. ????????import?mx.messaging.events.MessageEvent;??
    7. ????????import?mx.messaging.messages.AsyncMessage;??
    8. ????????import?mx.messaging.messages.IMessage;??
    9. ????????private?function?initComp():void??
    10. ????????{??
    11. ????????????var?myStreamingAMF:AMFChannel?=?new?StreamingAMFChannel("my-streaming-amf",?"../messagebroker/streamingamf");??
    12. ????????????var?myPollingAMF:AMFChannel?=?new?AMFChannel("my-polling-amf",?"../messagebroker/amfpolling");??
    13. ????????????myPollingAMF.pollingEnabled?=?true;??
    14. ????????????myPollingAMF.pollingInterval?=?2000;??
    15. ????????????var?channelSet:ChannelSet?=?new?ChannelSet();??
    16. ????????????channelSet.addChannel(myStreamingAMF);??
    17. ????????????channelSet.addChannel(myPollingAMF);??
    18. ????????????consumer.channelSet?=?channelSet;?????????????????
    19. ????????????producer.channelSet?=?channelSet;??
    20. ????????}??
    21. ??
    22. ????]]-->??
    23. </mx:Script>??
    ?

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读