应用场景

应用场景
应用场景是当用户在餐饮、娱乐场所消费时,可以用手机关注商户微信公众号,并从公众号中访问商户评论页面,发表评论,评论会实时推送至现场的各个显示屏终端上,因此就需要开发一个评论消息推送系统,该系统具体需要满足:
1)能够向所有显示屏终端发送评论消息;
2)能够指定向某台显示屏终端发送评论消息。

实现方案

消息推送
基于ActiveMQ实现评论消息推送系统,Producer使用OpenWire协议将评论消息发送至Topic,Consumer通过订阅Topic,使用MQTT协议从Topic上取到评论消息。Topic是广播模式,同一个评论消息可以被所有订阅Topic的Consumer接收,这样就可以实现向所有显示屏终端发送评论消息。在conf/activemq.xml中配置ActiveMQ支持使用OpenWire协议和MQTT协议连接,如下所示:

如何向某台显示屏终端发送消息呢?这里参考了博客《使用ActiveMQ+MQTT实现Android点对点消息通知》(http://blog.csdn.net/kimmking/article/details/17449019):通过在评论消息中设置一个属性记录这个消息需要发往Consumer的id,然后当消息在ActiveMQ中被分发至Consumer时,采用自定义的分发策略,该策略取出当前所有连接的Consumer,判断Consumer的id是否与消息中记录的值相等,若相等,则将消息发往这个Consumer。自定义分发策略代码如下所示:

从代码中可以看出,若消息中包含属性ptpClientId(默认属性名为“PTP_CLIENTID”)且Topic的后缀为ptpSuffix(默认后缀为“.PTP”),则判断是否有Consumer,其id与ptpClientId属性值相等,若有,则将该消息分发给该Consumer。在conf/activemq.xml中配置分发策略,如下所示:

从中可以看出,ptpClientId取值为“machineId”,ptpSuffix取值为“.push”。

消息发送

评论消息发送端代码如下所示:

其中:
1)init方法使用JMS API建立与ActiveMQ的连接与会话,并创建MessageProducer实例。
2)destroy方法关闭与ActiveMQ的连接与会话。
3)pushToOne方法创建文本消息包含评论,并设置属性“machineId”,使用MessageProducer实例发送消息。
4)pushToAll方法创建文本消息包含评论,使用MessageProducer实例发送消息。

消息接收

评论消息接收端代码如下所示:

其中:
1)start方法创建MqttClient实例,建立与ActiveMQ的连接,创建时指定id。
2)connectionLost方法在连接丢失时被调用,循环调用start方法直至连接恢复。
3)messageArrived方法在消息接收时被调用,调用processMessage方法执行具体的业务逻辑,例如在屏幕上显示评论。

权限验证

为了验证尝试连接的Consumer是否具有权限,开发了权限验证插件,该插件调用远程接口进行权限验证。插件配置如下所示:

插件AuthPlugin代码如下所示:

从代码中可以看出,该插件主要功能是新建并返回AuthBroker实例,AuthBroker代码如下所示:

从代码中可以看出,AuthBroker继承自BrokerFilter,重写了addConnection方法,在创建连接时,对于使用MQTT协议的连接,调用远程接口的checkPassword方法,判断账号和密码是否正确,若正确则允许连接。

标签:

基于WebSocket实现微信小程序的消息推送

微信小程序支持通过基于WebSocket进行消息推送,提供了相应的API,例如创建连接示例代码: JavaScript wx.connectSocket({ ...

阅读全文

基于nginx-sticky-module-ng实现会话保持(Sticky Sessions)

对服务进行集群部署,前端进行负载均衡时,需要实现会话保持,对于同一会话的多个请求,通过集群中的一个节点来提供服务。系统的部署结构如图所示,通过Resin...

阅读全文

ActiveMQ基于Zookeeper和LevelDB实现Master/Slave

ActiveMQ的Master/Slave目前支持三种实现方式: 1)Shared File System Master Slave; 2)JDBC Master Slave; 3)Replicated LevelDB Store。 对于第三种方...

阅读全文