欢迎fork star 本人开源项目
本文介绍的全部代码均再码云中,若是对你有帮助,欢迎点个star支持,谢谢

1. 使用WebSocket而不使用stomp协议
STOMP在WebSocket之上提供了一个基于帧的线路格式(frame-based wire format)层,用来定义消息的语义。
乍看上去,STOMP的消息格式很是相似于HTTP请求的结构。
与HTTP请求和响应相似,STOMP帧由命令、一个或多个头信息以及负载所组成。
使用STOMP的好处在于,它彻底就是一种消息队列模式,你可使用生产者与消费者的思想来认识它,发送消息的是生产者,接收消息的是消费者。
而消费者能够经过订阅不一样的destination,来得到不一样的推送消息,不须要开发人员去管理这些订阅与推送目的地以前的关系,
2. 初版是基于WebSocket协议之上的STOMP协议
初版已经使用了很长时间,其中websocket连接推送这块一直不稳定,有时消耗很大资源,有时连接超时断开,其实都是由于使用了不熟悉的STOMP协议形成的。
STOMP协议当时是考虑不一样客户端,可能不支持WebSocket协议,不如IE8,IE9等,会退而求其次使用轮询的方式,即发布订阅的形式依然能够接受到消息。因此引用了此协议,通过一年的测试,发现并不适用,因此,应该使用最原始的WebSocket更好。
3. 消息服务处理websocket流程
3.1 服务暴露websocket连接方式
服务暴露路径为/websocket/{token},访问时将{token}替换为获取到的token便可
http://10.189.xx.xx:xx/websocket/{token}等方式访问
3.2 客户端接入时
客户端接入时,首先验证token,与帐户进行绑定,若是token认证不经过,拒绝链接
private String loginName;
private Integer userId;
private Session session;
private String status; //session状态
private String device; //登陆设备名称
private Date loginTime;
接入后,查询系统消息记录表,从新发送消息状态为“未送达”的消息到客户端
3.3 websocket的session存储
目前服务器不考虑集群方式,session关系所有维护在内存中,存储结构以下
private ConcurrentHashMap<String, HashMap<String,WebSocketClient>> sessionMap = new ConcurrentHashMap<String, HashMap<String,WebSocketClient>>();
private ConcurrentHashMap<Integer, HashMap<String,WebSocketClient>> sessionMapWithUserId = new ConcurrentHashMap<Integer, HashMap<String, WebSocketClient>>();
另外提供了可拓展的session管理方式接口,若是未来集群使用,实现接口为redis存储便可
3.4 断开链接后
在session管理的结构中,删除对应的session信息
4. 消息系统接口的使用
4.1 发送消息
API对外接口:/ecgapi/api/message/sendMessage
服务内部接口:ecg-broker下的/message/sendMessage
参数:
{
"content": "string", --消息内容,能够是json串
"receiver": [
"string" --接收者,非必填,不填时发送所有在线用户,填是传入用户ID,与初版一致
],
"title": "string", --消息标题
"type": 0 --消息类型
}
4.2 消息管理-查询系统消息记录
API对外接口:/ecgapi/api/message/getMessagePage
查询系统消息的记录的page信息,能够查询消息的状态,发送时间,发送人,接受者等信息
4.3 消息管理-经过ID删除系统消息记录
API对外接口:/ecgapi/api/message/deleteMessageById
删除系统消息的记录。
4.4 消息管理-查询全部在线的客户端
API对外接口:/ecgapi/api/message/getWebSocketClients
客户端接入时,服务器存储的接入信息接口,能够查询全部客户端接入的详情
4.5 消息管理-收取消息
API对外接口:/ecgapi/api/message/collectMessage
若是有消息未送达状况,能够经过此接口,登陆后主动收取消息
5. 有关消息推送的功能
5.1 报告分发时,发送消息
6. 后续功能扩展
6.1 android客户端消息推送
6.2 ios客户端消息推送
6.3 微信消息推送
微信消息推送使用的微信封装的api既能够,可是得有公众号,提早设计好模板,而且有些公众号每日推送的数量有限制
6.4 邮件系统的推送
邮件系统与使用的websocket不同的协议
6.5 发送手机短信
须要接入运营商的api便可,收费
6.6 QQ消息
接入腾讯的API便可