歡迎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便可