BlazedDS 的RPC服务
RPC是什么我就不在这不懂装懂了的乱讲了.有兴趣可以网上搜下.
这个的主要目的是实现执行远程代码.
WEB-INF/flex/remoting-config.xml 配置 destination (注.如果集成 spring,就无视吧...会有另外的文件配置成 bean)
<destination id="echoServiceDestination" channels="my-amf">
<properties>
<source>remoting.EchoService</source>
</properties>
</destination>
WEB-INF/flex/services-config.xml 配置频道
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>false</polling-enabled>
</properties>
</channel-definition>
flex客户端调用
<mx:RemoteObject id="remoteObject"
destination="echoServiceDestination"
result="resultHandler(event);"
fault="faultHandler(event);"/>
BlazedDS 的消息服务
http://www.riafan.com/article/backend/blazeds-message-service.html 这里有篇文章推荐看看.
也推荐看这里的(英文) http://livedocs.adobe.com/blazeds/1/blazeds_devguide/Part_Flex_Messaging_1.html adobe官方对消息服务的介绍.
Messaging Service example
http://livedocs.adobe.com/blazeds/1/blazeds_devguide/lcoverview_4.html#1072898
消息订阅? 客户端连接到相同的 destination
flex 创建消息应用,连接到服务器端的某个 destination .当向该 destination 发送消息时, 连接到相同 destination 的其他 flex 客户端就会收到服务器转发的消息.
服务器端也可以直接推送消息给已经连接到相同 destination 的所有客户机.
通常,客户机之间互相是不知道对方的.
消息过滤机制能实现针对某些客户机发消息,不在消息过滤范围内的其它客户机就可以不接收这些消息. http://livedocs.adobe.com/blazeds/1/blazeds_devguide/messaging_6.html#154656
Note: You can support point-to-point messaging, also known as queue-based messaging, between Flex clients by using the JMSAdapter and bridging to a JMS queue. For more information, seeConnecting to the Java Message Service (JMS).
简单记录下需要配置的地方.
Channels 频道
在 WEB-INF/flex/services-config.xml 配置
服务器端会定义的一组频道配置列表.这组列表每个项都有个 endpoint 属性,指示当特定的URL访问到时,该请求会转向哪个代理类(Message Broker). 代理类再将请求转发给MessageService.每个频道还有一些配置来设置消息的模式.
<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>
Destinations
在 WEB-INF/flex/messaging-config.xml 配置 spring 不是用这个.另外使用 <flex:message-destination .../> 定义
<destination id="MessagingDestination" channels="my-amf-poll"/>
flex客户端调用的组件(4以上用 spark 的...)
<mx:Producer id="producer"
destination="chat"
acknowledge="acknowledgeHandler(event);"
fault="faultHandler(event);"/>
<mx:Consumer id="consumer" destination="MessagingDestination" fault="faultHandler(event);" message="messageHandler(event);"/>
//订阅
private function logon():void {
consumer.subscribe();
}
//发送
private function sendMessage():void {
var message:AsyncMessage = new AsyncMessage();
message.body = new Object();
message.body.uName = userName.text;
message.body.uInput = input.text;
message.body.theCollection = ['b','a',3,new Date()];
producer.send(message);
}
//接收
private function messageHandler(event:MessageEvent):void {
// Handle message event.
trace(String(event.message.body.uName) + " ," + String(event.message.body.uInput));
}
//发送消息后处理服务器返回正确
private function acknowledgeHandler(event:MessageAckEvent):void {
// Handle acknowledge message event.
}
//发送消息后处理消息发送失败
private function faultHandler(event:MessageFaultEvent):void {
// Handle message fault event.
}
和RPC不同的是消息服务的 destination 类服务器默认提供了2种.所以不需要再去写了.不过还是提供一个基类.允许扩展自己的消息 Adapters.
- The ActionScriptAdapter is the server-side code that facilitates messaging when your application uses ActionScript objects only or interacts with another system. The ActionScriptAdapter lets you use messaging with Flex clients as the sole producers and consumers of the messages.
- The JMSAdapter lets you bridge destinations to JMS destinations, topics, or queues on a JMS server so that Flex clients can send messages to and receive messages from the JMS server.
- A custom adapter lets you create an adapter to interact with other messaging implementations, or for situations where you need functionality not provided by either of the standard adapters.
消息传递的重发和超时.当 Producer 组件发送消息后,有两种情况会触发 MessageFaultEvent.FAULT 事件,
1超过时间了服务器还没返回一个 MessageAckEvent.ACKNOWLEDGE 信息.
2当频道已经变成断开连接的情况,MessageAckEvent.ACKNOWLEDGE还是没收到.
这个时候可以尝试在 MessageFaultEvent.FAULT事件句柄里重新发送消息.不过还是要注意重发消息会不会导致出现脏数据的问题.
这里是消息过滤 http://livedocs.adobe.com/blazeds/1/blazeds_devguide/help.html?content=Part_Flex_Messaging_1.html
这里是配置消息服务 services-config.xml 包括 adapter,destination http://livedocs.adobe.com/blazeds/1/blazeds_devguide/help.html?content=Part_Flex_Messaging_1.html
另注:假设集成了 spring ,配置文件还是直接参考 spring-flex-1.5.0.RELEASE 里的文档. PDF 第二章和第七章有专门讲如何用bean来配置.
默认情况下,spring-flex 插件已经配置了default- adapters.和指定了 default-channels ,当需要再另建 adapters 时:
<flex:message-broker>
<flex:message-service ... />
</flex:message-broker>
spring 定义消息服务的destination :
<flex:message-destination id="MessagingDestination" channels="my-polling-amf"/>