Openfire開發廣播服務介面,支持離線廣播消息
最近公司要求做一個web端向所有移動端發送公告,所以考慮到即時性就用openfire做服務。不過為了減輕web端的工作量,我們開發一個簡單的插件給openfire,對外開放http介面即可。
準備系統環境:window10(surface pro4)
JDK:1.7 or later
開發工具:eclipse-Mars.2 Release (4.5.2)
Openfire版本:4.0.3
內容Web端發送公告有兩個方案:
1、web端集成smack,添加公告時候調用smack進行發送廣播(默認不支持離線廣播,要進行改造)比較繁瑣。
2、openfire服務端進行發送廣播,對外開放http介面,服務端開發插件簡單而且許可權比較大。
這裡我們選擇了方案2,下面我們進行對方案2的開發過程進行講解。
用到Openfire本身的類:
實現思路
實現核心代碼
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { webManager.init(req, resp, req.getSession(), req.getServletContext());//初始化webManager Collection<User> users = webManager.getUserManager().getUsers();//獲取所有用戶 NatureMap natureMap = combineReq(req); boolean result = sendMsg(users,natureMap); String msg = ""; if (result) { msg = "{"status":0}"; }else{ msg = "{"status":-1,"msg":"用戶名或密碼錯誤"}"; } respcontent(resp,msg); }
發送消息
private boolean sendMsg(Collection<User> users,NatureMap natureMap) { boolean result = true; String from = natureMap.getString("from"); String pwd = natureMap.getString("pwd"); try { String password = AuthFactory.getPassword(from); if (pwd!=null&&pwd.endsWith(password)) { String body = natureMap.getString("body"); String subject = natureMap.getString("subject"); Message message = new Message(); message.setType(Message.Type.chat); message.setBody(body); message.setFrom("公告@mvilplss");//目前不加from則會導致客戶端不能自動獲取離線消息,除主動獲取。 message.setSubject(subject); PresenceManager presenceManager = webManager.getPresenceManager(); for (User user : users) { String username = user.getUsername(); message.setTo(username+"@mvilplss"); if(presenceManager.isAvailable(user)){ XMPPServer.getInstance().getRoutingTable().broadcastPacket(message, false); } else { if (!username.equals(from)) { XMPPServer.getInstance().getOfflineMessageStrategy().storeOffline(message); } } } } } catch (Exception e) { result=false; } return result; }
增加免登陸
private static final String SERVICE_NAME = "mybroadcast/broadcast";public void destroy() { AuthCheckFilter.removeExclude(SERVICE_NAME); } public void init() throws ServletException { AuthCheckFilter.addExclude(SERVICE_NAME); }
結束
公告介面開發完畢,公告採用富文本形式編輯,為了手機端展示方便發送的公告廣播為標題和公告html5的地址。
推薦閱讀:
※這條消息很重要!12月1日前,有銀行卡的都要看,你的銀行賬戶將發生大變!
※消息賦(8)
※北京城市副中心規劃建設最新消息:擴至整個通州新城155平方公里
※十月,我微笑著等待你的消息【情感美文】
※人元消息賦