一. 原理图
1. 没实现离线消息推送功能前,项目的架构图如下
2. 实现离线消息推送功能后,项目的架构图如下 - 版本一 - 适用于新闻等app工作环境,对离线消息的到达率要求不高的环境
3. 实现离线消息推送功能后,项目的架构图如下 - 版本二 - 适用于IM等app工作环境,对离线消息的到达率要求99.99%
二. 版本一的实现
1. 创建数据表 - Notification
a. 创建实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
|
b. 修改Hibernate的配置文件hibernate.cfg.xml
1 2 3 4 |
|
2. Dao层封装
a. 新建一个NotificationDao接口及它的实现NotificationDaoHibernate.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
b. 修改Spring的配置文件-spring-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 |
|
3. Service层封装
a. 新建一个NotificationService接口及它的实现NotificationServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
b. 修改Spring的配置文件-spring-config.xml
1 2 3 4 5 6 7 8 9 10 11 |
|
c. 修改ServiceLocator.java,提供对外调用的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
4. 业务逻辑层实现
a. 修改NotificationManager.java,添加一个存储消息Notification的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
b. 修改发送推送消息逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
c. 用户重新上线后,向其推送之前的存储在数据库的离线消息 - 修改PresenceUpdateHandler.java中的process()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
三. 版本二的实现 - 版本一的增强版
1. 为Notification添加一个UUID字段(回执的消息体就是该消息的uuid)
@Column(name = "uuid", length = 64, nullable = false, unique = true)
private String uuid;
// setter - getter
2. 为Dao及其实现层和Server层及其实现层添加一个根据uuid删除消息的方法
void deleteNotificationByUUID(String uuid); -> 实现
1 2 3 4 5 6 7 8 9 10 |
|
3. 修改相关业务逻辑
a. 修改NotificationManager相关方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
|
b. 客户端向服务器发送消息回执
1. 新建一个消息回执IQ -> DeliverConfirmIQ.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
2. 在客户端收到推送消息对外发送广播后,向服务器发送回执消息,修改NotificationPacketListener的processPacket()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
c. 服务器处理来自客户端的消息回执
1. 创建一个IQDeliverConfirmHandler处理从客户端发送过来的IQ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
2. 修改IQRouter的构造方法,将IQDeliverConfirmHandler添加到IQHandler集合中
1 2 3 4 5 6 7 8 9 |
|
3. 修改NotificationManager中的sendNotificationToUser()方法 - 在PresenceUpdateHandler调用该方法时传入false,同时在其他类调该方法时传入true,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
4. 在版本二的基础上修复离线发送逻辑
1. 去掉NotificationManager中的sendNotificationToUser()方法中的shouldSave参数
2. 在NotificationManager中添加一个发送离线消息给重新上线的用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
3. 在PresenceUpdateHandler中修改process(Packet)方法的相关代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
-----------------------------------------华丽丽的分割线-----------------------------------------
至此,基于Androidpn推送平台的离线功能就已经全部实现了