diff --git a/.gitignore b/.gitignore index 61f3420f..4f89ac43 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *.project */.settings/ */target/ +*/logs/ */bin/ */WebContent/ */.DS_Store @@ -10,6 +11,7 @@ .idea/ target/ +logs/ # Mobile Tools for Java (J2ME) .mtj.tmp/ diff --git a/Changelog.md b/Changelog.md index fc7e5191..e38e3309 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,8 @@ +#### v0.8.2 +* 支持别名、标签设置及推送 +* 存储推送消息到缓存 +* 支持离线消息重复 + #### v0.8.0 1. 增加本地ip和外网ip配置项 diff --git a/README.md b/README.md index f88658dd..f1bcf920 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,35 @@ ## 源码 * group [https://github.com/mpusher/](https://github.com/mpusher/) 源代码空间 -* server [https://github.com/mpusher/mpush](https://github.com/mpusher/mpush) 服务端源码 -* alloc [https://github.com/mpusher/alloc](https://github.com/mpusher/alloc) 调度器源码 -* mpns [https://github.com/mpusher/mpns](https://github.com/mpusher/mpns) 个性化推送中心源码 -* java-client [https://github.com/mpusher/mpush-client-java](https://github.com/mpusher/mpush-client-java) 纯java客户端源码 -* android sdk&demo [https://github.com/mpusher/mpush-android](https://github.com/mpusher/mpush-android) 安卓SDK和DEMO源码 -* IOS sdk(swift) [https://github.com/mpusher/mpush-client-swift](https://github.com/mpusher/mpush-client-swift) swift版客户端源码 -* IOS sdk(OC) [https://github.com/mpusher/mpush-client-oc](https://github.com/mpusher/mpush-client-oc) Object C 客户端源码 +* server [https://github.com/dengly/mpush](https://github.com/dengly/mpush) 服务端源码 +* alloc [https://github.com/dengly/alloc](https://github.com/dengly/alloc) 调度器源码 +* mpns [https://github.com/dengly/mpns](https://github.com/dengly/mpns) 个性化推送中心源码 +* java-client [https://github.com/dengly/mpush-client-java](https://github.com/dengly/mpush-client-java) 纯java客户端源码 +* android sdk&demo [https://github.com/dengly/mpush-android](https://github.com/dengly/mpush-android) 安卓SDK和DEMO源码 +* IOS sdk(swift) [https://github.com/dengly/mpush-client-swift](https://github.com/dengly/mpush-client-swift) swift版客户端源码 +* IOS sdk(OC) [https://github.com/dengly/mpush-client-oc](https://github.com/dengly/mpush-client-oc) Object C 客户端源码 ps:由于源码分别在github和码云有两份,最新的代码以github为主 +## 模块说明 +* conf - 配置模块,仅仅是配置文件 +* mpush-api - api接口 +* mpush-boot - 启动模块,用于启动服务 +* mpush-cache - redis数据缓存,redis操作管理,redis订阅发布 +* mpush-client - MPush客户端 +* mpush-common - 通用模块 +* mpush-core - 核心模块 +* mpush-monitor - 监控模块 +* mpush-netty - netty连接模块 +* mpush-test - 单元测试模块 +* mpush-tools - 工具模块 +* mpush-zk - zookeeper模块 + ## 服务调用关系 -![](https://mpusher.github.io/docs/服务依赖关系.png) +![服务调用关系](https://mpusher.github.io/docs/服务依赖关系.png) ## 源码测试 -1. ```git clone https://github.com/mpusher/mpush.git``` +1. ```git clone https://github.com/dengly/mpush.git``` 2. 导入到eclipse或Intellij IDEA 3. 打开```mpush-test```模块,所有的测试代码都在该模块下 4. 修改配置文件```src/test/resource/application.conf```文件修改方式参照 服务部署第6点 @@ -39,9 +53,9 @@ ps:由于源码分别在github和码云有两份,最新的代码以github为 3. 安装```Redis``` (安装配置步骤略) -4. 下载mpush server 最新的正式包[https://github.com/mpusher/mpush/releases](https://github.com/mpusher/mpush/releases) +4. 下载mpush server 最新的正式包[https://github.com/dengly/mpush/releases](https://github.com/dengly/mpush/releases) -5. 解压下载的tar包`tar -zvxf mpush-release-0.0.2.tar.gz`到 mpush 目录, 结构如下 +5. 解压下载的tar包`tar -zvxf mpush-release-0.8.2.tar.gz`到 mpush 目录, 结构如下 >
    >drwxrwxr-x 2 shinemo shinemo  4096 Aug 20 09:30 bin —> 启动脚本
@@ -85,7 +99,54 @@ ps:由于源码分别在github和码云有两份,最新的代码以github为
    
    ```
    启动入口`com.mpush.bootstrap.ServerLauncher.java` 
-   
+
+## 推送说明
+
+#### http推送接口信息体
+```json
+{
+    "userId":"",
+    "alias":"",
+    "tags":"",
+    "title":"",
+    "content":"",
+    "flags":"",
+    "msgType":"",
+    "extras":{
+        "expire":""
+    }
+}
+```
+
+参数说明
+
+参数 | 类型 | 是否必传 | 说明 
+--- | --- | ---  | --- 
+userId | String | 否 | 用户id
+alias | String | 否 | 别名
+tags | String | 否 | 标签
+title | String | 是 | 标题
+content | String | 是 | 内容
+msgType | int | 是 | 推送类型,1通知 - 会在通知栏显示,2消息 - 不会在通知栏显示,业务自定义消息,3通知+消息
+flags | int | 否 | 特性字段,0x01:声音,0x02:震动,0x03:闪灯
+extras | object | 否 | 扩展
+expire | int | 否 | 过期时间,单位为秒,默认1800,即30分钟
+
+> * `userId`、`alias`、`tags`三者必须有且只能有一种,多个用英文逗号分隔
+> * `userId`和`alias` 全局唯一
+> * `userId`、`alias`、`tags`长度都小于128,且只能是英文字符、数组和英文符号`-`或`_`
+
+#### 内部推送接口信息体
+`com.mpush.api.push.PushMsg`
+
+参数说明
+
+参数 | 类型 | 是否必传 | 说明 
+--- | --- | ---  | --- 
+msgId | String | 是 | 信息id
+content | String | 是 | 内容
+msgType | com.mpush.api.push.MsgType | 是 | 推送类型,1通知 - 会在通知栏显示,2消息 - 不会在通知栏显示,业务自定义消息,3通知+消息
+
 ## 配置文件详解
    ```java
 ##################################################################################################################
