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

标签: activemq mqtt android | 发表时间:2014-07-11 20:59 | 作者:huchangan2005
出处:http://www.iteye.com

 

原文地址: 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,两个都能收到。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [activemq mqtt android] 推荐:

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

- - 开源软件 - ITeye博客
ActiveMQ使用MQTT协议,加上android上的paho包,即可简单实现消息通知功能,但是mqtt协议只支持topic,而且不能用selector,使得点对点的消息投递变成问题. 1、每个clientId,建一个topic...这个办法对解决消息点对点投递非常有效,但是有两个大问题:. 随着用户数增多,topic数量增多,对管理性要求增大,对内存的管理也有问题.

activeMQ 推送之mqtt客户端

- - ITeye博客
使用activeMQ进行android推送. activeMQ下载地址:http://activemq.apache.org/download.html. 下载后是一个压缩包:apache-activemq-5.9.0-bin.zip. 解压缩,进入apache-activemq-5.9.0-bin\apache-activemq-5.9.0\bin,双击activemq.bat,即可启动activeMQ服务.

Android推送方案分析(MQTT/XMPP/GCM)

- - 移动开发 - ITeye博客
本文主旨在于,对目前Android平台上最主流的几种消息推送方案进行分析和对比,比较客观地反映出这些推送方案的优缺点,帮助大家选择最合适的实施方案. 方案1、使用GCM服务(Google Cloud Messaging). 简介:Google推出的云消息服务,即第二代的C2DM. 优点:Google提供的服务、原生、简单,无需实现和部署服务端.

Android APP必备高级功能,消息推送之MQTT - CSDN博客

- -
本文已授权微信公众号《鸿洋》原创首发,转载请务必注明出处. Android端实现消息推送的几种方式. 轮询:客户端定时向服务器请求数据. 服务器需要向客户端发通知时,发送一条短信,客户端收到特定短信之后,先获取信息,然后拦截短信. 缺点:贵而且短信可能被安全软件拦截. 持久连接(Push)方式:客户端和服务器之间建立长久连接.

【ActiveMQ Tuning】Prefetch Limit

- - 博客园_首页
   摘要:ActiveMQ优化 客户端优化 预取限制. 原文: http://fusesource.com/docs/broker/5.4/tuning/GenTuning-Consumer-Prefetch.html. Overview:图列4.1阐明了Broker在等待之前发送给客户端消息的反馈的行为.

【ActiveMQ Tuning】Serializing to Disk

- - 博客园_首页
     翻译自: http://fusesource.com/docs/broker/5.4/tuning/PersTuning-SerialToDisk.html.      KahaDB message store:KahaDB 是ActiveMQ Broker 为了高性能而推荐使用的消息存储机制.

ActiveMQ 桥接

- - CSDN博客互联网推荐文章
使用目的:将本地产生的消息转发到远程,通过远程服务器来处理消息,处理完成后,再启动消费者处理本地服务器消息(验证消息是否被转走,本地无消息可处理为正常). 消息在下面的地址被消费,无需任何特别配置,采用默认的配置即可. 生产消息地址为localhost:7001,需要做如下配置. 注意: 表示只有这个队列的会进行桥接转发.

基于paho在android平台上实现MQTT Client间的简单通信 - CSDN博客

- -
在之前的博文中,对MQTT和paho进行了简单的描述. paho为实现MQTT通信提供了接口. 本篇将在android平台上,基于paho实现MQTT Client间的简单通信. broker选择公共的mosquitto broker.. paho通过MqttConnectOptions类,对broker与client间的连接进行需求设置.

MQTT(使用mosquitto做broker)做Android推送部分总结 - Scholer的个人页面 - 开源中国

- -
我觉得这句话用在程序员的工作中就是:在网络中找一万篇资料,在实践中做一万种尝试.
**2014-09-17:** **在本文中,由于作者事先不了解,设计不合理,使每个设备采用prefix+CLIENT_ID的方式作为topic,导致需要给每个设备的topic单独推送,才产生了一些问题,特别是推送的时间上的问题,是PHP循环往每个topic写入消息的时间.

GitHub - GruppoFilippetti/vertx-mqtt-broker: Vert.x based MQTT Broker

- -