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本身的類:

  • org.jivesoftware.util.WebManager:在post請求中進行註冊,通過它可以獲取所有用戶。
  • org.jivesoftware.openfire.PresenceManager:可以通過webManager. getPresenceManager();獲取對象,用來判斷用戶是否在登陸狀態。
  • org.jivesoftware.openfire.XMPPServer:通過它的靜態方法我們可以獲取RoutingTable(發送消息)和OfflineMessageStrategy(保存離線消息)。
  • 實現思路

    實現核心代碼

  • post請求
  • 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平方公里
    十月,我微笑著等待你的消息【情感美文】
    人元消息賦

    TAG:支持 | 廣播 | 服務 | 消息 | 離線 |