Flex messaging service

来源:互联网 发布:开票系统网络连接失败 编辑:程序博客网 时间:2024/05/29 09:29
由于要解决web800的web客户端性能问题,所以考虑使用flex 的 messaging service功能模块。 

Flex messaging提供了一套标准的消息格式,包括客户端的api和服务器端的service程序。 
并且可以与其他的message service进行交互,比如JMS(java message service)。 

Flex messaging的发送方式采用生产者和消费者模式。 

Producer(生产者): 负责发送message 
Cosumer(消费者); 负责接收message 
一个客户端可同时包括这两个方式。 

Message channel(消息通道): Flex messaging通过消息通道来处理message的封装与拆分,在通道中进行编码和解码。每一个channel都是一个endpoint. 

Message adapter(消息适配器): 消息适配器,相当于一个消息的拦截器,可以将消息拦截下来进行组装,整合成其他服务器(JMS)的消息格式,并转发出去。用户也可以自己写拦截器,对消息进行拦截处理。 



Message service destination: Flex的消息都是被这个service来进行转发的,service就相当于一个中转站,对已经注册进来的consumer发送消息,支持广播消息发送,对于大批量需及时更新数据的应用很有效(如:股票、网站等)。Message service destination是messaging的核心。且可以针对不同的应用,增加多个destination。 







创建一个destination 

// 创建一个message destination 
String serviceId = "message-service"; //message service名称,配置文件中已经设置了 

MessageBroker broker = MessageBroker.getMessageBroker(null); 
MessageService service = (MessageService) broker.getService(serviceId); 

ServerSettings serverSettings = new ServerSettings(); 
serverSettings.setMaxCacheSize(1000); 
serverSettings.setMessageTTL(0); 
serverSettings.setDurable(false); 

MessageDestination destination = service.createDestination(id); //创建一个destination 
destination.addChannel("my-rtmp"); //使用rtmp通道 
destination.setManaged(true); 
destination.setServerSettings(serverSettings); 
ServiceAdapter adapter = new ChatServerServiceAdapter(); //创建一个adapter,这里的adapter是继承自ServiceAdapter类 
adapter.setId(id+"_adapter"); //设定一个id,如果不设置会报错 
destination.setAdapter(adapter); //将adapter注册到destination中,监听事件 
if (MessageManager.getInstance().getService().isStarted()) 

try { 
destination.start(); //启动destination 
} catch(Exception e) { 
e.printStackTrace(); 




Adapter的使用 

public class ChatServerServiceAdapter extends ServiceAdapter { 

/** 
* 接收客户端发送过来的信息 
*/ 
public Object invoke(Message arg0) { 
System.out.println(">>>接收客户端信息:"+arg0); 
return null; 


/** 
* 拦截subscribe信息(登陆,退出) 
*/ 
public Object manage(CommandMessage arg0) { 
if(arg0.getOperation() == 0) { // 
System.out.println("用户:" + arg0.getClientId() + " 登陆!"); 

if(arg0.getOperation() == 1) { 
System.out.println("用户:" + arg0.getClientId() + " 退出!"); 

return new ArrayList(); //必须返回空的arraylist,否则用户退出不会调用函数 

/** 
* 告诉messageservice服务器,subscribe需要被该类拦截 
*/ 
public boolean handlesSubscriptions() { 
return true; //注意:这里必须返回true,要不然manage函数不会被调用 





服务器发送消息给客户端: 

/** 
* 发送消息给客户端 
* @param service 客户端连接的服务 
* @param clientId 被接受客户端的ID 
* @param message 消息内容 
*/ 
public void sendMessage(String service, String clientId, String message) { 

AsyncMessage msg = new AsyncMessage(); 
msg.setBody(message); 
msg.setDestination(service); 

msg.setClientId(clientId); 
msg.setMessageId(UUIDUtils.createUUID(false)); 

MessageDestination msgDest = (MessageDestination)service.getDestination(serviceName); 
MessageClient msgClient = msgDest.getSubscriptionManager().getSubscriber(clientId);

this.service.getMessageBroker().routeMessageToMessageClient(msg,msgClient); //发送消息给 id为clientid的客户端 

// this.service.pushMessageToClients(msg, false); //发送消息给所有连接上的客户端 
// this.service.pushMessageFromPeer(msg, true); 
// this.service.sendPushMessageFromPeer(msg, true); 

原创粉丝点击