原文地址:http://blog.csdn.net/kimmking/article/details/17449019
实现点对点消息通知的关键问题
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/1gjaf
使用说明
本修改实现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,两个都能收到。
相关推荐
**ActiveMQ MQTT Android ...通过这个ActiveMQ MQTT Android Demo,开发者可以学习如何在移动应用中集成MQTT通信,从而实现设备间的实时消息交换,这对于物联网应用、远程控制、实时监控等场景具有很高的实用价值。
发布者和订阅者通过代理进行消息交互,而代理通常部署在服务器上,可以使用activemq、hivemq或emqx等软件实现。 MQTT的安全性尚未得到充分关注,这为攻击者提供了机会。攻击者可能通过多种方式获取MQTT的认证信息,...
5. **消息类型和模式**:ActiveMQ支持点对点(Queue)和发布/订阅(Topic)两种消息模式。点对点模式下,消息仅被一个消费者接收;发布/订阅模式下,消息可以被多个订阅者接收。 6. **高级特性**:ActiveMQ还提供了...
本Demo是关于如何在Android平台上使用ActiveMQ作为后台服务器,通过MQTT协议实现聊天通讯的示例。下面将详细介绍其中涉及的关键技术点: 1. **ActiveMQ服务器配置**:首先,你需要设置和运行一个本地或远程的...
2. **ActiveMQ**:ActiveMQ是Apache的开源消息中间件,支持多种协议如OpenWire、AMQP、STOMP、XMPP、MQTT等,能处理各种类型的消息传递,如点对点(Point-to-Point)、发布/订阅(Publish/Subscribe)以及事务消息。...
它定义了生产者、消费者和消息队列的概念,支持点对点和发布/订阅两种模式。在消息推送场景中,服务器作为生产者,客户端作为消费者。 3. MQTT协议: - MQTT是轻量级的消息协议,特别适合物联网和移动设备。Java...