概要最近公司要求做一個(gè)web端向所有移動端發(fā)送公告,所以考慮到即時(shí)性就用openfire做服務(wù)。不過為了減輕web端的工作量,我們開發(fā)一個(gè)簡單的插件給openfire,對外開放http接口即可。 準(zhǔn)備系統(tǒng)環(huán)境:window10(surface pro4) JDK:1.7 or later 開發(fā)工具:eclipse-Mars.2 Release (4.5.2) Openfire版本:4.0.3 內(nèi)容Web端發(fā)送公告有兩個(gè)方案: 1、web端集成smack,添加公告時(shí)候調(diào)用smack進(jìn)行發(fā)送廣播(默認(rèn)不支持離線廣播,要進(jìn)行改造)比較繁瑣。 2、openfire服務(wù)端進(jìn)行發(fā)送廣播,對外開放http接口,服務(wù)端開發(fā)插件簡單而且權(quán)限比較大。 這里我們選擇了方案2,下面我們進(jìn)行對方案2的開發(fā)過程進(jìn)行講解。 用到Openfire本身的類:
實(shí)現(xiàn)思路
實(shí)現(xiàn)核心代碼
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); } 發(fā)送消息 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則會導(dǎo)致客戶端不能自動獲取離線消息,除主動獲取。 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";
結(jié)束公告接口開發(fā)完畢,公告采用富文本形式編輯,為了手機(jī)端展示方便發(fā)送的公告廣播為標(biāo)題和公告html5的地址。 |
|