基础知识 :http://keren.iteye.com/blog/479000
Message Service 提供发布(publish) /订阅(subscribe) 机制允许Flex 应用程序发布消息、订阅消息终端(messaging destination),从而实现数据的实时推动 和协作传送 。
消息终端在messaging-config.xml配置,其中频道(channel)是其关键元素,它用来实现客户端和服务器端交换数据。使用BlazeDS,消息终端通常用作streaming 频道或者polling 频道。
使用streaming频道,服务器端会一直响应 HTTP请求直到该频道连接被关闭,它允许服务器向客户端不断传送大量的数据 。因为HTTP 连接是独一无二的,这实现数据的双向传送,每个streaming AMF或者HTTP频道事实上需要两个浏览器 HTTP连接,一个连接需要不断处理服务器端与频道紧密相关的客户端的响应。另外需要一个短暂连接,只有当数据需要传送到服务器时,它才脱离浏览器连接池;当短暂连接不再需要时,它立即被释放回浏览器连接池。
polling频道可以通过简单的时间间隔 或者使用服务器等待来配置,如果数据不马上可用 (长轮循)的话。另外,每次轮循响应完成请求。默认下浏览器HTTP 1.1的连接是持续的,浏览器轮循已有的连接,发送并发的轮循请求,以此来减轻轮循的开销。
当需要准实时通信 时,streaming 频道是最好选择。
Messaging Service可以让 某个客户端 和 其他客户端 之间 发送接收 信息。
1. 在“services-config.xml ”中添加以下内容:(记住channel 名字为amfpoll ,后面会用到)
设置polling频道的间隔 是1秒钟,即客户端每隔1秒钟就会向服务器请求这个消息。
使用polling频道是客户端获取更新最简单的途径 。
<channel-definition id="my-amf-poll" class="mx.messaging.channels.AMFChannel"> <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpoll" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>true</polling-enabled> <polling-interval-seconds>1</polling-interval-seconds> </properties> </channel-definition>
2. 在“messaging-config.xml ”中添加以下内容:
<destination id="MessagingDestination" channels="my-amf-poll"/>
3. 建立一个mxml:(需手动建立channel )
Flex客户端使用 Producer 组件来发送 一个消息到服务器
- 创建 AsyncMessage 类的对象,设置该对象的 body 属性
- 调用 Producer.send() 方法进行发送
使用 Consumer 组件接收 消息
- 使用 Consumer.subscribe () 来订阅 消息
<?xml version="1.0"?> <!-- intro\intro_messaging.mxml --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" creationComplete="consumer.subscribe();"> <mx:Script> <![CDATA[ import mx.messaging.events.MessageFaultEvent; import mx.messaging.events.MessageEvent; import mx.messaging.messages.AsyncMessage; import mx.messaging.Producer; import mx.messaging.Consumer; // Send the message in response to a Button click. private function sendMessage():void { var msg:AsyncMessage = new AsyncMessage(); msg.body = "Foo"; producer.send(msg); } // Handle the received message. private function messageHandler(event:MessageEvent):void { ta.text += "Consumer received message: "+ event.message.body + "\n"; } // Handle a message fault. private function faultHandler(event:MessageFaultEvent):void { ta.text += "Received fault: " + event.faultString + "\n"; } ]]> </mx:Script> <!-- 设置channel为amfpoll --> <mx:AMFChannel id="myamf" uri="/ptp/messagebroker/amfpoll"/> <mx:ChannelSet id="channelSet" channels="{[myamf]}"/> <mx:Producer id="producer" channelSet="{channelSet}" destination="MessagingDestination" fault="faultHandler(event);"/> <mx:Consumer id="consumer" channelSet="{channelSet}" destination="MessagingDestination" fault="faultHandler(event);" message="messageHandler(event);"/> <mx:Button label="Send" click="sendMessage();"/> <mx:TextArea id="ta" width="100%" height="100%"/> </mx:Application>