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的地址。

Openfire开发广播服务接口,支持离线广播消息的更多相关文章

  1. 开发FTP服务接口,对外提供接口服务

    注意:本文只适合小文本文件的上传下载,因为post请求是有大小限制的.默认大小是2m,虽然具体数值可以调节,但不适合做大文件的传输 最近公司有这么个需求:以后所有的项目开发中需要使用ftp服务器的地方 ...

  2. C#常规开发Windows服务

    .Net平台下开发Windows服务的支持库很多,除了通过标准的Windows服务项目,还有一些优秀的开源架构比如:TopSelf:本文以常规项目为例 一.开发 1.新建[Windows服务] 项目: ...

  3. Android开发之旅(二)服务生命周期和广播接收者生命周期

    引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  4. 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  5. Thrift对多接口服务的支持

    Thrift对多接口服务的支持 Thrift在0.9.1版本之前,一直只提交了对单一接口服务的支持,即一个RPC服务器(对应一个端口)支持一个服务接口的实现. 但是很多时候,我们的服务不能实现在一个接 ...

  6. 在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持

    HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...

  7. C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解>最后列出了 Fil ...

  8. 23 广播服务结合音乐Demo5

    MainActivity.java package com.dmy.demo5; import android.app.Activity; import android.content.Broadca ...

  9. xmpp和OpenFire示例,即时聊天室,支持离线消息

    让我说说为什么写这个博客,这是因为我在上周末的研究XMPP和OpenFire,从互联网上下载Demo,但跑不起来.它花了很长的时间.它被改造.抬高.篇博文也是希望后边学习XMPP和OpenFire的同 ...

随机推荐

  1. j2ee分布式架构 dubbo + springmvc + mybatis + ehcache + redis 分布式架构

    介绍 <modules>        <!-- jeesz 工具jar -->        <module>jeesz-utils</module> ...

  2. 使用faker 生成中文测试数据

    https://github.com/fzaninotto/Faker/blob/master/src/Faker/Provider/zh_CN/Address.php 常用的类型都在里面. 下面是一 ...

  3. Java学习笔记——Linux下安装配置MySQL

    山重水复疑无路,柳暗花明又一村 --游山西村 系统:Ubuntu 16.04LTS 1\官网下载mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz2\建立工作组:$su ...

  4. Android 桌面不显示应用图标

    忽然有一天,运行自己的程序,发现桌面没有应用图标了. google了半天,也没什么发现. 最后发现是主Activity中: <action android:name="android. ...

  5. 使用redis做mybaties的二级缓存(2)-Mybatis 二级缓存小心使用

    Mybatis默认对二级缓存是关闭的,一级缓存默认开启: 下面就说说为什么使用二级缓存需要注意: 二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到 ...

  6. redis 清空缓存

    redis 清空缓存 Redis 命令: flushall --> 清空整个 Redis 服务器的数据(删除所有数据库的所有 key ) flushdb --> 清空当前数据库中的所有 k ...

  7. javaScript-什么是变量?

    什么是变量? 从字面上看,变量是可变的量:从编程角度讲,变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,为了区分盒子,可以用BOX1,BOX2等名称代表不同盒子,BOX1就是盒子的名 ...

  8. javascript基础-对象

    原理 万物皆为对象.假设将'莫德'(我)看成对象.莫德的属性有名字,性别,年龄等. 莫德的行为有吃饭,走路,睡觉等.莫德与他人的往来即对象间的交互.对象对应世界的一个实体.类,即管理对象的分类.如果莫 ...

  9. blog界面自己写了css,参考了网站设计,想要的自己拿

    junhey这就把界面的代码公布下来,可以自己修改额~(ps:麻烦加个友链http://www.cnblogs.com/junhey/ 谢谢) /* 初始化样式 */ html, body, div, ...

  10. PhpStorm 设置之主题

    一 打开设置 File --> settings 二 设置窗口字体.大小.主题 Appearance & Behavior --> Appearance 下面是本人自己比较偏爱的一 ...