@@ -324,4 +385,12 @@ mp {
     }
 }
 ```
-11. 未完待续...
+
+## 独立部署
+1. 打包 `mvn clean package -Pzip`
+2. 打好的包位置: `mpush-boot/target/mpush-release-版本号.tar.gz`
+3. 解压 `tar -zvxf mpush-release-版本号.tar.gz`
+4. `cd mpush-版本号`
+5. `vim conf/mpush.conf`
+6. `chmod +x bin/*.sh`
+7. `bin/mp.sh start`
\ No newline at end of file
diff --git a/TODO b/TODO
new file mode 100644
index 00000000..c4fa058c
--- /dev/null
+++ b/TODO
@@ -0,0 +1,3 @@
+* 将用户id、别名、标签、登录设备信息、离线信息存储到数据库
+* 推送消息存储到数据库
+* 添加信息接收结果
\ No newline at end of file
diff --git a/conf/mpush.conf b/conf/mpush.conf
new file mode 100644
index 00000000..fdba08e2
--- /dev/null
+++ b/conf/mpush.conf
@@ -0,0 +1,22 @@
+mp.log-level=debug
+mp.core.min-heartbeat=3m
+mp.security.private-key="MIIBNgIBADANBgkqhkiG9w0BAQEFAASCASAwggEcAgEAAoGBAKCE8JYKhsbydMPbiO7BJVq1pbuJWJHFxOR7L8Hv3ZVkSG4eNC8DdwAmDHYu/wadfw0ihKFm2gKDcLHp5yz5UQ8PZ8FyDYvgkrvGV0ak4nc40QDJWws621dm01e/INlGKOIStAAsxOityCLv0zm5Vf3+My/YaBvZcB5mGUsPbx8fAgEAAoGAAy0+WanRqwRHXUzt89OsupPXuNNqBlCEqgTqGAt4Nimq6Ur9u2R1KXKXUotxjp71Ubw6JbuUWvJg+5Rmd9RjT0HOUEQF3rvzEepKtaraPhV5ejEIrB+nJWNfGye4yzLdfEXJBGUQzrG+wNe13izfRNXI4dN/6Q5npzqaqv0E1CkCAQACAQACAQACAQACAQA="
+mp.security.public-key="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCghPCWCobG8nTD24juwSVataW7iViRxcTkey/B792VZEhuHjQvA3cAJgx2Lv8GnX8NIoShZtoCg3Cx6ecs+VEPD2fBcg2L4JK7xldGpOJ3ONEAyVsLOttXZtNXvyDZRijiErQALMTorcgi79M5uVX9/jMv2Ggb2XAeZhlLD28fHwIDAQAB"
+mp.zk.server-address="10.0.0.231:2181"
+mp.redis { //redis 集群配置
+    nodes:["10.0.0.211:6380","10.0.0.211:6381","10.0.0.212:6380","10.0.0.212:6381"] //格式是ip:port
+    cluster-model:cluster //single, cluster
+    maxAttempts=3 // 出现异常最大重试次数
+    soTimeout=2000 // 读取数据超时时间
+    connectionTimeout=2000 // 连接超时时间
+}
+mp.net.local-ip="192.168.31.169"  //本地ip, 默认取第一个网卡的本地IP
+mp.net.public-ip="192.168.31.169" //外网ip, 默认取第一个网卡的外网IP
+mp.net.ws-server-port=0 //websocket对外端口, 0表示禁用websocket
+mp.net.gateway-server-net=tcp // 网关服务使用的网络 udp/tcp
+mp.net.connect-server-port=3000 //接入服务的端口号
+mp.http.proxy-enabled=true //启用Http代理功能
+mp.snowflake { //雪花算法
+    workerId=0 // 工作机器ID(0~31)
+    datacenterId=0 // 数据中心ID(0~31)
+}
diff --git a/conf/reference.conf b/conf/reference.conf
index 238d9a3b..e6033663 100644
--- a/conf/reference.conf
+++ b/conf/reference.conf
@@ -144,8 +144,11 @@ mp {
     redis {
         cluster-model=single //single,cluster,sentinel
         sentinel-master:""
-        nodes:[] s//["127.0.0.1:6379"]格式ip:port
-        password="" //your password
+        nodes:[] //["127.0.0.1:6379"]格式ip:port
+        password="" // 密码
+        maxAttempts=1 // 出现异常最大重试次数
+        soTimeout=2000 // 读取数据超时时间
+        connectionTimeout=2000 // 连接超时时间
         config {
             maxTotal:8,
             maxIdle:4,
@@ -236,4 +239,10 @@ mp {
         thread-pool-factory:"com.mpush.tools.thread.pool.DefaultThreadPoolFactory"
         dns-mapping-manager:"com.mpush.common.net.HttpProxyDnsMappingManager"
     }
+
+    #雪花算法
+    snowflake {
+        workerId=0 // 工作机器ID(0~31)
+        datacenterId=0 // 数据中心ID(0~31)
+    }
 }
\ No newline at end of file
diff --git a/mpush-api/pom.xml b/mpush-api/pom.xml
index ca2d84bd..430f8e97 100644
--- a/mpush-api/pom.xml
+++ b/mpush-api/pom.xml
@@ -8,7 +8,7 @@
     
         mpush
         com.github.mpusher
-        0.8.1
+        0.8.2
         ../pom.xml
     
 
diff --git a/mpush-api/src/main/java/com/mpush/api/Constants.java b/mpush-api/src/main/java/com/mpush/api/Constants.java
index 169f0ab0..d1635715 100644
--- a/mpush-api/src/main/java/com/mpush/api/Constants.java
+++ b/mpush-api/src/main/java/com/mpush/api/Constants.java
@@ -34,6 +34,8 @@ public interface Constants {
     String EMPTY_STRING = "";
     String ANY_HOST = "0.0.0.0";
     String KICK_CHANNEL_PREFIX = "/mpush/kick/";
+    // 过期时间,单位为秒,默认1800,即30分钟
+    int EXPIRE_TIME = 1800;
 
     static String getKickChannel(String hostAndPort) {
         return KICK_CHANNEL_PREFIX + hostAndPort;
diff --git a/mpush-api/src/main/java/com/mpush/api/MPushContext.java b/mpush-api/src/main/java/com/mpush/api/MPushContext.java
index 2d1d1f48..636e00af 100644
--- a/mpush-api/src/main/java/com/mpush/api/MPushContext.java
+++ b/mpush-api/src/main/java/com/mpush/api/MPushContext.java
@@ -28,6 +28,8 @@
 /**
  * Created by ohun on 2017/6/21.
  *
+ * MPush上下文
+ *
  * @author ohun@live.cn (夜色)
  */
 public interface MPushContext {
diff --git a/mpush-api/src/main/java/com/mpush/api/common/Condition.java b/mpush-api/src/main/java/com/mpush/api/common/Condition.java
index b596d9cc..306ddf7d 100644
--- a/mpush-api/src/main/java/com/mpush/api/common/Condition.java
+++ b/mpush-api/src/main/java/com/mpush/api/common/Condition.java
@@ -25,6 +25,8 @@
 /**
  * Created by ohun on 16/10/24.
  *
+ * 条件
+ *
  * @author ohun@live.cn (夜色)
  */
 public interface Condition extends Predicate> {
diff --git a/mpush-api/src/main/java/com/mpush/api/connection/Cipher.java b/mpush-api/src/main/java/com/mpush/api/connection/Cipher.java
index 3751b49b..9c8d8630 100644
--- a/mpush-api/src/main/java/com/mpush/api/connection/Cipher.java
+++ b/mpush-api/src/main/java/com/mpush/api/connection/Cipher.java
@@ -22,12 +22,24 @@
 /**
  * Created by ohun on 2015/12/28.
  *
+ * 暗号、加密方式
+ *
  * @author ohun@live.cn
  */
 public interface Cipher {
 
+    /**
+     * 解码
+     * @param data
+     * @return
+     */
     byte[] decrypt(byte[] data);
 
+    /**
+     * 编码
+     * @param data
+     * @return
+     */
     byte[] encrypt(byte[] data);
 
 }
diff --git a/mpush-api/src/main/java/com/mpush/api/connection/SessionContext.java b/mpush-api/src/main/java/com/mpush/api/connection/SessionContext.java
index a68361e2..69162c3e 100644
--- a/mpush-api/src/main/java/com/mpush/api/connection/SessionContext.java
+++ b/mpush-api/src/main/java/com/mpush/api/connection/SessionContext.java
@@ -33,6 +33,7 @@ public final class SessionContext {
     public String clientVersion;
     public String deviceId;
     public String userId;
+    public String alias;
     public String tags;
     public int heartbeat = 10000;// 10s
     public Cipher cipher;
@@ -97,6 +98,7 @@ public String toString() {
                 ", osVersion='" + osVersion + '\'' +
                 ", deviceId='" + deviceId + '\'' +
                 ", userId='" + userId + '\'' +
+                ", alias='" + alias + '\'' +
                 ", tags='" + tags + '\'' +
                 ", heartbeat=" + heartbeat +
                 '}';
diff --git a/mpush-api/src/main/java/com/mpush/api/event/Topics.java b/mpush-api/src/main/java/com/mpush/api/event/Topics.java
index fc6815d5..d349a56a 100644
--- a/mpush-api/src/main/java/com/mpush/api/event/Topics.java
+++ b/mpush-api/src/main/java/com/mpush/api/event/Topics.java
@@ -25,7 +25,13 @@
  * @author ohun@live.cn (夜色)
  */
 public interface Topics {
+    /**
+     * mq在线订阅主题
+     */
     String ONLINE_CHANNEL = "/mpush/online/";
 
+    /**
+     * mq离线订阅主题
+     */
     String OFFLINE_CHANNEL = "/mpush/offline/";
 }
diff --git a/mpush-api/src/main/java/com/mpush/api/message/PacketReceiver.java b/mpush-api/src/main/java/com/mpush/api/message/PacketReceiver.java
index 53aa4748..e79cecb4 100644
--- a/mpush-api/src/main/java/com/mpush/api/message/PacketReceiver.java
+++ b/mpush-api/src/main/java/com/mpush/api/message/PacketReceiver.java
@@ -25,8 +25,15 @@
 /**
  * Created by ohun on 2015/12/22.
  *
+ * 包接收器
+ *
  * @author ohun@live.cn
  */
 public interface PacketReceiver {
+    /**
+     * 接收
+     * @param packet
+     * @param connection
+     */
     void onReceive(Packet packet, Connection connection);
 }
diff --git a/mpush-api/src/main/java/com/mpush/api/protocol/Command.java b/mpush-api/src/main/java/com/mpush/api/protocol/Command.java
index 379d388e..ea0a49b6 100644
--- a/mpush-api/src/main/java/com/mpush/api/protocol/Command.java
+++ b/mpush-api/src/main/java/com/mpush/api/protocol/Command.java
@@ -25,30 +25,55 @@
  * @author ohun@live.cn
  */
 public enum Command {
+    // 心跳
     HEARTBEAT(1),
+    // 握手
     HANDSHAKE(2),
+    // 登录
     LOGIN(3),
+    // 登出
     LOGOUT(4),
+    // 绑定
     BIND(5),
+    // 解绑
     UNBIND(6),
+    // 快速链接
     FAST_CONNECT(7),
+    // 暂停
     PAUSE(8),
+    // 恢复
     RESUME(9),
+    // 错误
     ERROR(10),
+    // 正常
     OK(11),
+    // http代理
     HTTP_PROXY(12),
+    // 踢除
     KICK(13),
+    // 网关踢除
     GATEWAY_KICK(14),
+    // 推送
     PUSH(15),
+    // 网关推送
     GATEWAY_PUSH(16),
+    // 通知
     NOTIFICATION(17),
+    // 网关通知
     GATEWAY_NOTIFICATION(18),
+    // 聊天
     CHAT(19),
+    // 网关聊天
     GATEWAY_CHAT(20),
+    // 组
     GROUP(21),
+    // 网关组
     GATEWAY_GROUP(22),
+    // 确认
     ACK(23),
+    // 不确认
     NACK(24),
+    // 未知
     UNKNOWN(-1);
 
     Command(int cmd) {
@@ -57,6 +82,11 @@ public enum Command {
 
     public final byte cmd;
 
+    /**
+     * 从数据包中获取命令
+     * @param b
+     * @return
+     */
     public static Command toCMD(byte b) {
         Command[] values = values();
         if (b > 0 && b < values.length) return values[b - 1];
diff --git a/mpush-api/src/main/java/com/mpush/api/protocol/JsonPacket.java b/mpush-api/src/main/java/com/mpush/api/protocol/JsonPacket.java
index ecbb16ff..61adb474 100644
--- a/mpush-api/src/main/java/com/mpush/api/protocol/JsonPacket.java
+++ b/mpush-api/src/main/java/com/mpush/api/protocol/JsonPacket.java
@@ -22,7 +22,6 @@
 
 import com.mpush.api.Constants;
 import com.mpush.api.spi.common.Json;
-import com.mpush.api.spi.common.JsonFactory;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.Channel;
 import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
@@ -48,7 +47,7 @@ public JsonPacket(Command cmd) {
         this.addFlag(FLAG_JSON_BODY);
     }
 
-    public JsonPacket(Command cmd, int sessionId) {
+    public JsonPacket(Command cmd, long sessionId) {
         super(cmd, sessionId);
         this.addFlag(FLAG_JSON_BODY);
     }
diff --git a/mpush-api/src/main/java/com/mpush/api/protocol/Packet.java b/mpush-api/src/main/java/com/mpush/api/protocol/Packet.java
index 561cdba9..94ac1dc2 100644
--- a/mpush-api/src/main/java/com/mpush/api/protocol/Packet.java
+++ b/mpush-api/src/main/java/com/mpush/api/protocol/Packet.java
@@ -27,18 +27,23 @@
 
 /**
  * Created by ohun on 2015/12/19.
- * length(4)+cmd(1)+cc(2)+flags(1)+sessionId(4)+lrc(1)+body(n)
+ * length(4)+cmd(1)+cc(2)+flags(1)+sessionId(8)+lrc(1)+body(n)
  *
  * @author ohun@live.cn
  */
 @SuppressWarnings("unchecked")
 public class Packet {
-    public static final int HEADER_LEN = 13;
-
+    // packet包头协议长度
+    public static final int HEADER_LEN = 17;
+    // packet包启用加密
     public static final byte FLAG_CRYPTO = 1;
+    // packet包启用压缩
     public static final byte FLAG_COMPRESS = 2;
+    // 由客户端业务自己确认消息是否到达 标志
     public static final byte FLAG_BIZ_ACK = 4;
+    // 客户端收到消息后自动确认消息 标志
     public static final byte FLAG_AUTO_ACK = 8;
+    // 信息体为json标志
     public static final byte FLAG_JSON_BODY = 16;
 
     public static final byte HB_PACKET_BYTE = -33;
@@ -48,7 +53,7 @@ public class Packet {
     public byte cmd; //命令
     transient public short cc; //校验码 暂时没有用到
     public byte flags; //特性,如是否加密,是否压缩等
-    public int sessionId; // 会话id。客户端生成。
+    public long sessionId; // 会话id。客户端生成。
     transient public byte lrc; // 校验,纵向冗余校验。只校验head
     transient public byte[] body;
 
@@ -56,7 +61,7 @@ public Packet(byte cmd) {
         this.cmd = cmd;
     }
 
-    public Packet(byte cmd, int sessionId) {
+    public Packet(byte cmd, long sessionId) {
         this.cmd = cmd;
         this.sessionId = sessionId;
     }
@@ -65,7 +70,7 @@ public Packet(Command cmd) {
         this.cmd = cmd.cmd;
     }
 
-    public Packet(Command cmd, int sessionId) {
+    public Packet(Command cmd, long sessionId) {
         this.cmd = cmd.cmd;
         this.sessionId = sessionId;
     }
@@ -106,7 +111,7 @@ public byte calcLrc() {
                 .writeByte(cmd)
                 .writeShort(cc)
                 .writeByte(flags)
-                .writeInt(sessionId)
+                .writeLong(sessionId)
                 .array();
         byte lrc = 0;
         for (int i = 0; i < data.length; i++) {
@@ -141,7 +146,7 @@ public Object toFrame(Channel channel) {
     public static Packet decodePacket(Packet packet, ByteBuf in, int bodyLength) {
         packet.cc = in.readShort();//read cc
         packet.flags = in.readByte();//read flags
-        packet.sessionId = in.readInt();//read sessionId
+        packet.sessionId = in.readLong();//read sessionId
         packet.lrc = in.readByte();//read lrc
 
         //read body
@@ -159,7 +164,7 @@ public static void encodePacket(Packet packet, ByteBuf out) {
             out.writeByte(packet.cmd);
             out.writeShort(packet.cc);
             out.writeByte(packet.flags);
-            out.writeInt(packet.sessionId);
+            out.writeLong(packet.sessionId);
             out.writeByte(packet.lrc);
             if (packet.getBodyLength() > 0) {
                 out.writeBytes(packet.body);
diff --git a/mpush-api/src/main/java/com/mpush/api/protocol/UDPPacket.java b/mpush-api/src/main/java/com/mpush/api/protocol/UDPPacket.java
index 74ce4ee1..13d88d1a 100644
--- a/mpush-api/src/main/java/com/mpush/api/protocol/UDPPacket.java
+++ b/mpush-api/src/main/java/com/mpush/api/protocol/UDPPacket.java
@@ -40,7 +40,7 @@ public UDPPacket(byte cmd, InetSocketAddress sender) {
         this.address = sender;
     }
 
-    public UDPPacket(Command cmd, int sessionId, InetSocketAddress sender) {
+    public UDPPacket(Command cmd, long sessionId, InetSocketAddress sender) {
         super(cmd, sessionId);
         this.address = sender;
     }
diff --git a/mpush-api/src/main/java/com/mpush/api/push/MsgType.java b/mpush-api/src/main/java/com/mpush/api/push/MsgType.java
index 8ac3309a..451bef0b 100644
--- a/mpush-api/src/main/java/com/mpush/api/push/MsgType.java
+++ b/mpush-api/src/main/java/com/mpush/api/push/MsgType.java
@@ -1,9 +1,9 @@
 package com.mpush.api.push;
 
 public enum MsgType {
-    NOTIFICATION("提醒", 1),//会在通知栏显示
+    NOTIFICATION("通知", 1),//会在通知栏显示
     MESSAGE("消息", 2),//不会在通知栏显示,业务自定义消息
-    NOTIFICATION_AND_MESSAGE("提醒+消息", 3);//1+2
+    NOTIFICATION_AND_MESSAGE("通知+消息", 3);//1+2
 
     MsgType(String desc, int value) {
         this.desc = desc;
@@ -20,4 +20,11 @@ public String getDesc() {
     public int getValue() {
         return value;
     }
+
+    public static MsgType getMsgType(int value){
+        return value == 1 ? NOTIFICATION
+                : value == 2 ? MESSAGE
+                : value == 3 ? NOTIFICATION_AND_MESSAGE
+                : null;
+    }
 }
\ No newline at end of file
diff --git a/mpush-api/src/main/java/com/mpush/api/push/Notification.java b/mpush-api/src/main/java/com/mpush/api/push/Notification.java
new file mode 100644
index 00000000..84b02503
--- /dev/null
+++ b/mpush-api/src/main/java/com/mpush/api/push/Notification.java
@@ -0,0 +1,32 @@
+package com.mpush.api.push;
+
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: dengliaoyan
+ * @create: 2019-06-15 13:48
+ **/
+public class Notification {
+    /**
+     * {
+     *     "userId":"",
+     *     "alias":"",
+     *     "tags":"",
+     *     "title":"",
+     *     "content":"",
+     *     "flags":"",
+     *     "msgType":"",
+     *     "extras":{
+     *         "expire":""
+     *     }
+     * }
+     */
+    public String msgId; // 推送消息id
+    public String title; // 标题 必填
+    public String content; // 内容 必填
+    public Byte flags; //特性字段。 0x01:声音  0x02:震动  0x03:闪灯
+    public String largeIcon; // 大图标
+    public String ticker; //和title一样
+    public Map extras; // 扩展
+}
diff --git a/mpush-api/src/main/java/com/mpush/api/push/PushContext.java b/mpush-api/src/main/java/com/mpush/api/push/PushContext.java
index 9de96fd3..6bb683c6 100644
--- a/mpush-api/src/main/java/com/mpush/api/push/PushContext.java
+++ b/mpush-api/src/main/java/com/mpush/api/push/PushContext.java
@@ -21,7 +21,7 @@
 
 import com.mpush.api.Constants;
 
-import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
@@ -49,7 +49,12 @@ public class PushContext {
     /**
      * 目标用户,批量
      */
-    private List userIds;
+    private Set userIds;
+
+    /**
+     * 用户别名,批量
+     */
+    private Set aliasSet;
 
     /**
      * 消息ack模式
@@ -80,7 +85,7 @@ public class PushContext {
 
     /**
      * 条件表达式, 满足条件的用户会被推送,目前支持的脚本语言为js
-     * 可以使用的参数为 userId,tags,clientVersion,osName,osVersion
+     * 可以使用的参数为 userId,alias,tags,clientVersion,osName,osVersion
      * 比如 :
      * 灰度:userId % 100 < 20
      * 包含test标签:tags!=null && tags.indexOf("test")!=-1
@@ -94,6 +99,8 @@ public class PushContext {
      */
     private String taskId;
 
+    private Map extras;
+
     public PushContext(byte[] context) {
         this.context = context;
     }
@@ -127,15 +134,24 @@ public PushContext setUserId(String userId) {
         return this;
     }
 
-    public List getUserIds() {
+    public Set getUserIds() {
         return userIds;
     }
 
-    public PushContext setUserIds(List userIds) {
+    public PushContext setUserIds(Set userIds) {
         this.userIds = userIds;
         return this;
     }
 
+    public Set getAliasSet() {
+        return aliasSet;
+    }
+
+    public PushContext setAliasSet(Set aliasSet) {
+        this.aliasSet = aliasSet;
+        return this;
+    }
+
     public AckModel getAckModel() {
         return ackModel;
     }
@@ -202,4 +218,13 @@ public PushContext setTaskId(String taskId) {
         this.taskId = taskId;
         return this;
     }
+
+    public Map getExtras() {
+        return extras;
+    }
+
+    public PushContext setExtras(Map extras) {
+        this.extras = extras;
+        return this;
+    }
 }
diff --git a/mpush-api/src/main/java/com/mpush/api/push/PushMsg.java b/mpush-api/src/main/java/com/mpush/api/push/PushMsg.java
index f269f674..3132108a 100644
--- a/mpush-api/src/main/java/com/mpush/api/push/PushMsg.java
+++ b/mpush-api/src/main/java/com/mpush/api/push/PushMsg.java
@@ -20,24 +20,32 @@
 package com.mpush.api.push;
 
 
+import com.mpush.api.utils.SnowflakeIdWorker;
+
 /**
+ * 内部推送信息体
  * msgId、msgType 必填
+ *
  * msgType=1 :nofication,提醒。
  * 必填:title,content。没有title,则为应用名称。
  * 非必填。nid 通知id,主要用于聚合通知。
  * content 为push  message。附加的一些业务属性,都在里边。json格式
+ *
  * msgType=2 :非通知消息。不在通知栏展示。
  * 必填:content。
+ *
  * msgType=3 :消息+提醒
  * 作为一个push消息过去。和jpush不一样。jpush的消息和提醒是分开发送的。
  */
 public final class PushMsg {
-    private final MsgType msgType; //type
-    private String msgId; //返回使用
+    private final MsgType msgType; //type 必填
+    private String msgId; //返回使用 必填
     private String content; //content
+    private static final SnowflakeIdWorker snowflakeIdWorker = SnowflakeIdWorker.getInstance();
 
-    public PushMsg(MsgType msgType) {
+    private PushMsg(MsgType msgType) {
         this.msgType = msgType;
+        this.msgId = "msgId_"+snowflakeIdWorker.nextId();
     }
 
     public static PushMsg build(MsgType msgType, String content) {
@@ -54,9 +62,9 @@ public int getMsgType() {
         return msgType.getValue();
     }
 
-    public void setMsgId(String msgId) {
-        this.msgId = msgId;
-    }
+//    public void setMsgId(String msgId) {
+//        this.msgId = msgId;
+//    }
 
     public String getContent() {
         return content;
diff --git a/mpush-api/src/main/java/com/mpush/api/push/PushSender.java b/mpush-api/src/main/java/com/mpush/api/push/PushSender.java
index c1eb84d6..544a72b1 100644
--- a/mpush-api/src/main/java/com/mpush/api/push/PushSender.java
+++ b/mpush-api/src/main/java/com/mpush/api/push/PushSender.java
@@ -28,6 +28,8 @@
 /**
  * Created by ohun on 2015/12/30.
  *
+ * 推送发送器
+ *
  * @author ohun@live.cn
  */
 public interface PushSender extends Service {
@@ -47,24 +49,29 @@ static PushSender create() {
      * @param context 推送参数
      * @return FutureTask 可用于同步调用
      */
-    FutureTask send(PushContext context);
+    //FutureTask send(PushContext context);
 
-    default FutureTask send(String context, String userId, PushCallback callback) {
-        return send(PushContext
-                .build(context)
-                .setUserId(userId)
-                .setCallback(callback)
-        );
-    }
+    FutureTask sendByUserId(PushContext context);
+    FutureTask sendByUserIds(PushContext context);
+    FutureTask sendByAlias(PushContext context);
+    FutureTask sendByTags(PushContext context);
 
-    default FutureTask send(String context, String userId, AckModel ackModel, PushCallback callback) {
-        return send(PushContext
-                .build(context)
-                .setAckModel(ackModel)
-                .setUserId(userId)
-                .setCallback(callback)
-        );
-    }
+//    default FutureTask send(String msg, String userId, PushCallback callback) {
+//        return send(PushContext
+//                .build(msg)
+//                .setUserId(userId)
+//                .setCallback(callback)
+//        );
+//    }
+//
+//    default FutureTask send(String msg, String userId, AckModel ackModel, PushCallback callback) {
+//        return send(PushContext
+//                .build(msg)
+//                .setAckModel(ackModel)
+//                .setUserId(userId)
+//                .setCallback(callback)
+//        );
+//    }
 
     default void setMPushContext(MPushContext context) {
     }
diff --git a/mpush-api/src/main/java/com/mpush/api/spi/common/CacheManager.java b/mpush-api/src/main/java/com/mpush/api/spi/common/CacheManager.java
index b1a26d06..5642988f 100644
--- a/mpush-api/src/main/java/com/mpush/api/spi/common/CacheManager.java
+++ b/mpush-api/src/main/java/com/mpush/api/spi/common/CacheManager.java
@@ -45,6 +45,8 @@ public interface CacheManager {
 
      T get(String key, Class tClass);
 
+    boolean exists(String key);
+
     void hset(String key, String field, String value);
 
     void hset(String key, String field, Object value);
@@ -53,6 +55,8 @@ public interface CacheManager {
 
     void hdel(String key, String field);
 
+    boolean hexists(String key, String field);
+
      Map hgetAll(String key, Class clazz);
 
     void zAdd(String key, String value);
diff --git a/mpush-api/src/main/java/com/mpush/api/spi/common/ExecutorFactory.java b/mpush-api/src/main/java/com/mpush/api/spi/common/ExecutorFactory.java
index 9e6a34f2..10220e58 100644
--- a/mpush-api/src/main/java/com/mpush/api/spi/common/ExecutorFactory.java
+++ b/mpush-api/src/main/java/com/mpush/api/spi/common/ExecutorFactory.java
@@ -26,6 +26,8 @@
 /**
  * Created by yxx on 2016/5/20.
  *
+ * 执行工厂
+ *
  * @author ohun@live.cn
  */
 public interface ExecutorFactory {
diff --git a/mpush-api/src/main/java/com/mpush/api/spi/handler/BindValidator.java b/mpush-api/src/main/java/com/mpush/api/spi/handler/BindValidator.java
index 63e21727..feed979e 100644
--- a/mpush-api/src/main/java/com/mpush/api/spi/handler/BindValidator.java
+++ b/mpush-api/src/main/java/com/mpush/api/spi/handler/BindValidator.java
@@ -24,8 +24,10 @@
 /**
  * Created by ohun on 16/10/19.
  *
+ * 绑定验证器
+ *
  * @author ohun@live.cn (夜色)
  */
 public interface BindValidator extends Plugin {
-    boolean validate(String userId, String data);
+    boolean validate(String userId, String alias);
 }
diff --git a/mpush-api/src/main/java/com/mpush/api/srd/ServiceNames.java b/mpush-api/src/main/java/com/mpush/api/srd/ServiceNames.java
index fe244540..052d1441 100644
--- a/mpush-api/src/main/java/com/mpush/api/srd/ServiceNames.java
+++ b/mpush-api/src/main/java/com/mpush/api/srd/ServiceNames.java
@@ -22,6 +22,8 @@
 /**
  * Created by ohun on 2016/12/27.
  *
+ * 服务名称
+ *
  * @author ohun@live.cn (夜色)
  */
 public interface ServiceNames {
diff --git a/mpush-api/src/main/java/com/mpush/api/utils/ArrayUtil.java b/mpush-api/src/main/java/com/mpush/api/utils/ArrayUtil.java
new file mode 100644
index 00000000..7a600bbe
--- /dev/null
+++ b/mpush-api/src/main/java/com/mpush/api/utils/ArrayUtil.java
@@ -0,0 +1,73 @@
+package com.mpush.api.utils;
+
+import java.util.Arrays;
+
+/**
+ * @description:
+ * @author: dengliaoyan
+ * @create: 2019-06-15 08:36
+ **/
+public class ArrayUtil {
+
+    /**
+     * 将指定信息添加到数组中
+     * @param src
+     * @param add
+     * @return
+     */
+    public static String[] addArr(String[] src, String add){
+        if(src==null){
+            src = new String[]{add};
+            return src;
+        }
+        boolean has = false;
+        if(src != null && src.length>0){
+            for(String item : src){
+                if(item.equals(add)){
+                    has = true;
+                    break;
+                }
+            }
+        }
+        if(!has){
+            String[] newArr = Arrays.copyOf(src, src.length+1);
+            newArr[src.length] = add;
+            return newArr;
+        }
+        return src;
+    }
+
+    /**
+     * 从数组中删除指定信息
+     * @param src
+     * @param remove
+     * @return
+     */
+    public static String[] removeArr(String[] src, String remove){
+        if(src==null){
+            return src;
+        }
+        boolean has = false;
+        int index = -1;
+        if(src != null && src.length>0){
+            for(int i=0; i Set toSet(T t){
+        return new HashSet<>(Arrays.asList(t));
+    }
+    public static  Set toSet(T[] t){
+        return new HashSet<>(Arrays.asList(t));
+    }
+    public static  Set toSet(List t){
+        return new HashSet<>(t);
+    }
+    public static  Set toSet(Map t){
+        return new HashSet<>(t.values());
+    }
+}
diff --git a/mpush-api/src/main/java/com/mpush/api/utils/SnowflakeIdWorker.java b/mpush-api/src/main/java/com/mpush/api/utils/SnowflakeIdWorker.java
new file mode 100644
index 00000000..4383009d
--- /dev/null
+++ b/mpush-api/src/main/java/com/mpush/api/utils/SnowflakeIdWorker.java
@@ -0,0 +1,193 @@
+package com.mpush.api.utils;
+
+/**
+ * ID 生成器
+ * 利用 Snowflake 算法生成
+ */
+public class SnowflakeIdWorker {
+    /**
+     * Twitter_Snowflake
+ * SnowFlake的结构如下(每部分用-分开):
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) + * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。 + * 41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
+ * 10位的数据机器位,可以部署在1024个节点,包括5位 datacenterId 和5位 workerId
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
+ * 加起来刚好64位,为一个Long型。
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。 + */ + + // ==============================Fields=========================================== + /** 开始时间截 (2019-04-01) */ + private static final long twepoch = 1554048000000L; + + /** 机器id所占的位数 */ + private static final long workerIdBits = 5L; + + /** 数据标识id所占的位数 */ + private static final long datacenterIdBits = 5L; + + /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */ + private static final long maxWorkerId = -1L ^ (-1L << workerIdBits); + + /** 支持的最大数据标识id,结果是31 */ + private static final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + + /** 序列在id中占的位数 */ + private static final long sequenceBits = 12L; + + /** 机器ID向左移12位 */ + private static final long workerIdShift = sequenceBits; + + /** 数据标识id向左移17位(12+5) */ + private static final long datacenterIdShift = sequenceBits + workerIdBits; + + /** 时间截向左移22位(5+5+12) */ + private static final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */ + private static final long sequenceMask = -1L ^ (-1L << sequenceBits); + + /** 工作机器ID(0~31) 需要设置 */ + private static long workerId; + + /** 数据中心ID(0~31) 需要设置 */ + private static long datacenterId; + + /** 毫秒内序列(0~4095) */ + private long sequence = 0L; + + /** 上次生成ID的时间截 */ + private static long lastTimestamp = -1L; + + private static SnowflakeIdWorker snowflakeIdWorker; + // ==============================Constructors===================================== + + public static SnowflakeIdWorker getInstance() { + if (snowflakeIdWorker == null) { + synchronized (SnowflakeIdWorker.class) { + if (snowflakeIdWorker == null) { + snowflakeIdWorker = new SnowflakeIdWorker(); + } + } + } + return snowflakeIdWorker; + } + + /** + * 构造函数 + */ + private SnowflakeIdWorker() { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException( + String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException( + String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + // ==============================Methods========================================== + + public static long getWorkerId(long id){ + return (id>> 12) & 0x1F; + } + public static long getDatacenterId(long id){ + return (id>> 17) & 0x1F; + } + + /** + * 获取上次生成ID的时间截 + * @return + */ + public static long getLastTimestamp(){ + return lastTimestamp; + } + public static void setLastTimestamp(long lastTimestamp){ + SnowflakeIdWorker.lastTimestamp = lastTimestamp; + } + + /** 工作机器ID(0~31) 需要设置 */ + public static void setWorkerId(long workerId){ + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException( + String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + SnowflakeIdWorker.workerId = workerId; + } + + /** 数据中心ID(0~31) 需要设置 */ + public static void setDatacenterId(long datacenterId){ + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException( + String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + SnowflakeIdWorker.datacenterId = datacenterId; + } + + /** + * 获得下一个ID (该方法是线程安全的) + * + * @return SnowflakeId + */ + public synchronized long nextId() { + long timestamp = timeGen(); + + // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format( + "Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + // 如果是同一时间生成的,则进行毫秒内序列 + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + // 毫秒内序列溢出 + if (sequence == 0) { + // 阻塞到下一个毫秒,获得新的时间戳 + timestamp = tilNextMillis(lastTimestamp); + } + } + // 时间戳改变,毫秒内序列重置 + else { + sequence = 0L; + } + + // 上次生成ID的时间截 + lastTimestamp = timestamp; + + // 移位并通过或运算拼到一起组成64位的ID + return ((timestamp - twepoch) << timestampLeftShift) // + | (datacenterId << datacenterIdShift) // + | (workerId << workerIdShift) // + | sequence; + } + + /** + * 阻塞到下一个毫秒,直到获得新的时间戳 + * + * @param lastTimestamp 上次生成ID的时间截 + * @return 当前时间戳 + */ + protected long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + /** + * 返回以毫秒为单位的当前时间 + * + * @return 当前时间(毫秒) + */ + protected long timeGen() { + return System.currentTimeMillis(); + } +} diff --git a/mpush-boot/pom.xml b/mpush-boot/pom.xml index c448324c..dda6b9a8 100644 --- a/mpush-boot/pom.xml +++ b/mpush-boot/pom.xml @@ -6,7 +6,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/Main.java b/mpush-boot/src/main/java/com/mpush/bootstrap/Main.java index b85c0a20..97ff412a 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/Main.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/Main.java @@ -19,6 +19,8 @@ package com.mpush.bootstrap; +import com.mpush.api.utils.SnowflakeIdWorker; +import com.mpush.tools.config.CC.mp.snowflake; import com.mpush.tools.log.Logs; public class Main { @@ -30,6 +32,8 @@ public class Main { */ public static void main(String[] args) { Logs.init(); + SnowflakeIdWorker.setWorkerId(snowflake.workerId); + SnowflakeIdWorker.setDatacenterId(snowflake.datacenterId); Logs.Console.info("launch mpush server..."); ServerLauncher launcher = new ServerLauncher(); launcher.init(); diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/ServerLauncher.java b/mpush-boot/src/main/java/com/mpush/bootstrap/ServerLauncher.java index 4d8476cf..5cd0d053 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/ServerLauncher.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/ServerLauncher.java @@ -31,6 +31,8 @@ /** * Created by yxx on 2016/5/14. * + * 服务启动器 + * * @author ohun@live.cn */ public final class ServerLauncher { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootChain.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootChain.java index f9b0fb45..dcabb38c 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootChain.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootChain.java @@ -30,6 +30,8 @@ /** * Created by yxx on 2016/5/15. * + * 启动链 + * * @author ohun@live.cn */ public final class BootChain { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootJob.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootJob.java index 100cc9fc..5d252c64 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootJob.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/BootJob.java @@ -26,6 +26,8 @@ /** * Created by yxx on 2016/5/14. * + * 启动任务 + * * @author ohun@live.cn */ public abstract class BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/CacheManagerBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/CacheManagerBoot.java index e84c9a9f..a99c0ad9 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/CacheManagerBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/CacheManagerBoot.java @@ -26,6 +26,8 @@ /** * Created by yxx on 2016/5/14. * + * 缓存管理启动任务 + * * @author ohun@live.cn */ public final class CacheManagerBoot extends BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/HttpProxyBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/HttpProxyBoot.java index f1732b90..06a2dcc1 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/HttpProxyBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/HttpProxyBoot.java @@ -25,6 +25,8 @@ /** * Created by yxx on 2016/5/15. * + * http代理启动任务 + * * @author ohun@live.cn */ public final class HttpProxyBoot extends BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/MonitorBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/MonitorBoot.java index cc430e16..525403d9 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/MonitorBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/MonitorBoot.java @@ -24,6 +24,8 @@ /** * Created by yxx on 2016/5/15. * + * 监控启动任务 + * * @author ohun@live.cn */ public final class MonitorBoot extends BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/PushCenterBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/PushCenterBoot.java index d4f0b76f..34ad0433 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/PushCenterBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/PushCenterBoot.java @@ -24,6 +24,8 @@ /** * Created by ohun on 16/10/25. * + * 推送中心启动任务 + * * @author ohun@live.cn (夜色) */ public final class PushCenterBoot extends BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/RouterCenterBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/RouterCenterBoot.java index 968a411c..622cf85f 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/RouterCenterBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/RouterCenterBoot.java @@ -24,6 +24,8 @@ /** * Created by ohun on 16/10/25. * + * 路由中心启动任务 + * * @author ohun@live.cn (夜色) */ public final class RouterCenterBoot extends BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServerBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServerBoot.java index 4edf1a07..de442ced 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServerBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServerBoot.java @@ -28,6 +28,8 @@ /** * Created by yxx on 2016/5/14. * + * 服务器启动任务 + * * @author ohun@live.cn */ public final class ServerBoot extends BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceDiscoveryBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceDiscoveryBoot.java index 67c397bd..032f9e3e 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceDiscoveryBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceDiscoveryBoot.java @@ -27,6 +27,8 @@ /** * Created by yxx on 2016/5/14. * + * 服务发现启动任务 + * * @author ohun@live.cn */ public final class ServiceDiscoveryBoot extends BootJob { diff --git a/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceRegistryBoot.java b/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceRegistryBoot.java index ef335917..deffa1ca 100644 --- a/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceRegistryBoot.java +++ b/mpush-boot/src/main/java/com/mpush/bootstrap/job/ServiceRegistryBoot.java @@ -25,6 +25,8 @@ /** * Created by yxx on 2016/5/14. * + * 服务注册启动任务 + * * @author ohun@live.cn */ public final class ServiceRegistryBoot extends BootJob { diff --git a/mpush-boot/src/main/resources/mpush.conf b/mpush-boot/src/main/resources/mpush.conf index 54ed2296..a0dcef42 100644 --- a/mpush-boot/src/main/resources/mpush.conf +++ b/mpush-boot/src/main/resources/mpush.conf @@ -2,13 +2,13 @@ mp.log-level=${log.level} mp.core.min-heartbeat=${min.hb} mp.security.private-key="${rsa.privateKey}" mp.security.public-key="${rsa.publicKey}" -mp.zk.server-address="127.0.0.1:2181" //多台机器使用","分隔如:"10.0.10.44:2181,10.0.10.49:2181" +mp.zk.server-address="10.0.0.231:2181" //多台机器使用","分隔如:"10.0.10.44:2181,10.0.10.49:2181" mp.redis { //redis 集群配置 - nodes:["127.0.0.1:6379"] //格式是ip:port - cluster-model:single //single, cluster + nodes:["10.0.0.211:6380","10.0.0.211:6381","10.0.0.212:6380","10.0.0.212:6381"] //格式是ip:port + cluster-model:cluster //single, cluster } -mp.net.local-ip="" //本地ip, 默认取第一个网卡的本地IP -mp.net.public-ip="" //外网ip, 默认取第一个网卡的外网IP +mp.net.local-ip="192.168.31.169" //本地ip, 默认取第一个网卡的本地IP +mp.net.public-ip="192.168.31.169" //外网ip, 默认取第一个网卡的外网IP mp.net.ws-server-port=0 //websocket对外端口, 0表示禁用websocket mp.net.gateway-server-net=tcp // 网关服务使用的网络 udp/tcp mp.net.connect-server-port=3000 //接入服务的端口号 diff --git a/mpush-cache/pom.xml b/mpush-cache/pom.xml index 49bdb136..de2f5e73 100644 --- a/mpush-cache/pom.xml +++ b/mpush-cache/pom.xml @@ -7,7 +7,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml diff --git a/mpush-cache/src/main/java/com/mpush/cache/redis/connection/RedisConnectionFactory.java b/mpush-cache/src/main/java/com/mpush/cache/redis/connection/RedisConnectionFactory.java index 49d55350..421bab49 100644 --- a/mpush-cache/src/main/java/com/mpush/cache/redis/connection/RedisConnectionFactory.java +++ b/mpush-cache/src/main/java/com/mpush/cache/redis/connection/RedisConnectionFactory.java @@ -15,17 +15,14 @@ */ package com.mpush.cache.redis.connection; -import com.mpush.cache.redis.RedisServer; import com.mpush.tools.config.data.RedisNode; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.*; import redis.clients.util.Pool; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -43,7 +40,12 @@ public class RedisConnectionFactory { private String hostName = "localhost"; private int port = Protocol.DEFAULT_PORT; - private int timeout = Protocol.DEFAULT_TIMEOUT; + // 出现异常最大重试次数 + private int maxAttempts = 2; + // 连接超时时间 + private int connectionTimeout = Protocol.DEFAULT_TIMEOUT; + // 读取数据超时时间 + private int soTimeout = Protocol.DEFAULT_TIMEOUT; private String password; private String sentinelMaster; @@ -94,8 +96,11 @@ public void init() { shardInfo.setPassword(password); } - if (timeout > 0) { - shardInfo.setConnectionTimeout(timeout); + if (connectionTimeout > 0) { + shardInfo.setConnectionTimeout(connectionTimeout); + } + if(soTimeout > 0){ + shardInfo.setSoTimeout(soTimeout); } } @@ -152,10 +157,10 @@ protected JedisCluster createCluster() { if (StringUtils.isNotEmpty(getPassword())) { - throw new IllegalArgumentException("Jedis does not support password protected Redis Cluster configurations!"); + return new JedisCluster(hostAndPorts, connectionTimeout, soTimeout, maxAttempts, password, poolConfig); + }else{ + return new JedisCluster(hostAndPorts, connectionTimeout, soTimeout, maxAttempts, poolConfig); } - int redirects = 5; - return new JedisCluster(hostAndPorts, timeout, redirects, poolConfig); } /* @@ -278,20 +283,28 @@ public void setShardInfo(JedisShardInfo shardInfo) { this.shardInfo = shardInfo; } - /** - * Returns the timeout. - * - * @return Returns the timeout - */ - public int getTimeout() { - return timeout; + public int getMaxAttempts() { + return maxAttempts; } - /** - * @param timeout The timeout to set. - */ - public void setTimeout(int timeout) { - this.timeout = timeout; + public void setMaxAttempts(int maxAttempts) { + this.maxAttempts = maxAttempts; + } + + public int getConnectionTimeout() { + return connectionTimeout; + } + + public void setConnectionTimeout(int connectionTimeout) { + this.connectionTimeout = connectionTimeout; + } + + public int getSoTimeout() { + return soTimeout; + } + + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; } /** diff --git a/mpush-cache/src/main/java/com/mpush/cache/redis/manager/RedisManager.java b/mpush-cache/src/main/java/com/mpush/cache/redis/manager/RedisManager.java index 9b2dd102..95a3c247 100644 --- a/mpush-cache/src/main/java/com/mpush/cache/redis/manager/RedisManager.java +++ b/mpush-cache/src/main/java/com/mpush/cache/redis/manager/RedisManager.java @@ -26,7 +26,6 @@ import com.mpush.tools.Utils; import com.mpush.tools.config.CC; import com.mpush.tools.log.Logs; -import com.mpush.monitor.service.ThreadPoolManager; import redis.clients.jedis.*; import java.util.*; @@ -45,6 +44,9 @@ public final class RedisManager implements CacheManager { public void init() { Logs.CACHE.info("begin init redis..."); factory.setPassword(CC.mp.redis.password); + factory.setConnectionTimeout(CC.mp.redis.connectionTimeout); + factory.setSoTimeout(CC.mp.redis.soTimeout); + factory.setMaxAttempts(CC.mp.redis.maxAttempts); factory.setPoolConfig(CC.mp.redis.getPoolConfig(JedisPoolConfig.class)); factory.setRedisServers(CC.mp.redis.nodes); factory.setCluster(CC.mp.redis.isCluster()); @@ -169,6 +171,14 @@ public void hdel(String key, String field) { call(jedis -> jedis.hdel(key, field)); } + public boolean exists(String key) { + return call(jedis -> jedis.exists(key), false); + } + + public boolean hexists(String key, String field) { + return call(jedis -> jedis.hexists(key, field), false); + } + public Map hgetAll(String key) { return call(jedis -> jedis.hgetAll(key), Collections.emptyMap()); } diff --git a/mpush-client/pom.xml b/mpush-client/pom.xml index 1845d1c2..7b3d7b51 100644 --- a/mpush-client/pom.xml +++ b/mpush-client/pom.xml @@ -8,7 +8,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml @@ -35,5 +35,9 @@ ${project.groupId} mpush-zk + + ${project.groupId} + mpush-tools + diff --git a/mpush-client/src/main/java/com/mpush/client/ClientExecutorFactory.java b/mpush-client/src/main/java/com/mpush/client/ClientExecutorFactory.java index de4b8c88..6a11e588 100644 --- a/mpush-client/src/main/java/com/mpush/client/ClientExecutorFactory.java +++ b/mpush-client/src/main/java/com/mpush/client/ClientExecutorFactory.java @@ -33,6 +33,7 @@ import static com.mpush.tools.thread.ThreadNames.T_PUSH_CLIENT_TIMER; /** + * 客户端执行器工厂 * 此线程池可伸缩,线程空闲一定时间后回收,新请求重新创建线程 */ @Spi(order = 1) diff --git a/mpush-client/src/main/java/com/mpush/client/MPushClient.java b/mpush-client/src/main/java/com/mpush/client/MPushClient.java index ab74cfee..49ae8606 100644 --- a/mpush-client/src/main/java/com/mpush/client/MPushClient.java +++ b/mpush-client/src/main/java/com/mpush/client/MPushClient.java @@ -33,6 +33,8 @@ /** * Created by ohun on 2017/7/15. * + * MPush客户端 + * * @author ohun@live.cn (夜色) */ public final class MPushClient implements MPushContext { diff --git a/mpush-client/src/main/java/com/mpush/client/connect/ClientConfig.java b/mpush-client/src/main/java/com/mpush/client/connect/ClientConfig.java index 693a78ea..315adaae 100644 --- a/mpush-client/src/main/java/com/mpush/client/connect/ClientConfig.java +++ b/mpush-client/src/main/java/com/mpush/client/connect/ClientConfig.java @@ -19,16 +19,26 @@ package com.mpush.client.connect; - +/** + * 客户端配置 + */ public class ClientConfig { private byte[] clientKey; private byte[] iv; + // 客户端版本 private String clientVersion; + // 设备id private String deviceId; + // 系统名称 private String osName; + // 系统版本 private String osVersion; + // 用户id private String userId; - private String cipher; //快速重连的时候使用 + // 标签 + private String tags; + // 快速重连的时候使用 + private String cipher; public byte[] getClientKey() { @@ -95,11 +105,20 @@ public void setUserId(String userId) { this.userId = userId; } + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + @Override public String toString() { return "{" + "deviceId='" + deviceId + '\'' + ", userId='" + userId + '\'' + + ", tags='" + tags + '\'' + '}'; } } diff --git a/mpush-client/src/main/java/com/mpush/client/connect/ConnClientChannelHandler.java b/mpush-client/src/main/java/com/mpush/client/connect/ConnClientChannelHandler.java index 6bf1c6d1..09e11224 100644 --- a/mpush-client/src/main/java/com/mpush/client/connect/ConnClientChannelHandler.java +++ b/mpush-client/src/main/java/com/mpush/client/connect/ConnClientChannelHandler.java @@ -49,6 +49,8 @@ /** * Created by ohun on 2015/12/19. * + * 链接客户端通道处理器 + * * @author ohun@live.cn */ public final class ConnClientChannelHandler extends ChannelInboundHandlerAdapter { @@ -76,13 +78,22 @@ public Connection getConnection() { return connection; } + /** + * 通道读取 + * 处理客户端数据 + * @param ctx + * @param msg + * @throws Exception + */ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { connection.updateLastReadTime(); if (msg instanceof Packet) { Packet packet = (Packet) msg; + // 从数据包中获取命令 Command command = Command.toCMD(packet.cmd); if (command == Command.HANDSHAKE) { + // 握手命令 int connectedNum = STATISTICS.connectedNum.incrementAndGet(); connection.getSessionContext().changeCipher(new AesCipher(clientConfig.getClientKey(), clientConfig.getIv())); HandshakeOkMessage message = new HandshakeOkMessage(packet, connection); @@ -97,6 +108,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception saveToRedisForFastConnection(clientConfig, message.sessionId, message.expireTime, sessionKey); } } else if (command == Command.FAST_CONNECT) { + // 快速连接命令 int connectedNum = STATISTICS.connectedNum.incrementAndGet(); String cipherStr = clientConfig.getCipher(); String[] cs = cipherStr.split(","); @@ -111,14 +123,17 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception bindUser(clientConfig); LOGGER.info("fast connect success, clientConfig={}, connectedNum={}", clientConfig, connectedNum); } else if (command == Command.KICK) { + // 剔除命令 KickUserMessage message = new KickUserMessage(packet, connection); LOGGER.error("receive kick user msg userId={}, deviceId={}, message={},", clientConfig.getUserId(), clientConfig.getDeviceId(), message); ctx.close(); } else if (command == Command.ERROR) { + // 错误命令 ErrorMessage message = new ErrorMessage(packet, connection); message.decodeBody(); LOGGER.error("receive an error packet=" + message); } else if (command == Command.PUSH) { + // 推送命令 int receivePushNum = STATISTICS.receivePushNum.incrementAndGet(); PushMessage message = new PushMessage(packet, connection); @@ -132,8 +147,10 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } } else if (command == Command.HEARTBEAT) { + // 心跳命令 LOGGER.info("receive heartbeat pong..."); } else if (command == Command.OK) { + // 正常命令 OkMessage message = new OkMessage(packet, connection); message.decodeBody(); int bindUserNum = STATISTICS.bindUserNum.get(); @@ -144,6 +161,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception LOGGER.info("receive {}, bindUserNum={}", message, bindUserNum); } else if (command == Command.HTTP_PROXY) { + // http代理命令 HttpResponseMessage message = new HttpResponseMessage(packet, connection); message.decodeBody(); LOGGER.info("receive http response, message={}, body={}", @@ -232,7 +250,7 @@ private void tryFastConnect() { private void bindUser(ClientConfig client) { BindUserMessage message = new BindUserMessage(connection); message.userId = client.getUserId(); - message.tags = "test"; + message.tags = client.getTags(); message.send(); connection.getSessionContext().setUserId(client.getUserId()); LOGGER.debug("send bind user message={}", message); diff --git a/mpush-client/src/main/java/com/mpush/client/connect/ConnectClient.java b/mpush-client/src/main/java/com/mpush/client/connect/ConnectClient.java index 529decd9..73f2ac08 100644 --- a/mpush-client/src/main/java/com/mpush/client/connect/ConnectClient.java +++ b/mpush-client/src/main/java/com/mpush/client/connect/ConnectClient.java @@ -25,6 +25,9 @@ import com.mpush.tools.event.EventBus; import io.netty.channel.ChannelHandler; +/** + * 链接客户端 + */ public class ConnectClient extends NettyTCPClient { private final ConnClientChannelHandler handler; diff --git a/mpush-client/src/main/java/com/mpush/client/connect/TestStatistics.java b/mpush-client/src/main/java/com/mpush/client/connect/TestStatistics.java index 47dd683e..e0d54fce 100644 --- a/mpush-client/src/main/java/com/mpush/client/connect/TestStatistics.java +++ b/mpush-client/src/main/java/com/mpush/client/connect/TestStatistics.java @@ -24,6 +24,8 @@ /** * Created by ohun on 2016/12/8. * + * 测试统计 + * * @author ohun@live.cn (夜色) */ public final class TestStatistics { diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/GatewayClient.java b/mpush-client/src/main/java/com/mpush/client/gateway/GatewayClient.java index ef76b80e..22f6a3f2 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/GatewayClient.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/GatewayClient.java @@ -49,6 +49,8 @@ /** * Created by yxx on 2016/5/17. * + * 网关客户端 + * * @author ohun@live.cn */ public class GatewayClient extends NettyTCPClient { diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/GatewayUDPConnector.java b/mpush-client/src/main/java/com/mpush/client/gateway/GatewayUDPConnector.java index 4713e41e..535df1b8 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/GatewayUDPConnector.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/GatewayUDPConnector.java @@ -41,6 +41,8 @@ /** * Created by ohun on 2015/12/30. * + * 网关UDP连接器 + * * @author ohun@live.cn */ public final class GatewayUDPConnector extends NettyUDPConnector { diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayConnectionFactory.java b/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayConnectionFactory.java index f9e6304c..e345c4e5 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayConnectionFactory.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayConnectionFactory.java @@ -34,6 +34,8 @@ /** * Created by yxx on 2016/5/17. * + * 网关链接工厂 + * * @author ohun@live.cn */ public abstract class GatewayConnectionFactory extends BaseService implements ServiceListener { diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayTCPConnectionFactory.java b/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayTCPConnectionFactory.java index 0b6910b1..28304e26 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayTCPConnectionFactory.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayTCPConnectionFactory.java @@ -49,6 +49,8 @@ /** * Created by yxx on 2016/5/17. * + * 网关TCP链接工厂 + * * @author ohun@live.cn */ public class GatewayTCPConnectionFactory extends GatewayConnectionFactory { diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayUDPConnectionFactory.java b/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayUDPConnectionFactory.java index 5aaefb33..6e9e3b39 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayUDPConnectionFactory.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/connection/GatewayUDPConnectionFactory.java @@ -44,6 +44,8 @@ /** * Created by yxx on 2016/5/17. * + * 网关UDP链接工厂 + * * @author ohun@live.cn */ public class GatewayUDPConnectionFactory extends GatewayConnectionFactory { diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayClientChannelHandler.java b/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayClientChannelHandler.java index 395d574a..64d8f9f1 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayClientChannelHandler.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayClientChannelHandler.java @@ -38,6 +38,8 @@ /** * Created by ohun on 2015/12/19. * + * 网关客户端通道处理器 + * * @author ohun@live.cn */ @ChannelHandler.Sharable diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayErrorHandler.java b/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayErrorHandler.java index e86f4275..dad8e62d 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayErrorHandler.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayErrorHandler.java @@ -36,6 +36,8 @@ /** * Created by ohun on 16/10/21. * + * 网关错误处理器 + * * @author ohun@live.cn (夜色) */ public final class GatewayErrorHandler extends BaseMessageHandler { diff --git a/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayOKHandler.java b/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayOKHandler.java index 03a36207..a670bf26 100644 --- a/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayOKHandler.java +++ b/mpush-client/src/main/java/com/mpush/client/gateway/handler/GatewayOKHandler.java @@ -35,6 +35,8 @@ /** * Created by ohun on 16/10/21. * + * 网关正常处理器 + * * @author ohun@live.cn (夜色) */ public final class GatewayOKHandler extends BaseMessageHandler { diff --git a/mpush-client/src/main/java/com/mpush/client/push/PushClient.java b/mpush-client/src/main/java/com/mpush/client/push/PushClient.java index 01288f09..8bc7abfe 100644 --- a/mpush-client/src/main/java/com/mpush/client/push/PushClient.java +++ b/mpush-client/src/main/java/com/mpush/client/push/PushClient.java @@ -26,16 +26,24 @@ import com.mpush.api.push.PushSender; import com.mpush.api.service.BaseService; import com.mpush.api.service.Listener; +import com.mpush.api.spi.common.CacheManager; import com.mpush.api.spi.common.CacheManagerFactory; import com.mpush.api.spi.common.ServiceDiscoveryFactory; +import com.mpush.api.utils.SetUtil; import com.mpush.client.MPushClient; import com.mpush.client.gateway.connection.GatewayConnectionFactory; +import com.mpush.common.CacheKeys; import com.mpush.common.router.CachedRemoteRouterManager; import com.mpush.common.router.RemoteRouter; +import com.mpush.tools.StringUtil; +import java.util.HashSet; import java.util.Set; import java.util.concurrent.FutureTask; +/** + * 推送客户端 + */ public final class PushClient extends BaseService implements PushSender { private MPushClient mPushClient; @@ -46,12 +54,20 @@ public final class PushClient extends BaseService implements PushSender { private GatewayConnectionFactory gatewayConnectionFactory; + private CacheManager cacheManager; + + /** + * 发送推送请求 + * @param ctx + * @return + */ private FutureTask send0(PushContext ctx) { if (ctx.isBroadcast()) { return PushRequest.build(mPushClient, ctx).broadcast(); } else { Set remoteRouters = cachedRemoteRouterManager.lookupAll(ctx.getUserId()); if (remoteRouters == null || remoteRouters.isEmpty()) { + // 用户离线 return PushRequest.build(mPushClient, ctx).onOffline(); } FutureTask task = null; @@ -62,23 +78,120 @@ private FutureTask send0(PushContext ctx) { } } - @Override + //@Override public FutureTask send(PushContext ctx) { if (ctx.isBroadcast()) { + // 广播 return send0(ctx.setUserId(null)); } else if (ctx.getUserId() != null) { + // 按用户id推送 return send0(ctx); } else if (ctx.getUserIds() != null) { + // 按多个用户id推送 FutureTask task = null; for (String userId : ctx.getUserIds()) { task = send0(ctx.setUserId(userId)); } return task; + } else if (ctx.getAliasSet() != null) { + // 按多个别名推送 + // 通过别名查找对应的用户id + Set userIdSet = new HashSet<>(); + for(String alias : ctx.getAliasSet()){ + String userId = cacheManager.hget(CacheKeys.ALIAS_INFO_KEY, alias, String.class); + if(userId != null){ + userIdSet.add(userId); + } + } + FutureTask task = null; + for (String userId : userIdSet) { + task = send0(ctx.setUserId(userId)); + } + userIdSet = null; + return task; + } else if (ctx.getTags() != null) { + // 按多个标签推送 + // 通过标签查找对应的用户id + Set userIdSet = new HashSet<>(); + for(String tag : ctx.getTags()){ + String[] userIds = cacheManager.hget(CacheKeys.TAGS_INFO_KEY, tag, String[].class); + if(userIds != null && userIds.length>0){ + userIdSet.addAll(SetUtil.toSet(userIds)); + } + } + FutureTask task = null; + for (String userId : userIdSet) { + task = send0(ctx.setUserId(userId)); + } + userIdSet = null; + return task; } else { throw new PushException("param error."); } } + @Override + public FutureTask sendByUserId(PushContext context) { + if(context.getUserId() == null + || context.getUserIds() != null + || context.getAliasSet() != null + || context.getTags() != null){ + throw new PushException("param error."); + } + if(!StringUtil.verifyUserId(context.getUserId())){ + throw new PushException("param error."); + } + return send(context); + } + @Override + public FutureTask sendByUserIds(PushContext context) { + if(context.getUserIds() == null + || context.getUserIds().isEmpty() + || context.getUserId() != null + || context.getAliasSet() != null + || context.getTags() != null){ + throw new PushException("param error."); + } + for(String userId : context.getUserIds()){ + if(!StringUtil.verifyUserId(userId)){ + throw new PushException("param error."); + } + } + return send(context); + } + @Override + public FutureTask sendByAlias(PushContext context) { + if(context.getAliasSet() == null + || context.getAliasSet().isEmpty() + || context.getUserId() != null + || context.getUserIds() != null + || context.getTags() != null){ + throw new PushException("param error."); + } + for(String alias : context.getAliasSet()){ + if(!StringUtil.verifyAlias(alias)){ + throw new PushException("param error."); + } + } + return send(context); + } + @Override + public FutureTask sendByTags(PushContext context) { + if(context.getTags() == null + || context.getTags().isEmpty() + || context.getUserId() != null + || context.getUserIds() != null + || context.getAliasSet() != null){ + throw new PushException("param error."); + } + for(String tags : context.getTags()){ + if(!StringUtil.verifyTags(tags)){ + throw new PushException("param error."); + } + } + return send(context); + } + @Override protected void doStart(Listener listener) throws Throwable { if (mPushClient == null) { @@ -93,6 +206,7 @@ protected void doStart(Listener listener) throws Throwable { CacheManagerFactory.create().init(); pushRequestBus.syncStart(); gatewayConnectionFactory.start(listener); + cacheManager = CacheManagerFactory.create(); } @Override diff --git a/mpush-client/src/main/java/com/mpush/client/push/PushClientFactory.java b/mpush-client/src/main/java/com/mpush/client/push/PushClientFactory.java index 3fbc3a6c..8b2cc013 100644 --- a/mpush-client/src/main/java/com/mpush/client/push/PushClientFactory.java +++ b/mpush-client/src/main/java/com/mpush/client/push/PushClientFactory.java @@ -22,11 +22,12 @@ import com.mpush.api.push.PushSender; import com.mpush.api.spi.Spi; import com.mpush.api.spi.client.PusherFactory; -import com.mpush.client.MPushClient; /** * Created by yxx on 2016/5/18. * + * 推送客户端工厂 + * * @author ohun@live.cn */ @Spi diff --git a/mpush-client/src/main/java/com/mpush/client/push/PushRequest.java b/mpush-client/src/main/java/com/mpush/client/push/PushRequest.java index b1862240..bf0c9879 100644 --- a/mpush-client/src/main/java/com/mpush/client/push/PushRequest.java +++ b/mpush-client/src/main/java/com/mpush/client/push/PushRequest.java @@ -22,11 +22,15 @@ import com.mpush.api.Constants; import com.mpush.api.push.*; import com.mpush.api.router.ClientLocation; +import com.mpush.api.spi.common.CacheManager; +import com.mpush.api.spi.common.CacheManagerFactory; import com.mpush.client.MPushClient; +import com.mpush.common.CacheKeys; import com.mpush.common.message.gateway.GatewayPushMessage; import com.mpush.common.push.GatewayPushResult; import com.mpush.common.router.RemoteRouter; import com.mpush.tools.Jsons; +import com.mpush.tools.common.Strings; import com.mpush.tools.common.TimeLine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,6 +45,8 @@ /** * Created by ohun on 2015/12/30. * + * 推送请求 + * * @author ohun@live.cn */ public final class PushRequest extends FutureTask { @@ -54,6 +60,7 @@ private enum Status {init, success, failure, offline, timeout} private final TimeLine timeLine = new TimeLine("Push-Time-Line"); private final MPushClient mPushClient; + private static final CacheManager cacheManager = CacheManagerFactory.create(); private AckModel ackModel; private Set tags; @@ -63,11 +70,16 @@ private enum Status {init, success, failure, offline, timeout} private byte[] content; private int timeout; private ClientLocation location; - private int sessionId; + private long sessionId; private String taskId; private Future future; private PushResult result; + private String msgId; + /** + * 发送到连接服务器 + * @param remoteRouter + */ private void sendToConnServer(RemoteRouter remoteRouter) { timeLine.addTimePoint("lookup-remote"); @@ -117,6 +129,10 @@ private void sendToConnServer(RemoteRouter remoteRouter) { } } + /** + * 提交状态 + * @param status + */ private void submit(Status status) { if (this.status.compareAndSet(Status.init, status)) {//防止重复调用 boolean isTimeoutEnd = status == Status.timeout;//任务是否超时结束 @@ -159,12 +175,21 @@ public boolean cancel(boolean mayInterruptIfRunning) { throw new UnsupportedOperationException(); } + /** + * 发送消息到连接服务器 + * @param router + * @return + */ public FutureTask send(RemoteRouter router) { timeLine.begin(); sendToConnServer(router); return this; } + /** + * 广播 + * @return + */ public FutureTask broadcast() { timeLine.begin(); @@ -206,30 +231,75 @@ public FutureTask broadcast() { return this; } + /** + * 存储离线消息 + */ + private void saveOfflineMsg(){ + if(Strings.isBlank(msgId)){ + return; + } + String key = CacheKeys.getUserInfoKey(userId); + if(cacheManager.exists(key)){ + String msgs = cacheManager.hget(key, CacheKeys.USER_INFO_FIELD_MSG, String.class); + + String cacheMsgId = CacheKeys.getMsgKey(msgId); + if(msgs == null){ + msgs = cacheMsgId; + }else{ + msgs = msgs +","+cacheMsgId; + } + cacheManager.hset(key, CacheKeys.USER_INFO_FIELD_MSG, msgs); + + LOGGER.info("save offline, userId={}, key={} msg={}", userId, CacheKeys.USER_INFO_FIELD_MSG, Jsons.toJson(msgs)); + } + } + + /** + * 离线 + */ private void offline() { mPushClient.getCachedRemoteRouterManager().invalidateLocalCache(userId); submit(Status.offline); + // 存储离线消息 + saveOfflineMsg(); } + /** + * 超时 + */ private void timeout() { //超时要把request从队列中移除,其他情况是XXHandler中移除的 if (mPushClient.getPushRequestBus().getAndRemove(sessionId) != null) { submit(Status.timeout); } + // 存储离线消息 + saveOfflineMsg(); } + /** + * 成功 + */ private void success() { submit(Status.success); } + /** + * 失败 + */ private void failure() { submit(Status.failure); } + /** + * 失败 + */ public void onFailure() { failure(); } + /** + * 重定向 + */ public void onRedirect() { timeLine.addTimePoint("redirect"); LOGGER.warn("user route has changed, userId={}, location={}", userId, location); @@ -261,7 +331,7 @@ public long getTimeout() { return timeout; } - public PushRequest(MPushClient mPushClient) { + private PushRequest(MPushClient mPushClient) { super(NONE); this.mPushClient = mPushClient; } @@ -269,8 +339,19 @@ public PushRequest(MPushClient mPushClient) { public static PushRequest build(MPushClient mPushClient, PushContext ctx) { byte[] content = ctx.getContext(); PushMsg msg = ctx.getPushMsg(); + String msgId = null; if (msg != null) { String json = Jsons.toJson(msg); + // 存储推送信息 + msgId = msg.getMsgId(); + int expireTime = Constants.EXPIRE_TIME; + if(ctx.getExtras()!=null){ + if(ctx.getExtras().containsKey("extras")){ + expireTime = Integer.valueOf(ctx.getExtras().get("extras")); + } + } + String cacheMsgId = CacheKeys.getMsgKey(msgId); + cacheManager.set(cacheMsgId, json, expireTime); if (json != null) { content = json.getBytes(Constants.UTF_8); } @@ -286,7 +367,8 @@ public static PushRequest build(MPushClient mPushClient, PushContext ctx) { .setTaskId(ctx.getTaskId()) .setContent(content) .setTimeout(ctx.getTimeout()) - .setCallback(ctx.getCallback()); + .setCallback(ctx.getCallback()) + .setMsgId(msgId); } @@ -340,6 +422,11 @@ public PushRequest setTaskId(String taskId) { return this; } + public PushRequest setMsgId(String msgId) { + this.msgId = msgId; + return this; + } + @Override public String toString() { return "PushRequest{" + diff --git a/mpush-client/src/main/java/com/mpush/client/push/PushRequestBus.java b/mpush-client/src/main/java/com/mpush/client/push/PushRequestBus.java index 8fef43de..4113ac3c 100644 --- a/mpush-client/src/main/java/com/mpush/client/push/PushRequestBus.java +++ b/mpush-client/src/main/java/com/mpush/client/push/PushRequestBus.java @@ -22,21 +22,25 @@ import com.mpush.api.service.BaseService; import com.mpush.api.service.Listener; import com.mpush.client.MPushClient; -import com.mpush.monitor.service.ThreadPoolManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; -import java.util.concurrent.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * Created by ohun on 2015/12/30. * + * 推送请求总线 + * * @author ohun@live.cn */ public class PushRequestBus extends BaseService { private final Logger logger = LoggerFactory.getLogger(PushRequestBus.class); - private final Map reqQueue = new ConcurrentHashMap<>(1024); + private final Map reqQueue = new ConcurrentHashMap<>(1024); private ScheduledExecutorService scheduledExecutor; private final MPushClient mPushClient; @@ -44,12 +48,12 @@ public PushRequestBus(MPushClient mPushClient) { this.mPushClient = mPushClient; } - public Future put(int sessionId, PushRequest request) { + public Future put(long sessionId, PushRequest request) { reqQueue.put(sessionId, request); return scheduledExecutor.schedule(request, request.getTimeout(), TimeUnit.MILLISECONDS); } - public PushRequest getAndRemove(int sessionId) { + public PushRequest getAndRemove(long sessionId) { return reqQueue.remove(sessionId); } diff --git a/mpush-client/src/main/java/com/mpush/client/user/UserStatusChangeListener.java b/mpush-client/src/main/java/com/mpush/client/user/UserStatusChangeListener.java index b14f8c6c..a4e4a852 100644 --- a/mpush-client/src/main/java/com/mpush/client/user/UserStatusChangeListener.java +++ b/mpush-client/src/main/java/com/mpush/client/user/UserStatusChangeListener.java @@ -32,6 +32,8 @@ /** * Created by ohun on 2016/1/4. * + * 用户状态变化监听器 + * * @author ohun@live.cn */ public class UserStatusChangeListener implements MQMessageReceiver { diff --git a/mpush-common/pom.xml b/mpush-common/pom.xml index 81b8323e..f70fb414 100644 --- a/mpush-common/pom.xml +++ b/mpush-common/pom.xml @@ -5,7 +5,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml 4.0.0 diff --git a/mpush-common/src/main/java/com/mpush/common/CacheKeys.java b/mpush-common/src/main/java/com/mpush/common/CacheKeys.java index 2e8baed6..656b502d 100644 --- a/mpush-common/src/main/java/com/mpush/common/CacheKeys.java +++ b/mpush-common/src/main/java/com/mpush/common/CacheKeys.java @@ -19,20 +19,48 @@ package com.mpush.common; +/** + * 缓存key + */ public final class CacheKeys { - - private static final String USER_PREFIX = "mp:ur:";//用户路由 - - private static final String SESSION_PREFIX = "mp:rs:";//可复用session + //用户路由 + private static final String USER_PREFIX = "mp:ur:"; + //可复用session + private static final String SESSION_PREFIX = "mp:rs:"; private static final String FAST_CONNECTION_DEVICE_PREFIX = "mp:fcd:"; - - private static final String ONLINE_USER_LIST_KEY_PREFIX = "mp:oul:";//在线用户列表 + //在线用户列表 + private static final String ONLINE_USER_LIST_KEY_PREFIX = "mp:oul:"; public static final String SESSION_AES_KEY = "mp:sa"; public static final String SESSION_AES_SEQ_KEY = "mp:sas"; public static final String PUSH_TASK_PREFIX = "mp:pt"; + + // 根据用户id,存储别名、标签、在线设备列表、离线消息 + private static final String USER_INFO_KEY_PREFIX = "mp:info:"; + public static final String USER_INFO_FIELD_ALIAS = "alias"; + public static final String USER_INFO_FIELD_TAGS = "tags"; + public static final String USER_INFO_FIELD_DEVICES = "devices"; + public static final String USER_INFO_FIELD_MSG = "msg"; + // 存储 别名 对应的 用户id + public static final String ALIAS_INFO_KEY = "mp:info:alias"; + // 存储 标签 对应的 用户id + public static final String TAGS_INFO_KEY = "mp:info:tags"; + //离线消息 + private static final String MSG_KEY_PREFIX = "mp:msg:"; + + + public static String getUserInfoKey(String userId) { + return USER_INFO_KEY_PREFIX + userId; + } + public static String getMsgKey(String msgId) { + return MSG_KEY_PREFIX + msgId; + } + public static String getMsgKey(long msgId) { + return MSG_KEY_PREFIX + msgId; + } + public static String getUserRouteKey(String userId) { return USER_PREFIX + userId; } diff --git a/mpush-common/src/main/java/com/mpush/common/CommonExecutorFactory.java b/mpush-common/src/main/java/com/mpush/common/CommonExecutorFactory.java index 76def7e1..dc21f388 100644 --- a/mpush-common/src/main/java/com/mpush/common/CommonExecutorFactory.java +++ b/mpush-common/src/main/java/com/mpush/common/CommonExecutorFactory.java @@ -41,6 +41,8 @@ /** * Created by ohun on 2017/7/15. * + * 通用执行工厂 + * * @author ohun@live.cn (夜色) */ public class CommonExecutorFactory implements ExecutorFactory { diff --git a/mpush-common/src/main/java/com/mpush/common/ErrorCode.java b/mpush-common/src/main/java/com/mpush/common/ErrorCode.java index fc97414c..06ec7e76 100644 --- a/mpush-common/src/main/java/com/mpush/common/ErrorCode.java +++ b/mpush-common/src/main/java/com/mpush/common/ErrorCode.java @@ -22,18 +22,30 @@ /** * Created by ohun on 2015/12/30. * + * 错误码 + * * @author ohun@live.cn */ public enum ErrorCode { + // 用户离线 OFFLINE(1, "user offline"), + // 推送客户端失败 PUSH_CLIENT_FAILURE(2, "push to client failure"), + // 路由器改变 ROUTER_CHANGE(3, "router change"), + // 确认超时 ACK_TIMEOUT(4, "ack timeout"), + // 处理信息错误 DISPATCH_ERROR(100, "handle message error"), + // 不支持命令 UNSUPPORTED_CMD(101, "unsupported command"), + // 重复握手 REPEAT_HANDSHAKE(102, "repeat handshake"), + // 会话已过期 SESSION_EXPIRED(103, "session expired"), + // 设备无效 INVALID_DEVICE(104, "invalid device"), + // 用户离线 UNKNOWN(-1, "unknown"); ErrorCode(int code, String errorMsg) { diff --git a/mpush-common/src/main/java/com/mpush/common/MessageDispatcher.java b/mpush-common/src/main/java/com/mpush/common/MessageDispatcher.java index 06cd5e34..ab7d4667 100644 --- a/mpush-common/src/main/java/com/mpush/common/MessageDispatcher.java +++ b/mpush-common/src/main/java/com/mpush/common/MessageDispatcher.java @@ -41,6 +41,8 @@ /** * Created by ohun on 2015/12/22. * + * 信息分发器 + * * @author ohun@live.cn */ public final class MessageDispatcher implements PacketReceiver { diff --git a/mpush-common/src/main/java/com/mpush/common/ServerNodes.java b/mpush-common/src/main/java/com/mpush/common/ServerNodes.java index 9c102017..89ebcbd9 100644 --- a/mpush-common/src/main/java/com/mpush/common/ServerNodes.java +++ b/mpush-common/src/main/java/com/mpush/common/ServerNodes.java @@ -25,15 +25,19 @@ import com.mpush.tools.config.CC; import com.mpush.tools.config.ConfigTools; -import static com.mpush.api.srd.ServiceNames.ATTR_PUBLIC_IP; - /** * Created by ohun on 2016/12/27. * + * 服务器节点 + * * @author ohun@live.cn (夜色) */ public class ServerNodes { + /** + * c/s服务器 + * @return + */ public static ServiceNode cs() { CommonServiceNode node = new CommonServiceNode(); node.setHost(ConfigTools.getConnectServerRegisterIp()); @@ -44,6 +48,10 @@ public static ServiceNode cs() { return node; } + /** + * websocket服务器 + * @return + */ public static ServiceNode ws() { CommonServiceNode node = new CommonServiceNode(); node.setHost(ConfigTools.getConnectServerRegisterIp()); @@ -54,6 +62,10 @@ public static ServiceNode ws() { return node; } + /** + * 网关服务器 + * @return + */ public static ServiceNode gs() { CommonServiceNode node = new CommonServiceNode(); node.setHost(ConfigTools.getGatewayServerRegisterIp()); diff --git a/mpush-common/src/main/java/com/mpush/common/condition/TagsCondition.java b/mpush-common/src/main/java/com/mpush/common/condition/TagsCondition.java index 93b77313..222a1887 100644 --- a/mpush-common/src/main/java/com/mpush/common/condition/TagsCondition.java +++ b/mpush-common/src/main/java/com/mpush/common/condition/TagsCondition.java @@ -27,6 +27,8 @@ /** * Created by ohun on 16/10/24. * + * 便签条件 + * * @author ohun@live.cn (夜色) */ public final class TagsCondition implements Condition { diff --git a/mpush-common/src/main/java/com/mpush/common/handler/BaseMessageHandler.java b/mpush-common/src/main/java/com/mpush/common/handler/BaseMessageHandler.java index 4a47ba69..6b676462 100644 --- a/mpush-common/src/main/java/com/mpush/common/handler/BaseMessageHandler.java +++ b/mpush-common/src/main/java/com/mpush/common/handler/BaseMessageHandler.java @@ -29,12 +29,12 @@ /** * Created by ohun on 2015/12/22. * + * 基本信息处理器 + * * @author ohun@live.cn */ public abstract class BaseMessageHandler implements MessageHandler { - - public abstract T decode(Packet packet, Connection connection); public abstract void handle(T message); diff --git a/mpush-common/src/main/java/com/mpush/common/handler/ErrorMessageHandler.java b/mpush-common/src/main/java/com/mpush/common/handler/ErrorMessageHandler.java index a451a1c0..5c47786f 100644 --- a/mpush-common/src/main/java/com/mpush/common/handler/ErrorMessageHandler.java +++ b/mpush-common/src/main/java/com/mpush/common/handler/ErrorMessageHandler.java @@ -26,6 +26,8 @@ /** * Created by ohun on 2015/12/30. * + * 错误信息处理器 + * * @author ohun@live.cn */ public class ErrorMessageHandler extends BaseMessageHandler { diff --git a/mpush-common/src/main/java/com/mpush/common/handler/OkMessageHandler.java b/mpush-common/src/main/java/com/mpush/common/handler/OkMessageHandler.java index 7d77b11c..b5c698b6 100644 --- a/mpush-common/src/main/java/com/mpush/common/handler/OkMessageHandler.java +++ b/mpush-common/src/main/java/com/mpush/common/handler/OkMessageHandler.java @@ -26,6 +26,8 @@ /** * Created by ohun on 2015/12/30. * + * 正常信息处理器 + * * @author ohun@live.cn */ public class OkMessageHandler extends BaseMessageHandler { diff --git a/mpush-common/src/main/java/com/mpush/common/memory/PacketFactory.java b/mpush-common/src/main/java/com/mpush/common/memory/PacketFactory.java index 9fbe30ce..a4227393 100644 --- a/mpush-common/src/main/java/com/mpush/common/memory/PacketFactory.java +++ b/mpush-common/src/main/java/com/mpush/common/memory/PacketFactory.java @@ -27,6 +27,8 @@ /** * Created by ohun on 16/10/22. * + * 包工厂 + * * @author ohun@live.cn (夜色) */ public interface PacketFactory { diff --git a/mpush-common/src/main/java/com/mpush/common/message/AckMessage.java b/mpush-common/src/main/java/com/mpush/common/message/AckMessage.java index 61f452aa..647c4eda 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/AckMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/AckMessage.java @@ -27,6 +27,8 @@ /** * Created by ohun on 16/9/5. * + * ack信息 + * * @author ohun@live.cn (夜色) */ public final class AckMessage extends BaseMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/BaseMessage.java b/mpush-common/src/main/java/com/mpush/common/message/BaseMessage.java index 368efbc4..e8873fa6 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/BaseMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/BaseMessage.java @@ -23,6 +23,7 @@ import com.mpush.api.connection.Connection; import com.mpush.api.message.Message; import com.mpush.api.protocol.Packet; +import com.mpush.api.utils.SnowflakeIdWorker; import com.mpush.tools.Jsons; import com.mpush.tools.common.IOUtils; import com.mpush.tools.common.Profiler; @@ -32,17 +33,18 @@ import java.net.InetSocketAddress; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.atomic.AtomicInteger; /** * Created by ohun on 2015/12/28. * + * 基本信息 + * * @author ohun@live.cn */ public abstract class BaseMessage implements Message { private static final byte STATUS_DECODED = 1; private static final byte STATUS_ENCODED = 2; - private static final AtomicInteger ID_SEQ = new AtomicInteger(); + private static final SnowflakeIdWorker snowflakeIdWorker = SnowflakeIdWorker.getInstance(); transient protected Packet packet; transient protected Connection connection; transient private byte status = 0; @@ -208,11 +210,11 @@ public void close() { send(ChannelFutureListener.CLOSE); } - protected static int genSessionId() { - return ID_SEQ.incrementAndGet(); + protected static long genSessionId() { + return snowflakeIdWorker.nextId(); } - public int getSessionId() { + public long getSessionId() { return packet.sessionId; } diff --git a/mpush-common/src/main/java/com/mpush/common/message/BindUserMessage.java b/mpush-common/src/main/java/com/mpush/common/message/BindUserMessage.java index aaa5df34..46644351 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/BindUserMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/BindUserMessage.java @@ -29,12 +29,17 @@ /** * Created by ohun on 2015/12/28. * + * 绑定用户信息 + * * @author ohun@live.cn */ public final class BindUserMessage extends ByteBufMessage { + // 用户id public String userId; + // 别名 + public String alias; + // 标签 public String tags; - public String data; public BindUserMessage(Connection connection) { super(new Packet(Command.BIND, genSessionId()), connection); @@ -47,14 +52,14 @@ public BindUserMessage(Packet message, Connection connection) { @Override public void decode(ByteBuf body) { userId = decodeString(body); - data = decodeString(body); + alias = decodeString(body); tags = decodeString(body); } @Override public void encode(ByteBuf body) { encodeString(body, userId); - encodeString(body, data); + encodeString(body, alias); encodeString(body, tags); } @@ -62,13 +67,13 @@ public void encode(ByteBuf body) { public void decodeJsonBody(Map body) { userId = (String) body.get("userId"); tags = (String) body.get("tags"); - data = (String) body.get("data"); + alias = (String) body.get("alias"); } @Override public String toString() { return "BindUserMessage{" + - "data='" + data + '\'' + + "alias='" + alias + '\'' + ", userId='" + userId + '\'' + ", tags='" + tags + '\'' + ", packet=" + packet + diff --git a/mpush-common/src/main/java/com/mpush/common/message/ByteBufMessage.java b/mpush-common/src/main/java/com/mpush/common/message/ByteBufMessage.java index d149ddf9..8cb6a3e5 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/ByteBufMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/ByteBufMessage.java @@ -74,6 +74,15 @@ public void encodeLong(ByteBuf body, long field) { body.writeLong(field); } + /** + * 编码,格式是`字段内容长度+字段内容`,一个字节表示字段内容长度,后面接着为字段内容 + * 如果字段为空,则长度为0,没有内容,一个字节表示字段内容长度,没有字段内容 + * 如果字段内容长度小于32767 ,则长度为字段内容长度,两个字节表示字段内容长度,后面接着为字段内容 + * 如果字段内容长度大于等于32767 ,则长度为字段内容长度,前6个字节表示字段内容长度,后面接着为字段内容 + * + * @param body + * @param field + */ public void encodeBytes(ByteBuf body, byte[] field) { if (field == null || field.length == 0) { body.writeShort(0); diff --git a/mpush-common/src/main/java/com/mpush/common/message/ErrorMessage.java b/mpush-common/src/main/java/com/mpush/common/message/ErrorMessage.java index 26bdda0c..52571e46 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/ErrorMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/ErrorMessage.java @@ -33,6 +33,8 @@ /** * Created by ohun on 2015/12/28. * + * 错误信息 + * * @author ohun@live.cn */ public final class ErrorMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/FastConnectMessage.java b/mpush-common/src/main/java/com/mpush/common/message/FastConnectMessage.java index b1cbf8b0..bec483ec 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/FastConnectMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/FastConnectMessage.java @@ -28,6 +28,8 @@ /** * Created by ohun on 2015/12/25. * + * 快速连接信息 + * * @author ohun@live.cn */ public final class FastConnectMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/FastConnectOkMessage.java b/mpush-common/src/main/java/com/mpush/common/message/FastConnectOkMessage.java index 85cb9e29..b52dfb6d 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/FastConnectOkMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/FastConnectOkMessage.java @@ -29,6 +29,8 @@ /** * Created by ohun on 2015/12/28. * + * 快速连接正常信息 + * * @author ohun@live.cn */ public final class FastConnectOkMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/HandshakeMessage.java b/mpush-common/src/main/java/com/mpush/common/message/HandshakeMessage.java index d1458685..39da7fbd 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/HandshakeMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/HandshakeMessage.java @@ -33,6 +33,8 @@ /** * Created by ohun on 2015/12/24. * + * 握手信息 + * * @author ohun@live.cn */ public final class HandshakeMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/HandshakeOkMessage.java b/mpush-common/src/main/java/com/mpush/common/message/HandshakeOkMessage.java index fe9ef9af..04c4204f 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/HandshakeOkMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/HandshakeOkMessage.java @@ -31,6 +31,8 @@ /** * Created by ohun on 2015/12/27. * + * 握手正常信息 + * * @author ohun@live.cn */ public final class HandshakeOkMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/HttpRequestMessage.java b/mpush-common/src/main/java/com/mpush/common/message/HttpRequestMessage.java index bd93b1a5..0dd2ab8d 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/HttpRequestMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/HttpRequestMessage.java @@ -30,6 +30,8 @@ /** * Created by ohun on 2016/2/15. * + * http请求信息 + * * @author ohun@live.cn */ public final class HttpRequestMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/HttpResponseMessage.java b/mpush-common/src/main/java/com/mpush/common/message/HttpResponseMessage.java index 6185b5b0..a9bb641e 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/HttpResponseMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/HttpResponseMessage.java @@ -33,6 +33,8 @@ /** * Created by ohun on 2016/2/15. * + * http响应信息 + * * @author ohun@live.cn */ public final class HttpResponseMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/KickUserMessage.java b/mpush-common/src/main/java/com/mpush/common/message/KickUserMessage.java index 3e4216e4..9f9027d6 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/KickUserMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/KickUserMessage.java @@ -33,6 +33,8 @@ /** * Created by ohun on 2015/12/29. * + * 剔除用户信息 + * * @author ohun@live.cn */ public class KickUserMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/OkMessage.java b/mpush-common/src/main/java/com/mpush/common/message/OkMessage.java index f3b4788a..75331f29 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/OkMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/OkMessage.java @@ -31,6 +31,8 @@ /** * Created by ohun on 2015/12/28. * + * 正常信息 + * * @author ohun@live.cn */ public final class OkMessage extends ByteBufMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/PushMessage.java b/mpush-common/src/main/java/com/mpush/common/message/PushMessage.java index 84daf0f9..df1f8852 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/PushMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/PushMessage.java @@ -26,7 +26,6 @@ import io.netty.channel.ChannelFutureListener; import java.util.Collections; -import java.util.HashMap; import java.util.Map; import static com.mpush.api.protocol.Command.PUSH; @@ -34,6 +33,8 @@ /** * Created by ohun on 2015/12/30. * + * 推送信息 + * * @author ohun@live.cn */ public final class PushMessage extends BaseMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayKickUserMessage.java b/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayKickUserMessage.java index ba620867..d3625ab9 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayKickUserMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayKickUserMessage.java @@ -31,6 +31,8 @@ /** * Created by ohun on 16/10/23. * + * 网关剔除用户信息 + * * @author ohun@live.cn (夜色) */ public final class GatewayKickUserMessage extends ByteBufMessage implements KickRemoteMsg { diff --git a/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayPushMessage.java b/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayPushMessage.java index eaa5b21b..a3cf199c 100644 --- a/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayPushMessage.java +++ b/mpush-common/src/main/java/com/mpush/common/message/gateway/GatewayPushMessage.java @@ -38,6 +38,8 @@ /** * Created by ohun on 2015/12/30. * + * 网关推送信息 + * * @author ohun@live.cn */ public final class GatewayPushMessage extends ByteBufMessage implements IPushMessage { diff --git a/mpush-common/src/main/java/com/mpush/common/net/HttpProxyDnsMappingManager.java b/mpush-common/src/main/java/com/mpush/common/net/HttpProxyDnsMappingManager.java index 0a6170a7..ba85cfe6 100644 --- a/mpush-common/src/main/java/com/mpush/common/net/HttpProxyDnsMappingManager.java +++ b/mpush-common/src/main/java/com/mpush/common/net/HttpProxyDnsMappingManager.java @@ -47,6 +47,9 @@ import static com.mpush.api.srd.ServiceNames.DNS_MAPPING; import static com.mpush.tools.Utils.checkHealth; +/** + * Http代理DNS映射管理器 + */ @Spi(order = 1) public class HttpProxyDnsMappingManager extends BaseService implements DnsMappingManager, Runnable, ServiceListener { private final Logger logger = LoggerFactory.getLogger(HttpProxyDnsMappingManager.class); diff --git a/mpush-common/src/main/java/com/mpush/common/push/GatewayPushResult.java b/mpush-common/src/main/java/com/mpush/common/push/GatewayPushResult.java index 8e921602..c08c04ff 100644 --- a/mpush-common/src/main/java/com/mpush/common/push/GatewayPushResult.java +++ b/mpush-common/src/main/java/com/mpush/common/push/GatewayPushResult.java @@ -25,6 +25,8 @@ /** * Created by ohun on 2016/12/29. * + * 网关推送结果 + * * @author ohun@live.cn (夜色) */ public final class GatewayPushResult { diff --git a/mpush-common/src/main/java/com/mpush/common/push/RedisBroadcastController.java b/mpush-common/src/main/java/com/mpush/common/push/RedisBroadcastController.java index af2a3bbe..e2bf8144 100644 --- a/mpush-common/src/main/java/com/mpush/common/push/RedisBroadcastController.java +++ b/mpush-common/src/main/java/com/mpush/common/push/RedisBroadcastController.java @@ -29,6 +29,9 @@ /** * Created by ohun on 16/10/25. * + * + * redis广播控制器 + * * @author ohun@live.cn (夜色) */ public final class RedisBroadcastController implements BroadcastController { diff --git a/mpush-common/src/main/java/com/mpush/common/qps/ExactFlowControl.java b/mpush-common/src/main/java/com/mpush/common/qps/ExactFlowControl.java index 314e01d8..14dbd372 100644 --- a/mpush-common/src/main/java/com/mpush/common/qps/ExactFlowControl.java +++ b/mpush-common/src/main/java/com/mpush/common/qps/ExactFlowControl.java @@ -28,6 +28,8 @@ /** * Created by ohun on 2016/12/23. * + * 精确流量控制 + * * @author ohun@live.cn (夜色) */ public final class ExactFlowControl implements FlowControl { diff --git a/mpush-common/src/main/java/com/mpush/common/qps/FastFlowControl.java b/mpush-common/src/main/java/com/mpush/common/qps/FastFlowControl.java index 33cf1342..29e33eff 100644 --- a/mpush-common/src/main/java/com/mpush/common/qps/FastFlowControl.java +++ b/mpush-common/src/main/java/com/mpush/common/qps/FastFlowControl.java @@ -24,6 +24,8 @@ /** * Created by ohun on 16/10/24. * + * 快速流量控制 + * * @author ohun@live.cn (夜色) */ public final class FastFlowControl implements FlowControl { diff --git a/mpush-common/src/main/java/com/mpush/common/qps/FlowControl.java b/mpush-common/src/main/java/com/mpush/common/qps/FlowControl.java index f8c9251b..0c3b00f8 100644 --- a/mpush-common/src/main/java/com/mpush/common/qps/FlowControl.java +++ b/mpush-common/src/main/java/com/mpush/common/qps/FlowControl.java @@ -22,6 +22,8 @@ /** * Created by ohun on 16/10/24. * + * 流量控制 + * * @author ohun@live.cn (夜色) */ public interface FlowControl { diff --git a/mpush-common/src/main/java/com/mpush/common/qps/GlobalFlowControl.java b/mpush-common/src/main/java/com/mpush/common/qps/GlobalFlowControl.java index cde61c06..1f322329 100644 --- a/mpush-common/src/main/java/com/mpush/common/qps/GlobalFlowControl.java +++ b/mpush-common/src/main/java/com/mpush/common/qps/GlobalFlowControl.java @@ -25,6 +25,8 @@ /** * Created by ohun on 16/10/24. * + * 全局流量控制 + * * @author ohun@live.cn (夜色) */ public final class GlobalFlowControl implements FlowControl { diff --git a/mpush-common/src/main/java/com/mpush/common/qps/OverFlowException.java b/mpush-common/src/main/java/com/mpush/common/qps/OverFlowException.java index 034edf38..a835e555 100644 --- a/mpush-common/src/main/java/com/mpush/common/qps/OverFlowException.java +++ b/mpush-common/src/main/java/com/mpush/common/qps/OverFlowException.java @@ -22,6 +22,8 @@ /** * Created by ohun on 16/10/24. * + * 超流量异常 + * * @author ohun@live.cn (夜色) */ public final class OverFlowException extends RuntimeException { diff --git a/mpush-common/src/main/java/com/mpush/common/qps/RedisFlowControl.java b/mpush-common/src/main/java/com/mpush/common/qps/RedisFlowControl.java index 2341cd75..e8bb17c2 100644 --- a/mpush-common/src/main/java/com/mpush/common/qps/RedisFlowControl.java +++ b/mpush-common/src/main/java/com/mpush/common/qps/RedisFlowControl.java @@ -27,6 +27,8 @@ /** * Created by ohun on 16/10/25. * + * redis流量控制 + * * @author ohun@live.cn (夜色) */ public final class RedisFlowControl implements FlowControl { diff --git a/mpush-common/src/main/java/com/mpush/common/router/CachedRemoteRouterManager.java b/mpush-common/src/main/java/com/mpush/common/router/CachedRemoteRouterManager.java index e1d1ed3e..a3ba7a70 100644 --- a/mpush-common/src/main/java/com/mpush/common/router/CachedRemoteRouterManager.java +++ b/mpush-common/src/main/java/com/mpush/common/router/CachedRemoteRouterManager.java @@ -28,6 +28,8 @@ /** * Created by ohun on 2016/1/4. * + * 缓存远程路由器管理器 + * * @author ohun@live.cn (夜色) */ public final class CachedRemoteRouterManager extends RemoteRouterManager { diff --git a/mpush-common/src/main/java/com/mpush/common/router/ClientType.java b/mpush-common/src/main/java/com/mpush/common/router/ClientType.java index d6755bc7..be0b279e 100644 --- a/mpush-common/src/main/java/com/mpush/common/router/ClientType.java +++ b/mpush-common/src/main/java/com/mpush/common/router/ClientType.java @@ -24,12 +24,18 @@ /** * Created by ohun on 16/8/18. * + * 客户端类型 + * * @author ohun@live.cn (夜色) */ public enum ClientType { + // 移动端 MOBILE(1, "android", "ios"), + // pc PC(2, "windows", "mac", "linux"), + // web WEB(3, "web", "h5"), + // 未知 UNKNOWN(-1); public final int type; diff --git a/mpush-common/src/main/java/com/mpush/common/router/DefaultClientClassifier.java b/mpush-common/src/main/java/com/mpush/common/router/DefaultClientClassifier.java index 07aaf8d9..58fc5bca 100644 --- a/mpush-common/src/main/java/com/mpush/common/router/DefaultClientClassifier.java +++ b/mpush-common/src/main/java/com/mpush/common/router/DefaultClientClassifier.java @@ -26,6 +26,8 @@ /** * Created by ohun on 16/10/26. * + * 默认客户端分类器 + * * @author ohun@live.cn (夜色) */ @Spi(order = 1) diff --git a/mpush-common/src/main/java/com/mpush/common/router/KickRemoteMsg.java b/mpush-common/src/main/java/com/mpush/common/router/KickRemoteMsg.java index 687ec0d5..981b7d19 100644 --- a/mpush-common/src/main/java/com/mpush/common/router/KickRemoteMsg.java +++ b/mpush-common/src/main/java/com/mpush/common/router/KickRemoteMsg.java @@ -19,13 +19,11 @@ package com.mpush.common.router; -import com.mpush.common.ServerNodes; -import com.mpush.tools.config.ConfigTools; - - /** * Created by ohun on 16/10/23. * + * 剔除远程信息 + * * @author ohun@live.cn (夜色) */ public interface KickRemoteMsg { diff --git a/mpush-common/src/main/java/com/mpush/common/router/MQKickRemoteMsg.java b/mpush-common/src/main/java/com/mpush/common/router/MQKickRemoteMsg.java index 3cea97f9..45b5c555 100644 --- a/mpush-common/src/main/java/com/mpush/common/router/MQKickRemoteMsg.java +++ b/mpush-common/src/main/java/com/mpush/common/router/MQKickRemoteMsg.java @@ -22,6 +22,8 @@ /** * Created by ohun on 16/10/23. * + * mq剔除远程信息 + * * @author ohun@live.cn (夜色) */ public class MQKickRemoteMsg implements KickRemoteMsg { diff --git a/mpush-common/src/main/java/com/mpush/common/router/RemoteRouter.java b/mpush-common/src/main/java/com/mpush/common/router/RemoteRouter.java index d3a0b1ac..fb539abb 100644 --- a/mpush-common/src/main/java/com/mpush/common/router/RemoteRouter.java +++ b/mpush-common/src/main/java/com/mpush/common/router/RemoteRouter.java @@ -25,6 +25,8 @@ /** * Created by ohun on 2015/12/23. * + * 远程路由器 + * * @author ohun@live.cn */ public final class RemoteRouter implements Router { diff --git a/mpush-common/src/main/java/com/mpush/common/router/RemoteRouterManager.java b/mpush-common/src/main/java/com/mpush/common/router/RemoteRouterManager.java index fae3d1a9..df6b767d 100644 --- a/mpush-common/src/main/java/com/mpush/common/router/RemoteRouterManager.java +++ b/mpush-common/src/main/java/com/mpush/common/router/RemoteRouterManager.java @@ -41,6 +41,8 @@ /** * Created by ohun on 2015/12/23. * + * 远程路由器管理器 + * * @author ohun@live.cn */ public class RemoteRouterManager extends EventConsumer implements RouterManager { @@ -48,6 +50,13 @@ public class RemoteRouterManager extends EventConsumer implements RouterManager< private final CacheManager cacheManager = CacheManagerFactory.create(); + /** + * 将信息缓存起来,以用户ID为key,目前只支持redis ,文件(磁盘)存储只是在单元测试使用,后续可以添加支持 + * + * @param userId 用户ID + * @param router 新路由 + * @return + */ @Override public RemoteRouter register(String userId, RemoteRouter router) { String key = CacheKeys.getUserRouteKey(userId); diff --git a/mpush-common/src/main/java/com/mpush/common/security/AesCipher.java b/mpush-common/src/main/java/com/mpush/common/security/AesCipher.java index 52c6e4b6..2c9467a1 100644 --- a/mpush-common/src/main/java/com/mpush/common/security/AesCipher.java +++ b/mpush-common/src/main/java/com/mpush/common/security/AesCipher.java @@ -31,6 +31,8 @@ /** * Created by ohun on 2015/12/28. * + * aes加密方式 + * * @author ohun@live.cn */ public final class AesCipher implements Cipher { diff --git a/mpush-common/src/main/java/com/mpush/common/security/CipherBox.java b/mpush-common/src/main/java/com/mpush/common/security/CipherBox.java index c471a5d5..5f98b32f 100644 --- a/mpush-common/src/main/java/com/mpush/common/security/CipherBox.java +++ b/mpush-common/src/main/java/com/mpush/common/security/CipherBox.java @@ -29,6 +29,8 @@ /** * Created by ohun on 2015/12/24. * + * 加密方式盒子 + * * @author ohun@live.cn */ public final class CipherBox { diff --git a/mpush-common/src/main/java/com/mpush/common/security/DefaultRsaCipherFactory.java b/mpush-common/src/main/java/com/mpush/common/security/DefaultRsaCipherFactory.java index 1161e950..eb1d5940 100644 --- a/mpush-common/src/main/java/com/mpush/common/security/DefaultRsaCipherFactory.java +++ b/mpush-common/src/main/java/com/mpush/common/security/DefaultRsaCipherFactory.java @@ -26,6 +26,8 @@ /** * Created by yxx on 2016/5/19. * + * 默认rsa加密方式工厂 + * * @author ohun@live.cn */ @Spi diff --git a/mpush-common/src/main/java/com/mpush/common/security/RsaCipher.java b/mpush-common/src/main/java/com/mpush/common/security/RsaCipher.java index 4acfa4b9..f3bd7af6 100644 --- a/mpush-common/src/main/java/com/mpush/common/security/RsaCipher.java +++ b/mpush-common/src/main/java/com/mpush/common/security/RsaCipher.java @@ -28,6 +28,8 @@ /** * Created by ohun on 2015/12/28. * + * rsa加密方式 + * * @author ohun@live.cn */ public final class RsaCipher implements Cipher { diff --git a/mpush-common/src/main/java/com/mpush/common/user/UserManager.java b/mpush-common/src/main/java/com/mpush/common/user/UserManager.java index e50ae918..56b0e2d3 100644 --- a/mpush-common/src/main/java/com/mpush/common/user/UserManager.java +++ b/mpush-common/src/main/java/com/mpush/common/user/UserManager.java @@ -26,7 +26,6 @@ import com.mpush.api.spi.common.MQClient; import com.mpush.api.spi.common.MQClientFactory; import com.mpush.common.CacheKeys; -import com.mpush.common.router.CachedRemoteRouterManager; import com.mpush.common.router.MQKickRemoteMsg; import com.mpush.common.router.RemoteRouter; import com.mpush.common.router.RemoteRouterManager; @@ -38,6 +37,7 @@ import java.util.Set; /** + * 用户管理器 * 在线列表是存在redis里的,服务被kill -9的时候,无法修改redis。 * 查询全部在线列表的时候,要通过当前ZK里可用的机器来循环查询。 * 每台机器的在线列表是分开存的,如果都存储在一起,某台机器挂了,反而不好处理。 @@ -45,6 +45,9 @@ public final class UserManager { private static final Logger LOGGER = LoggerFactory.getLogger(UserManager.class); + /** + * 在线用户列表key,缓存key + */ private final String onlineUserListKey = CacheKeys.getOnlineUserListKey(ConfigTools.getPublicIp()); private final CacheManager cacheManager = CacheManagerFactory.create(); @@ -57,10 +60,19 @@ public UserManager(RemoteRouterManager remoteRouterManager) { this.remoteRouterManager = remoteRouterManager; } + /** + * 剔除用户 + * @param userId + */ public void kickUser(String userId) { kickUser(userId, -1); } + /** + * 剔除用户 + * @param userId + * @param clientType + */ public void kickUser(String userId, int clientType) { Set remoteRouters = remoteRouterManager.lookupAll(userId); if (remoteRouters != null) { @@ -80,34 +92,58 @@ public void kickUser(String userId, int clientType) { } } + /** + * 清除在线用户列表 + */ public void clearOnlineUserList() { cacheManager.del(onlineUserListKey); } + /** + * 添加到在线列表 + * @param userId + */ public void addToOnlineList(String userId) { cacheManager.zAdd(onlineUserListKey, userId); LOGGER.info("user online {}", userId); } + /** + * 从在线列表删除 + * @param userId + */ public void remFormOnlineList(String userId) { cacheManager.zRem(onlineUserListKey, userId); LOGGER.info("user offline {}", userId); } - //在线用户数量 + /** + * 在线用户数量 + * @return + */ public long getOnlineUserNum() { Long value = cacheManager.zCard(onlineUserListKey); return value == null ? 0 : value; } - //在线用户数量 + /** + * 在线用户数量 + * @param publicIP + * @return + */ public long getOnlineUserNum(String publicIP) { String online_key = CacheKeys.getOnlineUserListKey(publicIP); Long value = cacheManager.zCard(online_key); return value == null ? 0 : value; } - //在线用户列表 + /** + * 在线用户列表 + * @param publicIP + * @param start + * @param end + * @return + */ public List getOnlineUserList(String publicIP, int start, int end) { String key = CacheKeys.getOnlineUserListKey(publicIP); return cacheManager.zrange(key, start, end, String.class); diff --git a/mpush-core/pom.xml b/mpush-core/pom.xml index 6667c31c..c469abb8 100644 --- a/mpush-core/pom.xml +++ b/mpush-core/pom.xml @@ -8,7 +8,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml @@ -31,5 +31,9 @@ ${project.groupId} mpush-monitor + + ${project.groupId} + mpush-api + diff --git a/mpush-core/src/main/java/com/mpush/core/MPushServer.java b/mpush-core/src/main/java/com/mpush/core/MPushServer.java index c8ba1f49..a80af6a7 100644 --- a/mpush-core/src/main/java/com/mpush/core/MPushServer.java +++ b/mpush-core/src/main/java/com/mpush/core/MPushServer.java @@ -20,14 +20,11 @@ package com.mpush.core; import com.mpush.api.MPushContext; -import com.mpush.api.common.Monitor; import com.mpush.api.spi.common.*; import com.mpush.api.srd.ServiceDiscovery; import com.mpush.api.srd.ServiceNode; import com.mpush.api.srd.ServiceRegistry; import com.mpush.common.ServerNodes; -import com.mpush.common.user.UserManager; -import com.mpush.core.ack.AckTaskQueue; import com.mpush.core.push.PushCenter; import com.mpush.core.router.RouterCenter; import com.mpush.core.server.*; @@ -36,13 +33,14 @@ import com.mpush.netty.http.HttpClient; import com.mpush.netty.http.NettyHttpClient; import com.mpush.tools.event.EventBus; -import com.mpush.monitor.service.ThreadPoolManager; import static com.mpush.tools.config.CC.mp.net.tcpGateway; /** * Created by ohun on 2017/6/14. * + * MPush服务器 + * * @author ohun@live.cn (夜色) */ public final class MPushServer implements MPushContext { diff --git a/mpush-core/src/main/java/com/mpush/core/ServerExecutorFactory.java b/mpush-core/src/main/java/com/mpush/core/ServerExecutorFactory.java index 192b55cb..c79c2e6a 100644 --- a/mpush-core/src/main/java/com/mpush/core/ServerExecutorFactory.java +++ b/mpush-core/src/main/java/com/mpush/core/ServerExecutorFactory.java @@ -36,6 +36,7 @@ import static com.mpush.tools.thread.ThreadNames.*; /** + * 服务器执行工厂 * 此线程池可伸缩,线程空闲一定时间后回收,新请求重新创建线程 */ @Spi(order = 1) diff --git a/mpush-core/src/main/java/com/mpush/core/ack/AckCallback.java b/mpush-core/src/main/java/com/mpush/core/ack/AckCallback.java index b8e2ca6e..731553c1 100644 --- a/mpush-core/src/main/java/com/mpush/core/ack/AckCallback.java +++ b/mpush-core/src/main/java/com/mpush/core/ack/AckCallback.java @@ -22,10 +22,13 @@ /** * Created by ohun on 16/9/6. * + * 确认回调 + * * @author ohun@live.cn (夜色) */ public interface AckCallback { + // 成功 void onSuccess(AckTask context); - + // 超时 void onTimeout(AckTask context); } diff --git a/mpush-core/src/main/java/com/mpush/core/ack/AckTask.java b/mpush-core/src/main/java/com/mpush/core/ack/AckTask.java index 2ad96ff4..5dfd792c 100644 --- a/mpush-core/src/main/java/com/mpush/core/ack/AckTask.java +++ b/mpush-core/src/main/java/com/mpush/core/ack/AckTask.java @@ -24,19 +24,21 @@ /** * Created by ohun on 16/9/5. * + * 确认任务 + * * @author ohun@live.cn (夜色) */ public final class AckTask implements Runnable { - private final int ackMessageId; + private final long ackMessageId; private AckTaskQueue ackTaskQueue; private AckCallback callback; private Future timeoutFuture; - public AckTask(int ackMessageId) { + public AckTask(long ackMessageId) { this.ackMessageId = ackMessageId; } - public static AckTask from(int ackMessageId) { + public static AckTask from(long ackMessageId) { return new AckTask(ackMessageId); } @@ -54,11 +56,10 @@ public AckTask setCallback(AckCallback callback) { return this; } - public int getAckMessageId() { + public long getAckMessageId() { return ackMessageId; } - private boolean tryDone() { return timeoutFuture.cancel(true); } @@ -81,7 +82,7 @@ public void onTimeout() { @Override public String toString() { return "{" + - ", ackMessageId=" + ackMessageId + + "ackMessageId=" + ackMessageId + '}'; } diff --git a/mpush-core/src/main/java/com/mpush/core/ack/AckTaskQueue.java b/mpush-core/src/main/java/com/mpush/core/ack/AckTaskQueue.java index a8fdc837..8a822061 100644 --- a/mpush-core/src/main/java/com/mpush/core/ack/AckTaskQueue.java +++ b/mpush-core/src/main/java/com/mpush/core/ack/AckTaskQueue.java @@ -33,6 +33,8 @@ /** * Created by ohun on 16/9/5. * + * 确认任务队列 + * * @author ohun@live.cn (夜色) */ public final class AckTaskQueue extends BaseService { @@ -40,7 +42,7 @@ public final class AckTaskQueue extends BaseService { private final Logger logger = LoggerFactory.getLogger(AckTaskQueue.class); - private final ConcurrentMap queue = new ConcurrentHashMap<>(); + private final ConcurrentMap queue = new ConcurrentHashMap<>(); private ScheduledExecutorService scheduledExecutor; private MPushServer mPushServer; @@ -59,7 +61,7 @@ public void add(AckTask task, int timeout) { logger.debug("one ack task add to queue, task={}, timeout={}", task, timeout); } - public AckTask getAndRemove(int sessionId) { + public AckTask getAndRemove(long sessionId) { return queue.remove(sessionId); } diff --git a/mpush-core/src/main/java/com/mpush/core/handler/AckHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/AckHandler.java index 3f9fb916..6418c30b 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/AckHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/AckHandler.java @@ -31,6 +31,8 @@ /** * Created by ohun on 16/9/5. * + * 确认处理器 + * * @author ohun@live.cn (夜色) */ public final class AckHandler extends BaseMessageHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/AdminHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/AdminHandler.java index 5d14833c..71bb360f 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/AdminHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/AdminHandler.java @@ -37,6 +37,9 @@ import java.time.temporal.ChronoUnit; import java.util.*; +/** + * 管理员处理器 + */ @ChannelHandler.Sharable public final class AdminHandler extends SimpleChannelInboundHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/BindUserHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/BindUserHandler.java index 6b90470a..f9089bc4 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/BindUserHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/BindUserHandler.java @@ -27,8 +27,11 @@ import com.mpush.api.protocol.Command; import com.mpush.api.protocol.Packet; import com.mpush.api.spi.Spi; +import com.mpush.api.spi.common.CacheManager; +import com.mpush.api.spi.common.CacheManagerFactory; import com.mpush.api.spi.handler.BindValidator; import com.mpush.api.spi.handler.BindValidatorFactory; +import com.mpush.common.CacheKeys; import com.mpush.common.handler.BaseMessageHandler; import com.mpush.common.message.BindUserMessage; import com.mpush.common.message.ErrorMessage; @@ -39,12 +42,15 @@ import com.mpush.core.router.LocalRouter; import com.mpush.core.router.LocalRouterManager; import com.mpush.core.router.RouterCenter; +import com.mpush.tools.StringUtil; import com.mpush.tools.event.EventBus; import com.mpush.tools.log.Logs; /** * Created by ohun on 2015/12/23. * + * 绑定用户处理器 + * * @author ohun@live.cn */ public final class BindUserHandler extends BaseMessageHandler { @@ -65,18 +71,41 @@ public BindUserMessage decode(Packet packet, Connection connection) { @Override public void handle(BindUserMessage message) { if (message.getPacket().cmd == Command.BIND.cmd) { + // 绑定 bind(message); } else { + // 解绑 unbind(message); } } + /** + * 绑定 + * @param message + */ private void bind(BindUserMessage message) { if (Strings.isNullOrEmpty(message.userId)) { ErrorMessage.from(message).setReason("invalid param").close(); Logs.CONN.error("bind user failure for invalid param, conn={}", message.getConnection()); return; } + String error = "invalid param:"; + int errorInitLen = error.length(); + if(!StringUtil.verifyUserId(message.userId)){ + error = error + " userId"; + } + if(message.tags!=null && !StringUtil.verifyTags(message.tags)){ + error = error + " tags"; + } + if(message.alias != null && !StringUtil.verifyAlias(message.alias)){ + error = error + " alias"; + } + if(error.length() > errorInitLen){ + ErrorMessage.from(message).setReason(error).close(); + Logs.CONN.error("bind user failure for invalid param, conn={}", message.getConnection()); + return; + } + //1.绑定用户时先看下是否握手成功 SessionContext context = message.getConnection().getSessionContext(); if (context.handshakeOk()) { @@ -84,6 +113,7 @@ private void bind(BindUserMessage message) { if (context.userId != null) { if (message.userId.equals(context.userId)) { context.tags = message.tags; + context.alias = message.alias; OkMessage.from(message).setData("bind success").sendRaw(); Logs.CONN.info("rebind user success, userId={}, session={}", message.userId, context); return; @@ -93,7 +123,7 @@ private void bind(BindUserMessage message) { } //验证用户身份 - boolean success = bindValidator.validate(message.userId, message.data); + boolean success = bindValidator.validate(message.userId, message.alias); if (success) { //2.如果握手成功,就把用户链接信息注册到路由中心,本地和远程各一份 success = routerCenter.register(message.userId, message.getConnection()); @@ -102,9 +132,11 @@ private void bind(BindUserMessage message) { if (success) { context.userId = message.userId; context.tags = message.tags; + context.alias = message.alias; EventBus.post(new UserOnlineEvent(message.getConnection(), message.userId)); OkMessage.from(message).setData("bind success").sendRaw(); Logs.CONN.info("bind user success, userId={}, session={}", message.userId, context); + } else { //3.注册失败再处理下,防止本地注册成功,远程注册失败的情况,只有都成功了才叫成功 routerCenter.unRegister(message.userId, context.getClientType()); @@ -118,6 +150,7 @@ private void bind(BindUserMessage message) { } /** + * 解绑 * 目前是以用户维度来存储路由信息的,所以在删除路由信息时要判断下是否是同一个设备 * 后续可以修改为按设备来存储路由信息。 * @@ -140,7 +173,8 @@ private void unbind(BindUserMessage message) { RemoteRouter remoteRouter = remoteRouterManager.lookup(userId, clientType); if (remoteRouter != null) { String deviceId = remoteRouter.getRouteValue().getDeviceId(); - if (context.deviceId.equals(deviceId)) {//判断是否是同一个设备 + if (context.deviceId.equals(deviceId)) { + //判断是否是同一个设备 unRegisterSuccess = remoteRouterManager.unRegister(userId, clientType); } } @@ -149,7 +183,8 @@ private void unbind(BindUserMessage message) { LocalRouter localRouter = localRouterManager.lookup(userId, clientType); if (localRouter != null) { String deviceId = localRouter.getRouteValue().getSessionContext().deviceId; - if (context.deviceId.equals(deviceId)) {//判断是否是同一个设备 + if (context.deviceId.equals(deviceId)) { + //判断是否是同一个设备 unRegisterSuccess = localRouterManager.unRegister(userId, clientType) && unRegisterSuccess; } } @@ -158,6 +193,7 @@ private void unbind(BindUserMessage message) { if (unRegisterSuccess) { context.userId = null; context.tags = null; + context.alias = null; EventBus.post(new UserOfflineEvent(message.getConnection(), userId)); OkMessage.from(message).setData("unbind success").sendRaw(); Logs.CONN.info("unbind user success, userId={}, session={}", userId, context); @@ -171,10 +207,23 @@ private void unbind(BindUserMessage message) { } } - + /** + * 默认绑定验证器 + */ @Spi(order = 1) public static class DefaultBindValidatorFactory implements BindValidatorFactory { - private final BindValidator validator = (userId, data) -> true; + private final CacheManager cacheManager = CacheManagerFactory.create(); + private final BindValidator validator = new BindValidator() { + @Override + public boolean validate(String userId, String alias) { + String cachedAliasUserId = cacheManager.hget(CacheKeys.ALIAS_INFO_KEY, alias, String.class); + if(cachedAliasUserId!=null && !cachedAliasUserId.equals(userId)){ + // 该别名已存在且用户id不相等,设置失败 + return false; + } + return true; + } + }; @Override public BindValidator get() { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/ClientPushHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/ClientPushHandler.java index bd73c315..dab31691 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/ClientPushHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/ClientPushHandler.java @@ -33,6 +33,8 @@ /** * Created by ohun on 2015/12/30. * + * 客户端推送处理器 + * * @author ohun@live.cn (夜色) */ @Spi(order = 1) diff --git a/mpush-core/src/main/java/com/mpush/core/handler/FastConnectHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/FastConnectHandler.java index 6942f03f..23fbbf30 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/FastConnectHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/FastConnectHandler.java @@ -21,7 +21,6 @@ import com.mpush.api.connection.Connection; import com.mpush.api.protocol.Packet; -import com.mpush.common.ErrorCode; import com.mpush.common.handler.BaseMessageHandler; import com.mpush.common.message.ErrorMessage; import com.mpush.common.message.FastConnectMessage; @@ -39,6 +38,8 @@ /** * Created by ohun on 2015/12/25. * + * 快速连接处理器 + * * @author ohun@live.cn */ public final class FastConnectHandler extends BaseMessageHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/GatewayKickUserHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/GatewayKickUserHandler.java index 4ecb03b8..859faefa 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/GatewayKickUserHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/GatewayKickUserHandler.java @@ -24,11 +24,12 @@ import com.mpush.common.handler.BaseMessageHandler; import com.mpush.common.message.gateway.GatewayKickUserMessage; import com.mpush.core.router.RouterCenter; -import com.mpush.core.router.RouterChangeListener; /** * Created by ohun on 16/10/23. * + * 网关剔除用户处理器 + * * @author ohun@live.cn (夜色) */ public final class GatewayKickUserHandler extends BaseMessageHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/GatewayPushHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/GatewayPushHandler.java index 03cd2297..d5722f90 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/GatewayPushHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/GatewayPushHandler.java @@ -28,6 +28,8 @@ /** * Created by ohun on 2015/12/30. * + * 网关推送处理器 + * * @author ohun@live.cn */ public final class GatewayPushHandler extends BaseMessageHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/HandshakeHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/HandshakeHandler.java index 1fdcbc97..0621c507 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/HandshakeHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/HandshakeHandler.java @@ -34,14 +34,14 @@ import com.mpush.core.session.ReusableSessionManager; import com.mpush.tools.config.ConfigTools; import com.mpush.tools.log.Logs; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelFutureListener; import static com.mpush.common.ErrorCode.REPEAT_HANDSHAKE; /** * Created by ohun on 2015/12/24. * + * 握手处理器 + * * @author ohun@live.cn */ public final class HandshakeHandler extends BaseMessageHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/HeartBeatHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/HeartBeatHandler.java index 2b96b159..64290849 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/HeartBeatHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/HeartBeatHandler.java @@ -27,6 +27,8 @@ /** * Created by ohun on 2015/12/22. * + * 心跳处理器 + * * @author ohun@live.cn */ public final class HeartBeatHandler implements MessageHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/handler/HttpProxyHandler.java b/mpush-core/src/main/java/com/mpush/core/handler/HttpProxyHandler.java index 9fde581d..c7728e96 100644 --- a/mpush-core/src/main/java/com/mpush/core/handler/HttpProxyHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/handler/HttpProxyHandler.java @@ -50,6 +50,8 @@ /** * Created by ohun on 2016/2/15. * + * http代理处理器 + * * @author ohun@live.cn */ public class HttpProxyHandler extends BaseMessageHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/mq/MQClient.java b/mpush-core/src/main/java/com/mpush/core/mq/MQClient.java index d1e62626..5745deb8 100644 --- a/mpush-core/src/main/java/com/mpush/core/mq/MQClient.java +++ b/mpush-core/src/main/java/com/mpush/core/mq/MQClient.java @@ -25,6 +25,8 @@ /** * Created by ohun on 2016/12/26. * + * mq客户端 + * * @author ohun@live.cn (夜色) */ public final class MQClient { diff --git a/mpush-core/src/main/java/com/mpush/core/mq/MQMessageReceiver.java b/mpush-core/src/main/java/com/mpush/core/mq/MQMessageReceiver.java index e2721d0c..9830009d 100644 --- a/mpush-core/src/main/java/com/mpush/core/mq/MQMessageReceiver.java +++ b/mpush-core/src/main/java/com/mpush/core/mq/MQMessageReceiver.java @@ -22,13 +22,14 @@ import com.mpush.core.push.PushCenter; import com.mpush.tools.Utils; import com.mpush.tools.config.ConfigTools; -import com.mpush.monitor.service.ThreadPoolManager; import java.util.Collection; /** * Created by ohun on 2016/12/24. * + * mq信息接收器 + * * @author ohun@live.cn (夜色) */ public final class MQMessageReceiver { diff --git a/mpush-core/src/main/java/com/mpush/core/mq/MQPushListener.java b/mpush-core/src/main/java/com/mpush/core/mq/MQPushListener.java index 27f76c28..b97eb5cd 100644 --- a/mpush-core/src/main/java/com/mpush/core/mq/MQPushListener.java +++ b/mpush-core/src/main/java/com/mpush/core/mq/MQPushListener.java @@ -28,6 +28,8 @@ /** * Created by ohun on 2016/12/24. * + * mq推送监听器 + * * @author ohun@live.cn (夜色) */ @Spi(order = 2) diff --git a/mpush-core/src/main/java/com/mpush/core/mq/MQPushMessage.java b/mpush-core/src/main/java/com/mpush/core/mq/MQPushMessage.java index 86c0654b..48b8ce1c 100644 --- a/mpush-core/src/main/java/com/mpush/core/mq/MQPushMessage.java +++ b/mpush-core/src/main/java/com/mpush/core/mq/MQPushMessage.java @@ -25,6 +25,8 @@ /** * Created by ohun on 2016/12/24. * + * mq推送信息 + * * @author ohun@live.cn (夜色) */ public final class MQPushMessage implements IPushMessage { diff --git a/mpush-core/src/main/java/com/mpush/core/push/BroadcastPushTask.java b/mpush-core/src/main/java/com/mpush/core/push/BroadcastPushTask.java index 3d38a5b5..e0b6f890 100644 --- a/mpush-core/src/main/java/com/mpush/core/push/BroadcastPushTask.java +++ b/mpush-core/src/main/java/com/mpush/core/push/BroadcastPushTask.java @@ -19,6 +19,7 @@ package com.mpush.core.push; +import com.google.common.collect.Sets; import com.mpush.api.message.Message; import com.mpush.api.common.Condition; import com.mpush.api.connection.Connection; @@ -41,6 +42,8 @@ /** * Created by ohun on 16/10/24. * + * 广播推送任务,推送本地所有用户 + * * @author ohun@live.cn (夜色) */ public final class BroadcastPushTask implements PushTask { @@ -51,7 +54,7 @@ public final class BroadcastPushTask implements PushTask { private final TimeLine timeLine = new TimeLine(); - private final Set successUserIds = new HashSet<>(1024); + private final Set successUserIds = Sets.newConcurrentHashSet(); private final FlowControl flowControl; diff --git a/mpush-core/src/main/java/com/mpush/core/push/GatewayPushListener.java b/mpush-core/src/main/java/com/mpush/core/push/GatewayPushListener.java index cca2c421..5b08a985 100644 --- a/mpush-core/src/main/java/com/mpush/core/push/GatewayPushListener.java +++ b/mpush-core/src/main/java/com/mpush/core/push/GatewayPushListener.java @@ -38,6 +38,8 @@ /** * Created by ohun on 2016/12/24. * + * 网关推送监听器 + * * @author ohun@live.cn (夜色) */ @Spi(order = 1) diff --git a/mpush-core/src/main/java/com/mpush/core/push/PushAckCallback.java b/mpush-core/src/main/java/com/mpush/core/push/PushAckCallback.java index 337dbd97..050b0ef5 100644 --- a/mpush-core/src/main/java/com/mpush/core/push/PushAckCallback.java +++ b/mpush-core/src/main/java/com/mpush/core/push/PushAckCallback.java @@ -6,6 +6,9 @@ import com.mpush.tools.common.TimeLine; import com.mpush.tools.log.Logs; +/** + * 推送确认回调 + */ public final class PushAckCallback implements AckCallback { private final IPushMessage message; private final TimeLine timeLine; diff --git a/mpush-core/src/main/java/com/mpush/core/push/PushCenter.java b/mpush-core/src/main/java/com/mpush/core/push/PushCenter.java index ee81b205..c8620a9e 100644 --- a/mpush-core/src/main/java/com/mpush/core/push/PushCenter.java +++ b/mpush-core/src/main/java/com/mpush/core/push/PushCenter.java @@ -44,6 +44,8 @@ /** * Created by ohun on 16/10/24. * + * 推送中心器 + * * @author ohun@live.cn (夜色) */ public final class PushCenter extends BaseService implements MessagePusher { diff --git a/mpush-core/src/main/java/com/mpush/core/push/PushTask.java b/mpush-core/src/main/java/com/mpush/core/push/PushTask.java index b63b0cfe..e1bf9ad9 100644 --- a/mpush-core/src/main/java/com/mpush/core/push/PushTask.java +++ b/mpush-core/src/main/java/com/mpush/core/push/PushTask.java @@ -24,6 +24,8 @@ /** * Created by ohun on 16/10/24. * + * 推送任务 + * * @author ohun@live.cn (夜色) */ public interface PushTask extends Runnable { diff --git a/mpush-core/src/main/java/com/mpush/core/push/SingleUserPushTask.java b/mpush-core/src/main/java/com/mpush/core/push/SingleUserPushTask.java index 938e6c4b..d38dfbd9 100644 --- a/mpush-core/src/main/java/com/mpush/core/push/SingleUserPushTask.java +++ b/mpush-core/src/main/java/com/mpush/core/push/SingleUserPushTask.java @@ -39,6 +39,8 @@ /** * Created by ohun on 16/10/24. * + * 单用户推送任务 + * * @author ohun@live.cn (夜色) */ public final class SingleUserPushTask implements PushTask, ChannelFutureListener { @@ -47,7 +49,7 @@ public final class SingleUserPushTask implements PushTask, ChannelFutureListener private final IPushMessage message; - private int messageId; + private long messageId; private long start; @@ -201,6 +203,11 @@ private void checkRemote(IPushMessage message) { } + /** + * 操作完成 + * @param future + * @throws Exception + */ @Override public void operationComplete(ChannelFuture future) throws Exception { if (checkTimeout()) return; @@ -229,7 +236,7 @@ public void operationComplete(ChannelFuture future) throws Exception { * * @param messageId 下发到客户端待ack的消息的sessionId */ - private void addAckTask(int messageId) { + private void addAckTask(long messageId) { timeLine.addTimePoint("waiting-ack"); //因为要进队列,可以提前释放一些比较占用内存的字段,便于垃圾回收 diff --git a/mpush-core/src/main/java/com/mpush/core/router/LocalRouter.java b/mpush-core/src/main/java/com/mpush/core/router/LocalRouter.java index 165cd5ac..9ad95c33 100644 --- a/mpush-core/src/main/java/com/mpush/core/router/LocalRouter.java +++ b/mpush-core/src/main/java/com/mpush/core/router/LocalRouter.java @@ -25,6 +25,8 @@ /** * Created by ohun on 2015/12/23. * + * 本地路由器 + * * @author ohun@live.cn */ public final class LocalRouter implements Router { diff --git a/mpush-core/src/main/java/com/mpush/core/router/LocalRouterManager.java b/mpush-core/src/main/java/com/mpush/core/router/LocalRouterManager.java index 2d6fe315..e88a20f5 100644 --- a/mpush-core/src/main/java/com/mpush/core/router/LocalRouterManager.java +++ b/mpush-core/src/main/java/com/mpush/core/router/LocalRouterManager.java @@ -40,6 +40,8 @@ /** * Created by ohun on 2015/12/23. * + * 本地路由器管理器 + * * @author ohun@live.cn */ public final class LocalRouterManager extends EventConsumer implements RouterManager { @@ -47,7 +49,7 @@ public final class LocalRouterManager extends EventConsumer implements RouterMan private static final Map EMPTY = new HashMap<>(0); /** - * 本地路由表 + * 本地路由表 存放在内存中 */ private final Map> routers = new ConcurrentHashMap<>(); diff --git a/mpush-core/src/main/java/com/mpush/core/router/RouterCenter.java b/mpush-core/src/main/java/com/mpush/core/router/RouterCenter.java index 04c1ff55..bdebbd4f 100644 --- a/mpush-core/src/main/java/com/mpush/core/router/RouterCenter.java +++ b/mpush-core/src/main/java/com/mpush/core/router/RouterCenter.java @@ -35,14 +35,20 @@ /** * Created by ohun on 2015/12/23. * + * 路由器中心器,用于管理需要推送设备的路由信息 + * * @author ohun@live.cn */ public final class RouterCenter extends BaseService { private static final Logger LOGGER = LoggerFactory.getLogger(RouterCenter.class); + // 本地路由管理器 private LocalRouterManager localRouterManager; + // 远程路由管理器 private RemoteRouterManager remoteRouterManager; + // 用户时间消费者 private UserEventConsumer userEventConsumer; + // 路由变化监听器 private RouterChangeListener routerChangeListener; private MPushServer mPushServer; @@ -109,6 +115,12 @@ public boolean unRegister(String userId, int clientType) { return true; } + /** + * 根据用户id和客户端类型查找路由 + * @param userId + * @param clientType + * @return + */ public Router lookup(String userId, int clientType) { LocalRouter local = localRouterManager.lookup(userId, clientType); if (local != null) return local; diff --git a/mpush-core/src/main/java/com/mpush/core/router/RouterChangeListener.java b/mpush-core/src/main/java/com/mpush/core/router/RouterChangeListener.java index 6e382444..34af3e9f 100644 --- a/mpush-core/src/main/java/com/mpush/core/router/RouterChangeListener.java +++ b/mpush-core/src/main/java/com/mpush/core/router/RouterChangeListener.java @@ -50,6 +50,8 @@ /** * Created by ohun on 2016/1/4. * + * 路由器变化监听器 + * * @author ohun@live.cn */ public final class RouterChangeListener extends EventConsumer implements MQMessageReceiver { diff --git a/mpush-core/src/main/java/com/mpush/core/router/UserEventConsumer.java b/mpush-core/src/main/java/com/mpush/core/router/UserEventConsumer.java index af915f83..580d10ff 100644 --- a/mpush-core/src/main/java/com/mpush/core/router/UserEventConsumer.java +++ b/mpush-core/src/main/java/com/mpush/core/router/UserEventConsumer.java @@ -21,13 +21,27 @@ import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.Subscribe; +import com.mpush.api.Constants; +import com.mpush.api.connection.SessionContext; import com.mpush.api.event.UserOfflineEvent; import com.mpush.api.event.UserOnlineEvent; +import com.mpush.api.spi.common.CacheManager; +import com.mpush.api.spi.common.CacheManagerFactory; import com.mpush.api.spi.common.MQClient; import com.mpush.api.spi.common.MQClientFactory; +import com.mpush.api.utils.ArrayUtil; +import com.mpush.api.utils.SetUtil; +import com.mpush.common.CacheKeys; +import com.mpush.common.message.PushMessage; import com.mpush.common.router.RemoteRouterManager; import com.mpush.common.user.UserManager; +import com.mpush.tools.Jsons; import com.mpush.tools.event.EventConsumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashSet; +import java.util.Set; import static com.mpush.api.event.Topics.OFFLINE_CHANNEL; import static com.mpush.api.event.Topics.ONLINE_CHANNEL; @@ -35,30 +49,175 @@ /** * Created by ohun on 2015/12/23. * + * 用户事件消费者 + * * @author ohun@live.cn */ public final class UserEventConsumer extends EventConsumer { + private static final Logger LOGGER = LoggerFactory.getLogger(UserEventConsumer.class); private final MQClient mqClient = MQClientFactory.create(); private final UserManager userManager; + private final CacheManager cacheManager; + public UserEventConsumer(RemoteRouterManager remoteRouterManager) { this.userManager = new UserManager(remoteRouterManager); + this.cacheManager = CacheManagerFactory.create(); } + /** + * 在线事件处理 + * @param event + */ @Subscribe @AllowConcurrentEvents void on(UserOnlineEvent event) { + // 添加到本地在线列表 userManager.addToOnlineList(event.getUserId()); + // 广播用户上线 mqClient.publish(ONLINE_CHANNEL, event.getUserId()); + + // 保存用户id、别名、标签、登录设备信息 + saveUserInfo(event.getConnection().getSessionContext()); + + // 将离线信息推送给用户 + sendOfflineMsg(event); } + /** + * 保存用户id、别名、标签、登录设备信息 + * @param sessionContext + */ + void saveUserInfo(SessionContext sessionContext){ + LOGGER.info("sessionContext:"+ Jsons.toJson(sessionContext)); + String userId = sessionContext.userId; + String alias = sessionContext.alias; + String tags = sessionContext.tags; + + String deviceId = sessionContext.deviceId; + String osName = sessionContext.osName; + String osVersion = sessionContext.osVersion; + + String deviceInfo = deviceId+","+osName+","+osVersion; + + String key = CacheKeys.getUserInfoKey(userId); + + String cachedAliasUserId = cacheManager.hget(CacheKeys.ALIAS_INFO_KEY, alias, String.class); + if(cachedAliasUserId!=null && !cachedAliasUserId.equals(userId)){ + // 该别名已存在且用户id不相等,设置失败 + }else{ + cacheManager.hset(key, CacheKeys.USER_INFO_FIELD_ALIAS, alias); + cacheManager.hset(CacheKeys.ALIAS_INFO_KEY, alias, userId); + + LOGGER.info("save alias key:{} field:{} value:{}", key, CacheKeys.USER_INFO_FIELD_ALIAS, alias); + LOGGER.info("save alias key:{} field:{} value:{}", CacheKeys.ALIAS_INFO_KEY, alias, userId); + } + + String oldTags = cacheManager.hget(key, CacheKeys.USER_INFO_FIELD_TAGS, String.class); + if(oldTags==null + || (oldTags!=null && !oldTags.equals(tags))){ + cacheManager.hset(key, CacheKeys.USER_INFO_FIELD_TAGS, tags); + + LOGGER.info("save tags key:{} field:{} value:{}", key, CacheKeys.USER_INFO_FIELD_TAGS, tags); + } + + Set oldTagsSet = oldTags!=null ? SetUtil.toSet(oldTags) : new HashSet<>(); + Set newTagsSet = tags!=null ? SetUtil.toSet(tags) : new HashSet<>(); + // 交集 + Set retainTagsSet = new HashSet<>(); + retainTagsSet.addAll(oldTagsSet); + retainTagsSet.retainAll(newTagsSet); + // 差集 + oldTagsSet.removeAll(retainTagsSet); + // 差集 + newTagsSet.removeAll(retainTagsSet); + if(oldTagsSet!=null && !oldTagsSet.isEmpty()){ + // 从旧标签删除本用户id + for(String tag : oldTagsSet){ + String[] cachedTagsUserId = cacheManager.hget(CacheKeys.TAGS_INFO_KEY, tag, String[].class); + cachedTagsUserId = ArrayUtil.removeArr(cachedTagsUserId, userId); + cacheManager.hset(CacheKeys.TAGS_INFO_KEY, tag, cachedTagsUserId); + + LOGGER.info("save tags key:{} field:{} value:{}" , CacheKeys.TAGS_INFO_KEY, tag, Jsons.toJson(cachedTagsUserId)); + } + } + if(newTagsSet!=null && !newTagsSet.isEmpty()){ + // 将本用户id添加到新标签 + for(String tag : newTagsSet){ + String[] cachedTagsUserId = cacheManager.hget(CacheKeys.TAGS_INFO_KEY, tag, String[].class); + cachedTagsUserId = ArrayUtil.addArr(cachedTagsUserId, userId); + cacheManager.hset(CacheKeys.TAGS_INFO_KEY, tag, cachedTagsUserId); + + LOGGER.info("save tags key:{} field:{} value:{}", CacheKeys.TAGS_INFO_KEY, tag, Jsons.toJson(cachedTagsUserId)); + } + } + retainTagsSet = null; + oldTagsSet = null; + newTagsSet = null; + + String[] devices = cacheManager.hget(key, CacheKeys.USER_INFO_FIELD_DEVICES, String[].class); + String[] newDevices = ArrayUtil.addArr(devices, deviceInfo); + if(devices!=newDevices){ + // 将用户在线设备添加到缓存 + cacheManager.hset(key, CacheKeys.USER_INFO_FIELD_DEVICES, newDevices); + + LOGGER.info("save devices key:{} field:{} value:{}", key, CacheKeys.USER_INFO_FIELD_DEVICES, Jsons.toJson(newDevices)); + } + } + + /** + * 将离线信息推送给用户 + */ + void sendOfflineMsg(UserOnlineEvent event){ + String key = CacheKeys.getUserInfoKey(event.getUserId()); + String msgs = cacheManager.hget(key, CacheKeys.USER_INFO_FIELD_MSG, String.class); + if(msgs==null){ + return; + } + String[] msgIds = msgs.split(","); + for(String msgId : msgIds){ + String json = cacheManager.get(msgId, String.class); + byte[] content = json.getBytes(Constants.UTF_8); + PushMessage pushMessage = PushMessage.build(event.getConnection()).setContent(content); + pushMessage.send(null); + + LOGGER.info("send offline userId:{}[{}] msg:{}", event.getUserId(), event.getConnection().getChannel(), json); + } + cacheManager.hdel(key, CacheKeys.USER_INFO_FIELD_MSG); + } + + /** + * 离线事件处理 + * @param event + */ @Subscribe @AllowConcurrentEvents void on(UserOfflineEvent event) { + // 从本地在线列表删除 userManager.remFormOnlineList(event.getUserId()); + // 广播用户离线 mqClient.publish(OFFLINE_CHANNEL, event.getUserId()); + + // 将用户离线设备从缓存删除 + SessionContext sessionContext = event.getConnection().getSessionContext(); + String userId = sessionContext.userId; + + String deviceId = sessionContext.deviceId; + String osName = sessionContext.osName; + String osVersion = sessionContext.osVersion; + + String deviceInfo = deviceId+","+osName+","+osVersion; + + String key = CacheKeys.getUserInfoKey(userId); + String[] devices = cacheManager.hget(key, CacheKeys.USER_INFO_FIELD_DEVICES, String[].class); + String[] newDevices = ArrayUtil.removeArr(devices, deviceInfo); + if(devices!=newDevices){ + cacheManager.hset(key, CacheKeys.USER_INFO_FIELD_DEVICES, newDevices); + + LOGGER.info("save devices key:{} field:{} value:{}", key, CacheKeys.USER_INFO_FIELD_DEVICES, Jsons.toJson(newDevices)); + } } public UserManager getUserManager() { diff --git a/mpush-core/src/main/java/com/mpush/core/server/AdminServer.java b/mpush-core/src/main/java/com/mpush/core/server/AdminServer.java index 78b1185f..b8d28002 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/AdminServer.java +++ b/mpush-core/src/main/java/com/mpush/core/server/AdminServer.java @@ -31,6 +31,9 @@ import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; +/** + * 管理员服务器 + */ public final class AdminServer extends NettyTCPServer { private AdminHandler adminHandler; diff --git a/mpush-core/src/main/java/com/mpush/core/server/ConnectionServer.java b/mpush-core/src/main/java/com/mpush/core/server/ConnectionServer.java index a1734dc0..3576c251 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/ConnectionServer.java +++ b/mpush-core/src/main/java/com/mpush/core/server/ConnectionServer.java @@ -53,6 +53,8 @@ /** * Created by ohun on 2015/12/30. * + * 连接服务器 + * * @author ohun@live.cn (夜色) */ public final class ConnectionServer extends NettyTCPServer { @@ -76,13 +78,21 @@ public ConnectionServer(MPushServer mPushServer) { public void init() { super.init(); connectionManager.init(); + // 注册 心跳 处理 messageDispatcher.register(Command.HEARTBEAT, HeartBeatHandler::new); + // 注册 握手 处理 messageDispatcher.register(Command.HANDSHAKE, () -> new HandshakeHandler(mPushServer)); + // 注册 绑定 处理 messageDispatcher.register(Command.BIND, () -> new BindUserHandler(mPushServer)); + // 注册 解绑 处理 messageDispatcher.register(Command.UNBIND, () -> new BindUserHandler(mPushServer)); + // 注册 快速连接 处理 messageDispatcher.register(Command.FAST_CONNECT, () -> new FastConnectHandler(mPushServer)); + // 注册 推送 处理 messageDispatcher.register(Command.PUSH, PushHandlerFactory::create); + // 注册 确认 处理 messageDispatcher.register(Command.ACK, () -> new AckHandler(mPushServer)); + // 注册 http代理 处理 messageDispatcher.register(Command.HTTP_PROXY, () -> new HttpProxyHandler(mPushServer), CC.mp.http.proxy_enabled); if (CC.mp.net.traffic_shaping.connect_server.enabled) {//启用流量整形,限流 diff --git a/mpush-core/src/main/java/com/mpush/core/server/DefaultServerEventListener.java b/mpush-core/src/main/java/com/mpush/core/server/DefaultServerEventListener.java index e1a2e288..660ae10b 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/DefaultServerEventListener.java +++ b/mpush-core/src/main/java/com/mpush/core/server/DefaultServerEventListener.java @@ -26,6 +26,8 @@ /** * Created by ohun on 16/10/19. * + * 默认服务器事件监听器 + * * @author ohun@live.cn (夜色) */ @Spi(order = 1) diff --git a/mpush-core/src/main/java/com/mpush/core/server/GatewayServer.java b/mpush-core/src/main/java/com/mpush/core/server/GatewayServer.java index d6cf10d6..d9c78c85 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/GatewayServer.java +++ b/mpush-core/src/main/java/com/mpush/core/server/GatewayServer.java @@ -51,6 +51,8 @@ /** * Created by ohun on 2015/12/30. * + * 网关服务器 + * * @author ohun@live.cn */ public final class GatewayServer extends NettyTCPServer { diff --git a/mpush-core/src/main/java/com/mpush/core/server/GatewayUDPConnector.java b/mpush-core/src/main/java/com/mpush/core/server/GatewayUDPConnector.java index c5d5d8bd..7933da40 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/GatewayUDPConnector.java +++ b/mpush-core/src/main/java/com/mpush/core/server/GatewayUDPConnector.java @@ -40,6 +40,8 @@ /** * Created by ohun on 2015/12/30. * + * 网关udp连接器 + * * @author ohun@live.cn */ public final class GatewayUDPConnector extends NettyUDPConnector { diff --git a/mpush-core/src/main/java/com/mpush/core/server/ServerChannelHandler.java b/mpush-core/src/main/java/com/mpush/core/server/ServerChannelHandler.java index 971c88d7..5458ff4d 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/ServerChannelHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/server/ServerChannelHandler.java @@ -40,6 +40,8 @@ /** * Created by ohun on 2015/12/19. * + * 服务器通道处理器 + * * @author ohun@live.cn */ @ChannelHandler.Sharable diff --git a/mpush-core/src/main/java/com/mpush/core/server/ServerConnectionManager.java b/mpush-core/src/main/java/com/mpush/core/server/ServerConnectionManager.java index f468893d..03e318fe 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/ServerConnectionManager.java +++ b/mpush-core/src/main/java/com/mpush/core/server/ServerConnectionManager.java @@ -41,6 +41,8 @@ /** * Created by ohun on 2015/12/22. * + * 服务器连接管理器 + * * @author ohun@live.cn */ public final class ServerConnectionManager implements ConnectionManager { diff --git a/mpush-core/src/main/java/com/mpush/core/server/WebSocketChannelHandler.java b/mpush-core/src/main/java/com/mpush/core/server/WebSocketChannelHandler.java index 390fa7ce..a5cbae4e 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/WebSocketChannelHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/server/WebSocketChannelHandler.java @@ -20,6 +20,8 @@ /** * Echoes uppercase content of text frames. + * + * websocket通道处理器 */ @ChannelHandler.Sharable public class WebSocketChannelHandler extends SimpleChannelInboundHandler { diff --git a/mpush-core/src/main/java/com/mpush/core/server/WebSocketIndexPageHandler.java b/mpush-core/src/main/java/com/mpush/core/server/WebSocketIndexPageHandler.java index f158562e..c62c0858 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/WebSocketIndexPageHandler.java +++ b/mpush-core/src/main/java/com/mpush/core/server/WebSocketIndexPageHandler.java @@ -4,7 +4,6 @@ import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.handler.codec.http.*; -import io.netty.handler.ssl.SslHandler; import io.netty.util.CharsetUtil; import java.io.InputStream; @@ -15,25 +14,27 @@ /** * Outputs index page content. + * + * websocket index 页面处理器 */ @ChannelHandler.Sharable public class WebSocketIndexPageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception { - // Handle a bad request. + // 处理坏请求 if (!req.decoderResult().isSuccess()) { sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, BAD_REQUEST)); return; } - // Allow only GET methods. + // 仅允许GET方法 if (req.method() != GET) { sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, FORBIDDEN)); return; } - // Send the index page + // 发送 index 页面 if ("/".equals(req.uri()) || "/index.html".equals(req.uri())) { ByteBuf content = getContent(); FullHttpResponse res = new DefaultFullHttpResponse(HTTP_1_1, OK, content); @@ -55,7 +56,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { } private static void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest req, FullHttpResponse res) { - // Generate an error page if response getStatus code is not OK (200). + // 如果响应getStatus状态不是正常(200),则生成错误页面 if (res.status().code() != 200) { ByteBuf buf = Unpooled.copiedBuffer(res.status().toString(), CharsetUtil.UTF_8); res.content().writeBytes(buf); @@ -63,7 +64,7 @@ private static void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest HttpUtil.setContentLength(res, res.content().readableBytes()); } - // Send the response and close the connection if necessary. + // 如有必要,发送响应并关闭连接 ChannelFuture f = ctx.channel().writeAndFlush(res); if (!HttpUtil.isKeepAlive(req) || res.status().code() != 200) { f.addListener(ChannelFutureListener.CLOSE); diff --git a/mpush-core/src/main/java/com/mpush/core/server/WebsocketServer.java b/mpush-core/src/main/java/com/mpush/core/server/WebsocketServer.java index b58acde2..1aefe8fd 100644 --- a/mpush-core/src/main/java/com/mpush/core/server/WebsocketServer.java +++ b/mpush-core/src/main/java/com/mpush/core/server/WebsocketServer.java @@ -43,6 +43,8 @@ /** * Created by ohun on 2016/12/16. * + * websocket服务器 + * * @author ohun@live.cn (夜色) */ public final class WebsocketServer extends NettyTCPServer { diff --git a/mpush-core/src/main/java/com/mpush/core/session/ReusableSession.java b/mpush-core/src/main/java/com/mpush/core/session/ReusableSession.java index 4336b491..8d901cbd 100644 --- a/mpush-core/src/main/java/com/mpush/core/session/ReusableSession.java +++ b/mpush-core/src/main/java/com/mpush/core/session/ReusableSession.java @@ -25,6 +25,8 @@ /** * Created by ohun on 2015/12/25. * + * 可复用会话 + * * @author ohun@live.cn */ public final class ReusableSession { diff --git a/mpush-core/src/main/java/com/mpush/core/session/ReusableSessionManager.java b/mpush-core/src/main/java/com/mpush/core/session/ReusableSessionManager.java index 9260edb8..e325cd74 100644 --- a/mpush-core/src/main/java/com/mpush/core/session/ReusableSessionManager.java +++ b/mpush-core/src/main/java/com/mpush/core/session/ReusableSessionManager.java @@ -30,6 +30,8 @@ /** * Created by ohun on 2015/12/25. * + * 可复用会话管理器 + * * @author ohun@live.cn */ public final class ReusableSessionManager { diff --git a/mpush-core/src/main/resources/index.html b/mpush-core/src/main/resources/index.html index 4ed1b230..11fdefc7 100644 --- a/mpush-core/src/main/resources/index.html +++ b/mpush-core/src/main/resources/index.html @@ -86,12 +86,13 @@ ); } - function bindUser(userId, tags) { + function bindUser(userId, alias, tags) { if (userId && userId != session.userId) { config.log.info("<<< send bindUser message, userId=" + userId); session.userId = userId; session.tags = tags; - send(Packet(Command.BIND, {userId: userId, tags: tags})); + session.alias = alias; + send(Packet(Command.BIND, {userId: userId, alias: alias, tags: tags})); } else { config.log.error("user " + userId + " already bind"); } @@ -234,7 +235,7 @@ } function bind() { - mpush.bindUser($("userId").value) + mpush.bindUser($("userId").value, $("alias").value, $("tags").value) } @@ -247,6 +248,12 @@ + +

diff --git a/mpush-monitor/pom.xml b/mpush-monitor/pom.xml index 1b5fc6a8..916ae61a 100644 --- a/mpush-monitor/pom.xml +++ b/mpush-monitor/pom.xml @@ -3,7 +3,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml 4.0.0 diff --git a/mpush-monitor/src/main/java/com/mpush/monitor/data/MonitorResult.java b/mpush-monitor/src/main/java/com/mpush/monitor/data/MonitorResult.java index e064273a..6d3f4c4f 100644 --- a/mpush-monitor/src/main/java/com/mpush/monitor/data/MonitorResult.java +++ b/mpush-monitor/src/main/java/com/mpush/monitor/data/MonitorResult.java @@ -24,6 +24,9 @@ import java.util.HashMap; import java.util.Map; +/** + * 监控结果 + */ public class MonitorResult { private Long timestamp = System.currentTimeMillis(); private Map results = new HashMap<>(8); diff --git a/mpush-monitor/src/main/java/com/mpush/monitor/data/ResultCollector.java b/mpush-monitor/src/main/java/com/mpush/monitor/data/ResultCollector.java index 10c1ce03..cbf0e924 100644 --- a/mpush-monitor/src/main/java/com/mpush/monitor/data/ResultCollector.java +++ b/mpush-monitor/src/main/java/com/mpush/monitor/data/ResultCollector.java @@ -25,6 +25,8 @@ /** * Created by yxx on 2016/5/19. * + * 结果控制器 + * * @author ohun@live.cn */ public class ResultCollector { diff --git a/mpush-monitor/src/main/java/com/mpush/monitor/jmx/mxbean/PushCenterBean.java b/mpush-monitor/src/main/java/com/mpush/monitor/jmx/mxbean/PushCenterBean.java index f994b071..2c18641e 100644 --- a/mpush-monitor/src/main/java/com/mpush/monitor/jmx/mxbean/PushCenterBean.java +++ b/mpush-monitor/src/main/java/com/mpush/monitor/jmx/mxbean/PushCenterBean.java @@ -21,12 +21,13 @@ import com.mpush.monitor.jmx.MBeanInfo; -import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** * Created by ohun on 2016/12/23. * + * 推送中心 + * * @author ohun@live.cn (夜色) */ public final class PushCenterBean implements PushCenterMXBean, MBeanInfo { diff --git a/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/ServerStats.java b/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/ServerStats.java index 7f106fbf..985e31c1 100644 --- a/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/ServerStats.java +++ b/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/ServerStats.java @@ -22,6 +22,8 @@ /** * Created by ohun on 16/10/23. * + * 服务器统计 + * * @author ohun@live.cn (夜色) */ public final class ServerStats { diff --git a/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/Stats.java b/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/Stats.java index eb8337d5..c09e3c38 100644 --- a/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/Stats.java +++ b/mpush-monitor/src/main/java/com/mpush/monitor/jmx/stats/Stats.java @@ -4,6 +4,8 @@ /** * Statistics on the ServerCnxn + * + * 统计 */ interface Stats { /** diff --git a/mpush-monitor/src/main/java/com/mpush/monitor/service/MonitorService.java b/mpush-monitor/src/main/java/com/mpush/monitor/service/MonitorService.java index 6a173ce4..8be7b8bf 100644 --- a/mpush-monitor/src/main/java/com/mpush/monitor/service/MonitorService.java +++ b/mpush-monitor/src/main/java/com/mpush/monitor/service/MonitorService.java @@ -33,6 +33,9 @@ import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; +/** + * 监控服务 + */ public class MonitorService extends BaseService implements Monitor, Runnable { private static final int FIRST_DUMP_JSTACK_LOAD_AVG = 2, diff --git a/mpush-monitor/src/main/java/com/mpush/monitor/service/ThreadPoolManager.java b/mpush-monitor/src/main/java/com/mpush/monitor/service/ThreadPoolManager.java index 3f9a0c14..fd4a6d3a 100644 --- a/mpush-monitor/src/main/java/com/mpush/monitor/service/ThreadPoolManager.java +++ b/mpush-monitor/src/main/java/com/mpush/monitor/service/ThreadPoolManager.java @@ -20,20 +20,16 @@ package com.mpush.monitor.service; import com.mpush.api.spi.common.ExecutorFactory; -import com.mpush.tools.thread.NamedThreadFactory; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.SingleThreadEventLoop; -import io.netty.util.concurrent.EventExecutor; -import io.netty.util.concurrent.ThreadProperties; -import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadPoolExecutor; +/** + * 线程池管理器 + */ public final class ThreadPoolManager { private final ExecutorFactory executorFactory = ExecutorFactory.create(); diff --git a/mpush-netty/pom.xml b/mpush-netty/pom.xml index 8858ab71..4bc84f6b 100644 --- a/mpush-netty/pom.xml +++ b/mpush-netty/pom.xml @@ -8,7 +8,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml diff --git a/mpush-netty/src/main/java/com/mpush/netty/client/NettyTCPClient.java b/mpush-netty/src/main/java/com/mpush/netty/client/NettyTCPClient.java index d3e47585..607d141f 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/client/NettyTCPClient.java +++ b/mpush-netty/src/main/java/com/mpush/netty/client/NettyTCPClient.java @@ -41,6 +41,9 @@ import static com.mpush.tools.Utils.useNettyEpoll; +/** + * netty tcp客户端 + */ public abstract class NettyTCPClient extends BaseService implements Client { private static final Logger LOGGER = LoggerFactory.getLogger(NettyTCPClient.class); diff --git a/mpush-netty/src/main/java/com/mpush/netty/codec/DecodeException.java b/mpush-netty/src/main/java/com/mpush/netty/codec/DecodeException.java index ec646692..f5e88898 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/codec/DecodeException.java +++ b/mpush-netty/src/main/java/com/mpush/netty/codec/DecodeException.java @@ -22,6 +22,8 @@ /** * Created by ohun on 2015/12/23. * + * 解码异常 + * * @author ohun@live.cn */ public class DecodeException extends RuntimeException { diff --git a/mpush-netty/src/main/java/com/mpush/netty/codec/PacketDecoder.java b/mpush-netty/src/main/java/com/mpush/netty/codec/PacketDecoder.java index 916fde77..ac3cf1a9 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/codec/PacketDecoder.java +++ b/mpush-netty/src/main/java/com/mpush/netty/codec/PacketDecoder.java @@ -19,8 +19,8 @@ package com.mpush.netty.codec; -import com.mpush.api.protocol.Packet; import com.mpush.api.protocol.JsonPacket; +import com.mpush.api.protocol.Packet; import com.mpush.api.protocol.UDPPacket; import com.mpush.tools.Jsons; import com.mpush.tools.config.CC; @@ -30,7 +30,6 @@ import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.TooLongFrameException; -import java.util.HashMap; import java.util.List; import static com.mpush.api.protocol.Packet.decodePacket; @@ -39,6 +38,8 @@ * Created by ohun on 2015/12/19. * length(4)+cmd(1)+cc(2)+flags(1)+sessionId(4)+lrc(1)+body(n) * + * 包解码器 + * * @author ohun@live.cn */ public final class PacketDecoder extends ByteToMessageDecoder { diff --git a/mpush-netty/src/main/java/com/mpush/netty/codec/PacketEncoder.java b/mpush-netty/src/main/java/com/mpush/netty/codec/PacketEncoder.java index 22da7677..75bad9ca 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/codec/PacketEncoder.java +++ b/mpush-netty/src/main/java/com/mpush/netty/codec/PacketEncoder.java @@ -19,10 +19,8 @@ package com.mpush.netty.codec; -import com.mpush.api.protocol.Command; import com.mpush.api.protocol.Packet; import io.netty.buffer.ByteBuf; -import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; @@ -33,6 +31,8 @@ * Created by ohun on 2015/12/19. * length(4)+cmd(1)+cc(2)+flags(1)+sessionId(4)+lrc(1)+body(n) * + * 包编码器 + * * @author ohun@live.cn */ @ChannelHandler.Sharable diff --git a/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnection.java b/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnection.java index 383f21ce..e3f5124c 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnection.java +++ b/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnection.java @@ -33,6 +33,8 @@ /** * Created by ohun on 2015/12/22. * + * netty连接 + * * @author ohun@live.cn */ public final class NettyConnection implements Connection, ChannelFutureListener { diff --git a/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnectionManager.java b/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnectionManager.java index 81b22cae..4a5b5548 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnectionManager.java +++ b/mpush-netty/src/main/java/com/mpush/netty/connection/NettyConnectionManager.java @@ -30,6 +30,8 @@ /** * Created by ohun on 2016/12/27. * + * netty连接管理器 + * * @author ohun@live.cn (夜色) */ public final class NettyConnectionManager implements ConnectionManager { diff --git a/mpush-netty/src/main/java/com/mpush/netty/http/HttpCallback.java b/mpush-netty/src/main/java/com/mpush/netty/http/HttpCallback.java index a628253a..d50481da 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/http/HttpCallback.java +++ b/mpush-netty/src/main/java/com/mpush/netty/http/HttpCallback.java @@ -25,6 +25,8 @@ /** * Created by ohun on 2016/2/15. * + * http回调 + * * @author ohun@live.cn */ public interface HttpCallback { diff --git a/mpush-netty/src/main/java/com/mpush/netty/http/HttpClient.java b/mpush-netty/src/main/java/com/mpush/netty/http/HttpClient.java index 06305e55..0e764a81 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/http/HttpClient.java +++ b/mpush-netty/src/main/java/com/mpush/netty/http/HttpClient.java @@ -24,6 +24,8 @@ /** * Created by ohun on 2016/2/15. * + * http客户端 + * * @author ohun@live.cn */ public interface HttpClient extends Service { diff --git a/mpush-netty/src/main/java/com/mpush/netty/http/HttpClientHandler.java b/mpush-netty/src/main/java/com/mpush/netty/http/HttpClientHandler.java index 1eababf6..a469896f 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/http/HttpClientHandler.java +++ b/mpush-netty/src/main/java/com/mpush/netty/http/HttpClientHandler.java @@ -12,6 +12,9 @@ import java.net.URL; import java.net.URLDecoder; +/** + * http客户端处理器 + */ @ChannelHandler.Sharable /*package*/ class HttpClientHandler extends ChannelInboundHandlerAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(NettyHttpClient.class); diff --git a/mpush-netty/src/main/java/com/mpush/netty/http/HttpConnectionPool.java b/mpush-netty/src/main/java/com/mpush/netty/http/HttpConnectionPool.java index 8af6cdad..025b648e 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/http/HttpConnectionPool.java +++ b/mpush-netty/src/main/java/com/mpush/netty/http/HttpConnectionPool.java @@ -31,6 +31,8 @@ /** * Created by yxx on 2016/5/28. * + * http连接池 + * * @author ohun@live.cn (夜色) */ /*package*/ class HttpConnectionPool { diff --git a/mpush-netty/src/main/java/com/mpush/netty/http/NettyHttpClient.java b/mpush-netty/src/main/java/com/mpush/netty/http/NettyHttpClient.java index 1e31b710..b55ba8b2 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/http/NettyHttpClient.java +++ b/mpush-netty/src/main/java/com/mpush/netty/http/NettyHttpClient.java @@ -50,6 +50,7 @@ import static io.netty.handler.codec.http.HttpHeaderValues.KEEP_ALIVE; /** + * netty http 客户端 * Netty的一个Bootstrap是可以关联多个channel的, * 本Client采用的就是这种模式,在种模式下如果Handler添加了@ChannelHandler.Sharable * 注解的话,要特殊处理,因为这时的client和handler是被所有请求共享的。 diff --git a/mpush-netty/src/main/java/com/mpush/netty/http/RequestContext.java b/mpush-netty/src/main/java/com/mpush/netty/http/RequestContext.java index da2eb45b..2497ba49 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/http/RequestContext.java +++ b/mpush-netty/src/main/java/com/mpush/netty/http/RequestContext.java @@ -29,6 +29,9 @@ import java.util.concurrent.atomic.AtomicBoolean; +/** + * 请求上下文 + */ public class RequestContext implements TimerTask, HttpCallback { private static final int TIMEOUT = CC.mp.http.default_read_timeout; private final long startTime = System.currentTimeMillis(); diff --git a/mpush-netty/src/main/java/com/mpush/netty/server/NettyTCPServer.java b/mpush-netty/src/main/java/com/mpush/netty/server/NettyTCPServer.java index d2b2c79b..24bb8731 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/server/NettyTCPServer.java +++ b/mpush-netty/src/main/java/com/mpush/netty/server/NettyTCPServer.java @@ -48,6 +48,8 @@ /** * Created by ohun on 2015/12/22. * + * netty tcp服务器 + * * @author ohun@live.cn */ public abstract class NettyTCPServer extends BaseService implements Server { diff --git a/mpush-netty/src/main/java/com/mpush/netty/udp/NettyUDPConnector.java b/mpush-netty/src/main/java/com/mpush/netty/udp/NettyUDPConnector.java index 9046285f..a5f108ae 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/udp/NettyUDPConnector.java +++ b/mpush-netty/src/main/java/com/mpush/netty/udp/NettyUDPConnector.java @@ -44,6 +44,8 @@ /** * Created by ohun on 16/10/20. * + * netty udp连接器 + * * @author ohun@live.cn (夜色) */ public abstract class NettyUDPConnector extends BaseService implements Server { diff --git a/mpush-netty/src/main/java/com/mpush/netty/udp/UDPChannelHandler.java b/mpush-netty/src/main/java/com/mpush/netty/udp/UDPChannelHandler.java index 8f8741d2..37716009 100644 --- a/mpush-netty/src/main/java/com/mpush/netty/udp/UDPChannelHandler.java +++ b/mpush-netty/src/main/java/com/mpush/netty/udp/UDPChannelHandler.java @@ -38,6 +38,8 @@ /** * Created by ohun on 16/10/21. * + * udp通道处理器 + * * @author ohun@live.cn (夜色) */ @ChannelHandler.Sharable diff --git a/mpush-test/pom.xml b/mpush-test/pom.xml index abfa0be1..6ffd9e5d 100644 --- a/mpush-test/pom.xml +++ b/mpush-test/pom.xml @@ -6,7 +6,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml diff --git a/mpush-test/src/main/java/com/mpush/test/client/ConnClientTestMain.java b/mpush-test/src/main/java/com/mpush/test/client/ConnClientTestMain.java index c859ed6a..edd46403 100644 --- a/mpush-test/src/main/java/com/mpush/test/client/ConnClientTestMain.java +++ b/mpush-test/src/main/java/com/mpush/test/client/ConnClientTestMain.java @@ -33,8 +33,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; -import static com.mpush.api.srd.ServiceNames.ATTR_PUBLIC_IP; - public class ConnClientTestMain { public static void main(String[] args) throws Exception { @@ -93,6 +91,7 @@ private static void testConnClient(int count, String userPrefix, int printDelay, String osName = "android"; String osVersion = "1.0.1"; String userId = userPrefix + "user-" + i; + String tags = "test"; String deviceId = userPrefix + "test-device-id-" + i; byte[] clientKey = CipherBox.I.randomAESKey(); byte[] iv = CipherBox.I.randomAESIV(); @@ -105,6 +104,7 @@ private static void testConnClient(int count, String userPrefix, int printDelay, config.setOsName(osName); config.setOsVersion(osVersion); config.setUserId(userId); + config.setTags(tags); int L = serverList.size(); int index = (int) ((Math.random() % L) * L); diff --git a/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain.java b/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain.java index 1c021db2..32947803 100644 --- a/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain.java +++ b/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain.java @@ -19,12 +19,10 @@ package com.mpush.test.push; -import com.google.common.collect.Sets; import com.mpush.api.push.*; import com.mpush.tools.log.Logs; import org.junit.Test; -import java.util.Arrays; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; @@ -50,7 +48,7 @@ public void testPush() throws Exception { for (int i = 0; i < 1; i++) { PushMsg msg = PushMsg.build(MsgType.MESSAGE, "this a first push."); - msg.setMsgId("msgId_" + i); + //msg.setMsgId("msgId_" + i); PushContext context = PushContext.build(msg) .setAckModel(AckModel.AUTO_ACK) @@ -66,7 +64,8 @@ public void onResult(PushResult result) { System.err.println("\n\n" + result); } }); - FutureTask future = sender.send(context); + //FutureTask future = sender.send(context); + FutureTask future = sender.sendByUserId(context); //System.err.println("\n\n" + future.get()); } diff --git a/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain2.java b/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain2.java index 0771b271..40bd160e 100644 --- a/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain2.java +++ b/mpush-test/src/main/java/com/mpush/test/push/PushClientTestMain2.java @@ -66,7 +66,7 @@ public void testPush() throws Exception { while (service.getQueue().size() > 1000) Thread.sleep(1); // 防止内存溢出 PushMsg msg = PushMsg.build(MsgType.MESSAGE, "this a first push."); - msg.setMsgId("msgId_" + i); + //msg.setMsgId("msgId_" + i); PushContext context = PushContext.build(msg) .setAckModel(AckModel.NO_ACK) @@ -108,7 +108,7 @@ public PushTask(PushSender sender, @Override public void run() { if (flowControl.checkQps()) { - FutureTask future = sender.send(context); + FutureTask future = sender.sendByUserId(context); } else { executor.schedule(this, flowControl.getDelay(), TimeUnit.NANOSECONDS); } diff --git a/mpush-test/src/main/java/com/mpush/test/spi/FileCacheManger.java b/mpush-test/src/main/java/com/mpush/test/spi/FileCacheManger.java index 9563b869..755f44cc 100644 --- a/mpush-test/src/main/java/com/mpush/test/spi/FileCacheManger.java +++ b/mpush-test/src/main/java/com/mpush/test/spi/FileCacheManger.java @@ -36,6 +36,8 @@ /** * Created by ohun on 2016/12/28. * + * 文件缓存,即存放在磁盘中 + * * @author ohun@live.cn (夜色) */ @SuppressWarnings("unchecked") @@ -137,6 +139,20 @@ public void hdel(String key, String field) { } } + @Override + public boolean exists(String key) { + return cache.containsKey(key); + } + + @Override + public boolean hexists(String key, String field) { + Object map = cache.get(key); + if (map != null) { + return ((Map) map).containsKey(field); + } + return false; + } + @Override public Map hgetAll(String key, Class clazz) { Map m = (Map) cache.get(key); diff --git a/mpush-tools/pom.xml b/mpush-tools/pom.xml index 66e54448..0bcec37e 100644 --- a/mpush-tools/pom.xml +++ b/mpush-tools/pom.xml @@ -7,7 +7,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml diff --git a/mpush-tools/src/main/java/com/mpush/tools/Jsons.java b/mpush-tools/src/main/java/com/mpush/tools/Jsons.java index f32b3f50..7a604d6f 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/Jsons.java +++ b/mpush-tools/src/main/java/com/mpush/tools/Jsons.java @@ -33,6 +33,8 @@ /** * Created by xiaoxu.yxx on 15/8/7. * + * json工具 + * * @author ohun@live.cn (夜色) */ public final class Jsons { diff --git a/mpush-tools/src/main/java/com/mpush/tools/StringUtil.java b/mpush-tools/src/main/java/com/mpush/tools/StringUtil.java new file mode 100644 index 00000000..33bbd3da --- /dev/null +++ b/mpush-tools/src/main/java/com/mpush/tools/StringUtil.java @@ -0,0 +1,46 @@ +package com.mpush.tools; + +/** + * @description: + * @author: dengliaoyan + * @create: 2019-06-14 11:48 + **/ +public class StringUtil { + /** + * 用于验证用户id、别名、标签的正则表达式 + */ + private static final String REGEX_USERID_ALIAS_TAGS = "^([A-Za-z0-9_\\-]){1,127}$"; + public static boolean verifyString(String str, String regex){ + return str.matches(regex); + } + public static boolean verifyUserId(String userId){ + if(userId==null){ + return false; + } + return verifyString(userId, REGEX_USERID_ALIAS_TAGS); + } + public static boolean verifyAlias(String alias){ + if(alias==null){ + return false; + } + return verifyString(alias, REGEX_USERID_ALIAS_TAGS); + } + public static boolean verifyTags(String tags){ + if(tags==null){ + return false; + } + if(tags.indexOf(",")>0){ + String[] tagsArr = tags.split(","); + boolean rev = true; + for(String item : tagsArr){ + rev = rev && verifyString(item, REGEX_USERID_ALIAS_TAGS); + if(!rev){ + return rev; + } + } + return rev; + }else{ + return verifyString(tags, REGEX_USERID_ALIAS_TAGS); + } + } +} diff --git a/mpush-tools/src/main/java/com/mpush/tools/common/TimeLine.java b/mpush-tools/src/main/java/com/mpush/tools/common/TimeLine.java index b70c77d0..2df2b7af 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/common/TimeLine.java +++ b/mpush-tools/src/main/java/com/mpush/tools/common/TimeLine.java @@ -18,12 +18,11 @@ */ package com.mpush.tools.common; -import java.text.SimpleDateFormat; -import java.util.Date; - /** * Created by yxx on 2016/5/26. * + * 时间线 + * * @author ohun@live.cn (夜色) */ public final class TimeLine { diff --git a/mpush-tools/src/main/java/com/mpush/tools/config/CC.java b/mpush-tools/src/main/java/com/mpush/tools/config/CC.java index c91e3117..aa8fe60b 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/config/CC.java +++ b/mpush-tools/src/main/java/com/mpush/tools/config/CC.java @@ -271,6 +271,12 @@ interface retry { interface redis { Config cfg = mp.cfg.getObject("redis").toConfig(); + // 读取数据超时时间 + int soTimeout = cfg.getInt("soTimeout"); + // 连接超时时间 + int connectionTimeout = cfg.getInt("connectionTimeout"); + // 出现异常最大重试次数 + int maxAttempts = cfg.getInt("maxAttempts"); String password = cfg.getString("password"); String clusterModel = cfg.getString("cluster-model"); String sentinelMaster = cfg.getString("sentinel-master"); @@ -351,5 +357,10 @@ interface monitor { boolean profile_enabled = cfg.getBoolean("profile-enabled"); Duration profile_slowly_duration = cfg.getDuration("profile-slowly-duration"); } + interface snowflake { + Config cfg = mp.cfg.getObject("snowflake").toConfig(); + int workerId = cfg.getInt("workerId") % 32; + int datacenterId = cfg.getInt("datacenterId") % 32; + } } } \ No newline at end of file diff --git a/mpush-tools/src/main/java/com/mpush/tools/config/ConfigTools.java b/mpush-tools/src/main/java/com/mpush/tools/config/ConfigTools.java index 560f02cf..bb14b036 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/config/ConfigTools.java +++ b/mpush-tools/src/main/java/com/mpush/tools/config/ConfigTools.java @@ -25,6 +25,8 @@ /** * Created by yxx on 2016/5/18. * + * 配置工具 + * * @author ohun@live.cn */ public final class ConfigTools { diff --git a/mpush-tools/src/main/java/com/mpush/tools/event/EventBus.java b/mpush-tools/src/main/java/com/mpush/tools/event/EventBus.java index 16557732..a3bce984 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/event/EventBus.java +++ b/mpush-tools/src/main/java/com/mpush/tools/event/EventBus.java @@ -29,6 +29,8 @@ /** * Created by ohun on 2015/12/29. * + * 事件总线 + * * @author ohun@live.cn */ public class EventBus { diff --git a/mpush-tools/src/main/java/com/mpush/tools/event/EventConsumer.java b/mpush-tools/src/main/java/com/mpush/tools/event/EventConsumer.java index 2776a8a7..f0f85871 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/event/EventConsumer.java +++ b/mpush-tools/src/main/java/com/mpush/tools/event/EventConsumer.java @@ -19,6 +19,9 @@ package com.mpush.tools.event; +/** + * 事件消费者 + */ public abstract class EventConsumer { public EventConsumer() { diff --git a/mpush-tools/src/main/java/com/mpush/tools/thread/NamedThreadFactory.java b/mpush-tools/src/main/java/com/mpush/tools/thread/NamedThreadFactory.java index 866d7731..d30d6aaa 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/thread/NamedThreadFactory.java +++ b/mpush-tools/src/main/java/com/mpush/tools/thread/NamedThreadFactory.java @@ -27,6 +27,8 @@ /** * Created by xiaoxu.yxx on 2015/7/19. * + * 命名线程工厂 + * * @author ohun@live.cn (夜色) */ public final class NamedThreadFactory implements ThreadFactory { diff --git a/mpush-tools/src/main/java/com/mpush/tools/thread/ThreadNames.java b/mpush-tools/src/main/java/com/mpush/tools/thread/ThreadNames.java index ced3f490..3e238237 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/thread/ThreadNames.java +++ b/mpush-tools/src/main/java/com/mpush/tools/thread/ThreadNames.java @@ -19,6 +19,9 @@ package com.mpush.tools.thread; +/** + * 线程名称 + */ public final class ThreadNames { public static final String NS = "mp"; public static final String THREAD_NAME_PREFIX = NS + "-t"; diff --git a/mpush-tools/src/main/java/com/mpush/tools/thread/pool/ThreadPoolConfig.java b/mpush-tools/src/main/java/com/mpush/tools/thread/pool/ThreadPoolConfig.java index 1f2e1236..1526f0c8 100644 --- a/mpush-tools/src/main/java/com/mpush/tools/thread/pool/ThreadPoolConfig.java +++ b/mpush-tools/src/main/java/com/mpush/tools/thread/pool/ThreadPoolConfig.java @@ -23,6 +23,9 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.SynchronousQueue; +/** + * 线程池配置 + */ public final class ThreadPoolConfig { public static final int REJECTED_POLICY_ABORT = 0; public static final int REJECTED_POLICY_DISCARD = 1; diff --git a/mpush-zk/pom.xml b/mpush-zk/pom.xml index ecdcb515..edddb676 100644 --- a/mpush-zk/pom.xml +++ b/mpush-zk/pom.xml @@ -8,7 +8,7 @@ mpush com.github.mpusher - 0.8.1 + 0.8.2 ../pom.xml diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKCacheListener.java b/mpush-zk/src/main/java/com/mpush/zk/ZKCacheListener.java index 7eb9883c..cc1b2b9e 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKCacheListener.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKCacheListener.java @@ -32,6 +32,8 @@ /** * Created by ohun on 2016/12/28. * + * zk缓存监听器 + * * @author ohun@live.cn (夜色) */ public final class ZKCacheListener implements TreeCacheListener { @@ -45,6 +47,12 @@ public ZKCacheListener(String watchPath, ServiceListener listener) { this.listener = listener; } + /** + * 节点事件 + * @param curator + * @param event + * @throws Exception + */ @Override public void childEvent(CuratorFramework curator, TreeCacheEvent event) throws Exception { ChildData data = event.getData(); @@ -54,12 +62,15 @@ public void childEvent(CuratorFramework curator, TreeCacheEvent event) throws Ex if (dataPath.startsWith(watchPath)) { switch (event.getType()) { case NODE_ADDED: + // 添加节点 listener.onServiceAdded(dataPath, Jsons.fromJson(data.getData(), CommonServiceNode.class)); break; case NODE_REMOVED: + // 删除节点 listener.onServiceRemoved(dataPath, Jsons.fromJson(data.getData(), CommonServiceNode.class)); break; case NODE_UPDATED: + // 更新节点 listener.onServiceUpdated(dataPath, Jsons.fromJson(data.getData(), CommonServiceNode.class)); break; } diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKClient.java b/mpush-zk/src/main/java/com/mpush/zk/ZKClient.java index f947ce55..a677c526 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKClient.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKClient.java @@ -39,6 +39,9 @@ import java.util.*; import java.util.concurrent.TimeUnit; +/** + * zk客户端 + */ public class ZKClient extends BaseService { public static final ZKClient I = I(); private ZKConfig zkConfig; diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKConfig.java b/mpush-zk/src/main/java/com/mpush/zk/ZKConfig.java index c1814958..76130d90 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKConfig.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKConfig.java @@ -21,6 +21,9 @@ import com.mpush.tools.config.CC.mp.zk; +/** + * zk配置 + */ public class ZKConfig { public static final int ZK_MAX_RETRY = 3; public static final int ZK_MIN_TIME = 5000; diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKDiscoveryFactory.java b/mpush-zk/src/main/java/com/mpush/zk/ZKDiscoveryFactory.java index 99da6071..1bb2122c 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKDiscoveryFactory.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKDiscoveryFactory.java @@ -26,6 +26,8 @@ /** * Created by ohun on 2016/12/27. * + * zk发现工厂 + * * @author ohun@live.cn (夜色) */ @Spi(order = 1) diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKException.java b/mpush-zk/src/main/java/com/mpush/zk/ZKException.java index 92f3bbff..5e213522 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKException.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKException.java @@ -22,6 +22,8 @@ /** * Created by yxx on 2016/5/14. * + * zk异常 + * * @author ohun@live.cn */ public class ZKException extends RuntimeException { diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKPath.java b/mpush-zk/src/main/java/com/mpush/zk/ZKPath.java index fd7613ad..f9e33270 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKPath.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKPath.java @@ -24,6 +24,9 @@ import static org.apache.curator.utils.ZKPaths.PATH_SEPARATOR; +/** + * zk路径 + */ public enum ZKPath { REDIS_SERVER("/redis", "machine", "redis注册的地方"), CONNECT_SERVER("/cs/hosts", "machine", "connection server服务器应用注册的路径"), diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKRegistryFactory.java b/mpush-zk/src/main/java/com/mpush/zk/ZKRegistryFactory.java index f3ccb466..00ddb5a0 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKRegistryFactory.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKRegistryFactory.java @@ -26,6 +26,8 @@ /** * Created by ohun on 2016/12/27. * + * zk注册工厂 + * * @author ohun@live.cn (夜色) */ @Spi(order = 1) diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKServiceRegistryAndDiscovery.java b/mpush-zk/src/main/java/com/mpush/zk/ZKServiceRegistryAndDiscovery.java index e5cbf2c7..2facb42a 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKServiceRegistryAndDiscovery.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKServiceRegistryAndDiscovery.java @@ -34,6 +34,8 @@ /** * Created by ohun on 16/9/22. * + * zk服务注册与发现 + * * @author ohun@live.cn (夜色) */ public final class ZKServiceRegistryAndDiscovery extends BaseService implements ServiceRegistry, ServiceDiscovery { diff --git a/mpush-zk/src/main/java/com/mpush/zk/ZKSyncMap.java b/mpush-zk/src/main/java/com/mpush/zk/ZKSyncMap.java index 7bcd8a8a..6ece4add 100644 --- a/mpush-zk/src/main/java/com/mpush/zk/ZKSyncMap.java +++ b/mpush-zk/src/main/java/com/mpush/zk/ZKSyncMap.java @@ -12,6 +12,8 @@ /** * Created by Stream.Liu + * + * zk同步映射 */ public class ZKSyncMap implements Map { static final String ZK_PATH_SYNC_MAP = "syncMap"; diff --git a/pom.xml b/pom.xml index e0de7433..a8dcdc72 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.github.mpusher mpush pom - 0.8.1 + 0.8.2 mpush MPUSH消息推送系统 https://github.com/mpusher/mpush @@ -70,7 +70,7 @@ UTF-8 UTF-8 1.8 - 4.1.25.Final + 4.1.34.Final 1.7.25 linux-x86_64