服务端SDK
1. 使用方式
添加maven依赖
<dependency> <groupId>com.github.mpusher</groupId> <artifactId>mpush-client</artifactId> <version>0.0.2</version> </dependency>
在工程
resources目录增加配置文件application.conf,并配置zookeepermp.zk.namespace=mpush mp.zk.server-address="127.0.0.1:2181"
使用
com.mpush.api.push.PushSende.java进行推送,使用其create方法创建服务,start方法启动服务,stop方法停止服务。推送接口定义如下:public interface PushSender extends Service { /** * 创建PushSender实例 * * @return PushSender */ static PushSender create() { return SpiLoader.load(PusherFactory.class).get(); } /** * 推送push消息 * * @param context 推送参数 * @return FutureTask 可用于同步调用 */ FutureTask<Boolean> send(PushContext context); }
2. 推送流程
2.1. 流程图

2.2. 流程分析
PushSender启动后首先从ZK里获取可用的GatewayServer列表,然后创建相应的Client分别连接到对应的GatewayServer- 当调用
send方法去推送时,PushSender首先会通过RemoteRouterManager查询要推送的用户当前所登录的机器IP,然后通过IP选择GatewayServer并通过第1中对应的Client把消息发送到该机器,因为该机器拥有用户的链接。 GatewayServer接收到Client发送过来的消息后,首先通过查询本地路由LocalRouterManager找到用户连接Connection,该链接是连接到ConnectionServer的。- 如果连接存在,
ConnectionServer会通过此连接把消息下发到客户端。 - 如果推送成功,
GatewayServer会发送消息推送成功的消息给PushSender所持有的Client PushSender收到推送成功消息后,会通过Callback#onSuccess回调调用方,整个推送流程结束。- 如果中间有任何失败则回调
Callback#onFailure。 - 如果用户不在线则回调
Callback#onOffline。 - 如果在一定时间内
PushSender没有收到GatewayServer响应的消息则推送超时,回调Callback#onTimeout通知调用方。
3. 源码解读
PushSender的实现类为com.mpush.client.push.PushClient.javaPushClient使用的是ConnectionRouterManager该类继承自RemoteRouterManager增加了本地缓存可在消息频繁时减轻Redis压力,但会存在一定情况的误判。com.mpush.client.push.PushRequestBus.java用于维持异步推送任务,线程的调整可通过配置设置,任务的拒绝策略为在调用线程执行Callback。具体见DefaultThreadPoolFactory.java。线程池默认配置如下:mp.thread.pool.push-callback={ min:2//核心线程数 max:2//最大线程数 queue-size:0//队列大小 }
GatewayClient会根据GatewayServer的运行状态自行调整,如果有GatewayServer宕机对应的Client会及时销毁,如果有新的机器进来,对应Client也会自动创建。具体参见GatewayClientFactory.java。