• Activemq mqtt 点对点聊天实现(转载)


    我这想到一个点对点聊天的方法,不用没割人都建立一个topic了,思路还是自定义一个分发策略,具体如下:

    1、  建立一个topic,所有人都用匹配订阅的方式订阅以该topic为头的topic,例如:所有人都订阅PTP/#。

    2、  例如A向B发送聊天信息,B的clientId是bbb,A只需要向PTP/bbb 推送聊天信息,我写的自定义策略会针对所有PTP开头的topic做自定义分发<policyEntry topic="PTP.>">,将topic里的clientId解析出来,并将该消息只发给B。

    自定义策略代码:

    复制代码
    public class ClientIdFilterDispatchPolicy extends SimpleDispatchPolicy {
        public boolean dispatch(MessageReference node,
                MessageEvaluationContext msgContext, List<Subscription> consumers)
                throws Exception {
            System.out.println("--------------------------------来了------------------------------------------");
            System.out.println(node.getMessage().getDestination().getQualifiedName());
            System.out.println(node.getMessage().getDestination().getPhysicalName());
            String topic = node.getMessage().getDestination().getPhysicalName();
            String clientId = topic.substring(topic.indexOf(".")+1, topic.length());
            System.out.println("clientId:" + clientId);
            System.out.println("--------------------------------end------------------------------------------");
            
            if (clientId == null)
                super.dispatch(node, msgContext, consumers);
    
            ActiveMQDestination destination = node.getMessage().getDestination();
    
            int count = 0;
            for (Subscription sub : consumers) {
                if (sub.getConsumerInfo().isBrowser()) {
                    continue;
                }
                if (!sub.matches(node, msgContext)) {
                    sub.unmatched(node);
                    continue;
                }
                System.out.println("isTopic:" + destination.isTopic());
                System.out.println("getClientId:" + sub.getContext().getClientId());
                if ((clientId != null)
                        && (destination.isTopic())
                        && (clientId.equals(sub.getContext().getClientId()))
                        ) {
                    sub.add(node);
                    count++;
                } else {
                    sub.unmatched(node);
                }
            }
    
            return count > 0;
        }
    
        
    }
    复制代码
    
    

    activemq.xml

    
    
                  <policyEntry topic="PTP.>">
            <dispatchPolicy>
                        <clientIdFilterDispatchPolicy/>
                      </dispatchPolicy>
            </policyEntry>    

    转载:http://www.cnblogs.com/momofeng/p/5482775.html#undefined
  • 相关阅读:
    算法的时间复杂度
    二叉树递归建立和遍历
    数据挖掘之分类算法---knn算法(有matlab例子)
    C链表之创建简单静态链表
    ID3决策树算法原理及C++实现(其中代码转自别人的博客)
    adobe reader安装完成之前被中断,错误代码150210解决方法
    Oracle性能诊断艺术-读书笔记
    先对结果集排序然后做update、delete操作
    索引聚簇因子相关
    直方图及low_value、high_value
  • 原文地址:https://www.cnblogs.com/candyzhmm/p/6092542.html
Copyright © 2020-2023  润新知