使用ActiveMQ+MQTT实现Android点对点消息通知

18 篇文章 0 订阅

使用ActiveMQ+MQTT实现Android点对点消息通知

实现点对点消息通知的关键问题

ActiveMQ使用MQTT协议,加上android上的paho包,即可简单实现消息通知功能,但是mqtt协议只支持topic,而且不能用selector,使得点对点的消息投递变成问题。

有两个解决思路:

1、每个clientId,建一个topic...这个办法对解决消息点对点投递非常有效,但是有两个大问题:

  • 随着用户数增多,topic数量增多,对管理性要求增大,对内存的管理也有问题。
  • 消息广播操作也变得非常麻烦,只能一个个的发送了。

2、另一个思路,就是在消息广播的基础上,进行点对点控制,实现某些特征的消息投递到指定的订阅者。

这个的实现比较简单,而且没有上面方案的大问题。代码稍微改下即可:https://github.com/apache/activemq/pull/5/files

其实就只添加了一个新的类: ClientIdFilterDispatchPolicy

可以git clone所在版本源码,然后加上这个类,mvn package以后使用。

也可以用我打包好的jar:http://pan.baidu.com/s/1bphDFUf

更新到5.15.0-SNAPSHOT版本


使用说明

本修改实现mqtt协议使用单个topic,来做消息广播和点对点的投递。

1、将本文件夹下的activemq-broker-5.9.0.jar、activemq-spring-5.9.0.jar换掉apache-activemq-5.9.0\lib下的jar。
2、参考本文件夹下activemq.xml,在topic上配置
 <dispatchPolicy>
                    <clientIdFilterDispatchPolicy />
                  </dispatchPolicy>
3、对于此配置下的所有名称以.PTP结尾的队列,
   如果要投递消息的properties里包含PTP_CLIENTID,则系统只会将此消息发给clientId为此值的订阅者;如果当前没有此clientId的订阅者,消息不会被任何人接收到。
   如果投递消息的properties里不包含PTP_CLIENTID,则消息广播给所有的订阅者。 跟正常消息投递一致。

其中后缀.PTP和键值PTP_CLIENTID,是可以配置的:
   <dispatchPolicy>
                    <clientIdFilterDispatchPolicy ptpSuffix="" ptpClientId="clientId"/>
                  </dispatchPolicy>
如上配置,使得此policy下的所有topic都起作用,且消息的properties里获取clientId的key变成clientId。

消息发布者,如果要对所有人广播消息,直接发送消息即可。
            如果要对指定的消息订阅者发消息,请在消息里设置接收者的clientId:

               message.setStringProperty(PTP_CLIENTID, clientId);则此消息只有指定的订阅者可以拿到。

简单测试

两台android设备使用MQTT协议订阅到ActiveMQ的同一个topic,clientId分别为mqtt-1001和mqtt1002;

写代码发两条消息,设置消息属性中PTP_CLIENTID分别为mqtt-1001和mqtt1002;

两个设备分别接收到自己的消息通知,相互之间没有影响。还可以测试下如果消息没有PTP_CLIENTID,两个都能收到。

原文地址:https://blog.csdn.net/KimmKing/article/details/17449019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值