Flex messaging service
发布时间:2020-12-15 04:05:55 所属栏目:百科 来源:网络整理
导读:由于要解决web800的web客户端性能问题,所以考虑使用flex 的 messaging service功能模块。? Flex messaging提供了一套标准的消息格式,包括客户端的api和服务器端的service程序。? 并且可以与其他的message service进行交互,比如JMS(java message service)
由于要解决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,sans-serif; font-size:14px; line-height:25.1875px">}? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容