网站建设推广专家服务,电商旅游网站策划书,免费ip地址网站,网易企业邮箱手机登录BlazeDS Test Drive里面示例了主要的功能#xff1a;
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里面指定即可。这是个异步请求服务器会返回result或fault事件分别对应成功和失败。可以把返回的结果直接绑定到DataGrid上。利用useProxy属性和crossdomain.xml可以跨域访问这是解决沙箱效应的方法之一。
另一种方法就是不用HTTPService而是写一个JS或PHP脚本用Ajax(XMLHTTP Object) 去访问跨域URL。跑题了
示例在proxy-config.xml配置HTTPService要请求的URL地址在程序中用“destination”映射关系来访问该URL如示例中的“catalog”。将J返回的XML内容绑定到mx:DataGrid控件上。
main.mxml mx:HTTPService idsrv destinationcatalog useProxytrue/ mx:DataGrid dataProvider{srv.lastResult.catalog.product} width100% height100%/ mx:Button labelGet Data clicksrv.send()/ WEB-INF/flex/proxy-config.xml destination idcatalog properties url/{context.root}/testdrive-httpservice/catalog.jsp/url /properties /destination WebService 可以访问基于SOAP的web服务其返回的对象自动被反序列化为ActionScript对象。数据绑定、沙箱问 题等与HTTPService相同。
示例在proxy-config.xml配置WebService要请求的wsdl地址在程序中用“destination”映射关系来访问该URL如示例中的“ws-catalog”。将返回的对象绑定到mx:DataGrid控件上。
main.mxml mx:WebService idsrv destinationws-catalog useProxytrue showBusyCursortrue/ mx:DataGrid dataProvider{srv.getProducts.lastResult} width100% height100% mx:columns mx:DataGridColumn dataFieldproductId headerTextProduct Id/ mx:DataGridColumn dataFieldname headerTextName/ mx:DataGridColumn dataFieldprice headerTextPrice/ /mx:columns /mx:DataGrid mx:Button labelGet Data clicksrv.getProducts()/
proxy-config.xml destination idws-catalog properties wsdlhttp://livecycledata.org/services/ProductWS?wsdl/wsdl soap*/soap /properties adapter refsoap-proxy/ /destination Remote-Object 让用户可以直接访问服务器上的对象的方法要被访问的对象是一个JAVA类和Servlet、JSP差不多但是远程请求的这部分被隐藏起来了。返回的JAVA对象被自动反序列化为Actionscript对象如果不加以指定类型就成为一个动态对象。远程访问也是异步的result或fault事件分别对应成功和失败。
示例在remoting-config.xml配置远程对象的类名在程序中用“destination”映射关系来访问该类的示例如示例中的“product”。将返回的java.util.ArrayList对象绑定到mx:DataGrid控件上。 main.mxml mx:RemoteObject idsrv destinationproduct/ mx:DataGrid dataProvider{srv.getProducts.lastResult} width100% height100%/ mx:Button labelGet Data clicksrv.getProducts()/ remoting-config.xml destination idproduct properties sourceflex.samples.product.ProductService/source /properties /destination view plaincopy to clipboardprint?package flex.samples.product; import java.util.ArrayList; public class ProductService { public List getProducts() { List list new ArrayList(); list.add(new Product(100, abc)); return list; } } public class Product implements Serializable { private int productId; private String name; public Product(int productId, String name) {...} public int getProductId() { return productId; } public void setProductId(int productId) { this.productId productId; public String getName() { return name; } public void setName(String name) { this.name name; } } Messaging 消息本身包含消息头和消息体消息头的格式是固定的消息体的内容可以随意写。接触过状态机、分布式嵌入式系统编程的会很容易理解。
消息服务允许Flex客户端可以发布(Publish)和订阅(Subscribe)消息相应的客户端的被称为生产者(Producer)和消费者(Consumer)其实也就是发送和接受消息了。
当一个消息被发到已订阅的目的地(destination)时就会触发一个客户端的message事件。发布的任何消息会发给所有订阅的人即使是生产者自己。如果某一订阅方只想收到特定的消息可以在订阅时使用selecor属性来指定过滤条件只有符合条件的消息才会被服务器转发。如果想要服务器产生消息可以产生一个flex.messaging.messages.AsyncMessage类的实例用flex.messaging.MessageBroker发送出去。 示例在服务器端发布消息。通过JSP或Servlet建立一个无限循环线程产生消息。在messaging-config.xml配置消息通道channel在程序中用“destination”映射关系来访问该通道如示例中的“feed”。
startfeed.jsp % try { Feed feed new Feed(); feed.start(); out.println(Feed Started); } catch (Exception e) { out.println(A problem occured while starting the feed: e.getMessage()); } %
Feed.java import java.util.*; import flex.messaging.MessageBroker; import flex.messaging.messages.AsyncMessage; import flex.messaging.util.UUIDUtils; public class Feed { private static FeedThread thread; public Feed() { } public void start() { if (thread null) { thread new FeedThread(); thread.start(); } } public void stop() { thread.running false; thread null; } public static class FeedThread extends Thread { public boolean running true; public void run() { MessageBroker msgBroker MessageBroker.getMessageBroker(null); String clientID UUIDUtils.createUUID(); Random random new Random(); double initialValue 35; double currentValue 35; double maxChange initialValue * 0.005; while (running) { double change maxChange - random.nextDouble() * maxChange * 2; double newValue currentValue change; if (currentValue initialValue initialValue * 0.15 currentValue initialValue - initialValue * 0.15) { currentValue newValue; } else { currentValue - change; } AsyncMessage msg new AsyncMessage(); msg.setDestination(feed); msg.setClientId(clientID); msg.setMessageId(UUIDUtils.createUUID()); msg.setTimestamp(System.currentTimeMillis()); msg.setBody(new Double(currentValue)); msgBroker.routeMessageToService(msg, null); System.out.println( currentValue); try { Thread.sleep(300); } catch (InterruptedException e) { } } } } } WEB-INF/flex/messaging-config.xml destination idfeed !-- Destination specific channel configuration can be defined if needed channels channel refmy-streaming-amf/ /channels -- /destination
示例客户端可以发布和订阅消息在messaging-config.xml配置消息目的地在程序中用“destination”映射关系来访问该类的示例如示例中的“chat”。注意通道及其端点(endpoint)真正的定义是在service-config.xml中messaging-config.xml中仅仅是引用它们。
mx:Producer idproducer destinationchat/mx:Consumer idconsumer destinationchat messagemessageHandler(event.message) selectorprop1 10 /mx:Script !--[CDATA[ import mx.messaging.messages.AsyncMessage; import mx.messaging.messages.IMessage; private function send():void { var message:IMessage new AsyncMessage(); message.headers new Array(); message.headers[prop1] 10; message.body.chatMessage msg.text; producer.send(message); msg.text ; } private function messageHandler(message:IMessage):void { log.text message.body.chatMessage /n; } ]]--/mx:Script
WEB-INF/flex/messaging-config.xml destination idchat/ WEB-INF/flex/service-config.xml channel-definition idmy-streaming-amf classmx.messaging.channels.StreamingAMFChannel endpoint urlhttp://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf classflex.messaging.endpoints.StreamingAMFEndpoint/ /channel-definition 可以看到messaging包括两大类不同的消息通道。分别是streaming channel和polling channel每一类又有一些扩展类型。
采用polling channel可以配置为每隔一段时间就轮询一次也可以配置让服务器在无数据时等待直到有数据时才响应长轮询。轮询响应完成后后就结束连接。
采用streaming channel时服务器的响应一直保持连接状态这样服务器一次连接后可以持续下发数据到客户端。由于HTTP连接不是双工的所以一条AMF或HTTP通道实际上需要2条浏览器连接分别用于上行和下行数据。这第二条连接仅在需要向服务器发送数据时才建立之后立即释放。这种通道特别适合实时性高、客户端刷新的应用。比起轮询这种模式有效减少了反复建立连接的开销。
IE和Firefox浏览器在每个session最大连接数上有些不同。如果因此导致streaming channel建立失败则BlazeDS会自动使用messaging-config.xml配置的下一个连接。
实例定义多个默认通道作为备份。
WEB-INF/flex/messaging-config.xml default-channels channel refmy-streaming-amf/ channel refmy-polling-amf/ channel refper-client-qos-polling-amf/ /default-channels 如果不在XML中配置消息通道也可以在Actionscript脚本中动态赋值。
view plaincopy to clipboardprint?mx:Script !--[CDATA[ import mx.messaging.channels.StreamingAMFChannel; import mx.messaging.ChannelSet; import mx.messaging.channels.AMFChannel; import mx.messaging.events.MessageEvent; import mx.messaging.messages.AsyncMessage; import mx.messaging.messages.IMessage; private function initComp():void { var myStreamingAMF:AMFChannel new StreamingAMFChannel(my-streaming-amf, ../messagebroker/streamingamf); var myPollingAMF:AMFChannel new AMFChannel(my-polling-amf, ../messagebroker/amfpolling); myPollingAMF.pollingEnabled true; myPollingAMF.pollingInterval 2000; var channelSet:ChannelSet new ChannelSet(); channelSet.addChannel(myStreamingAMF); channelSet.addChannel(myPollingAMF); consumer.channelSet channelSet; producer.channelSet channelSet; } ]]-- /mx:Script