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);
}
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);
}
- Flex messaging service
- BlazeDs Messaging service filtering
- BlazeDs Messaging service filtering
- BlazeDs Messaging service filtering
- Understanding the Flex messaging architecture
- 有关 ClassNotFoundException: flex.messaging.HttpFlexSession
- Flex配置文件-messaging-config.xml
- Flex配置文件-messaging-config.xml
- RPC Services vs. Messaging Service
- JMS(Java Messaging Service)
- java.lang.ClassNotFoundException: flex.messaging.HttpFlexSession
- 严重: Error configuring application listener of class flex.messaging.HttpFlexSession flex.messaging.Ht
- Messaging
- Messaging
- Messaging
- Messaging
- 搭建flex + blazeds 最简单的messaging例子:简易聊天室
- Flex 错误mx.messaging.messages::RemotingMessage)详解
- linux内核I2C子系统学习(二)
- android4.2.2修改状态栏透明
- linux内核I2C子系统学习(三)
- [Android面试题-11] 实现一个类的equals方法
- A Quick Reference for Oracle Database 10g RAC on Linux and Unix Platforms
- Flex messaging service
- uva 10392 Factoring Large Numbers
- UITableView里的数据刷新和位置更新
- android应用启动画面+activity动画
- jackson
- 在mysql中存储ip地址
- 去除iframe内滚动条
- Apache 2.4 的ip保护(Order, Deny, Allow, Require)
- Tomcat创建并发布WAR文件