openfire 插件开发
插件分类
-
消息等内部插件
这类插件主要用于对 openfire 内消息,状态等扩展
-
webUI 插件
这类插件主要用于对 openfire 控制台扩展
-
web接口插件
这类插件主要用于对 openfire 后台接口扩展
插件开发基本流程
实现 Plugin 类
添加 plugin.xml 配置插件启动类
添加 changelog.html, logo_*.png/gif, readme.html 等说明文件及logo
基本的目录结构如下图:
通常 plugin.xml 是导入 PluginManager 中的默认配置文件,其配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<class>com.demo.hello.HelloPlugin</class>
<name>hello</name>
<description>First Openfire Custom Plugin.</description>
<author>ilufei</author>
<version>1.0.0</version>
<date>11/07/2018</date>
<minServerVersion>4.0.2</minServerVersion>
<!-- 控制台上追加界面 -->
<adminconsole>
<!-- tab位置 -->
<tab id="tab-server">
<!-- sidebar位置 -->
<sidebar id="sidebar-server-manager">
<!-- item位置,使用 name 进行 i18n 语言配置,url连接地址配置 -->
<item id="hello-setting" name="${hello.title}"
url="hello.jsp"
description="Quickly change the HELLO configurations." />
</sidebar>
</tab>
</adminconsole>
</plugin>
对于 pom.xml 则是在 build 过程中自动打包使用的。
注意: [WEB-INF] 目录下 web-custom.xml 则是对 servlet 等动态注册的配置页面,类似 Tomcat 中的 web.xml 配置,详细参见 Web 接口开发
消息等内部插件
主要在插件主入口处拿到 XMPPServer 对象,并插入相关的回调函数,进行相应的处理即可:
public class HelloPlugin implements Plugin {
private static final Logger Log = LoggerFactory.getLogger(HelloPlugin.class);
private XMPPServer mXMPPServer;
/**
* Instantiates a new Hello service plugin.
*/
public HelloPlugin() {
}
/*
* (non-Javadoc)
*
* @see
* org.jivesoftware.openfire.container.Plugin#initializePlugin(org.jivesoftware
* .openfire.container.PluginManager, java.io.File)
*/
public void initializePlugin(PluginManager manager, File pluginDirectory) {
// 获取 XMPPServer 服务
mXMPPServer = XMPPServer.getInstance();
Log.debug(mXMPPServer.getServerInfo().toString());
// 添加 IQHandler --> mHandler
mXMPPServer.getIQRouter().addHandler(mHandler);
// 添加离线消息监听
mXMPPServer.getOfflineMessageStrategy().addListener(this);
// TODO 更多
}
/*
* (non-Javadoc)
*
* @see org.jivesoftware.openfire.container.Plugin#destroyPlugin()
*/
public void destroyPlugin() {
// 删除 IQHandler --> mHandler
mXMPPServer.getIQRouter().removeHandler(mHandler);
// 删除离线消息监听
mXMPPServer.getOfflineMessageStrategy().removeListener(this);
}
}
调试过程中,为方便查看日志,将 build/lib/dist/log4j.xml 配置文件中添加如下内容即可:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="all-console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy.MM.dd HH:mm:ss} %-5p [%t]: %c - %m%n" />
</layout>
</appender>
...
<logger name="com.demo.hello">
<level value="debug" />
<appender-ref ref="console"/>
</logger>
<root>
<level value="debug" />
<appender-ref ref="all-out" />
<appender-ref ref="debug-out" />
<appender-ref ref="info-out" />
<appender-ref ref="warn-out" />
<appender-ref ref="error-out" />
<appender-ref ref="all-console" />
</root>
</log4j:configuration>
webUI 开发
如果所有UI都是界面,则可以通过 jsp 进行,具体进行如下几步即可:
- 配置入口
在 plugin.xml 中的 <adminconsole> 标签中添加相关的 item 即可:
<!-- 控制台上追加界面 -->
<adminconsole>
<!-- tab位置 -->
<tab id="tab-server">
<!-- sidebar位置 -->
<sidebar id="sidebar-server-manager">
<!-- item位置,使用 name 进行 i18n 语言配置,url连接地址配置 -->
<item id="hello-setting" name="${hello.title}"
url="hello.jsp"
description="Quickly change the HELLO configurations." />
</sidebar>
</tab>
</adminconsole>
注意:这里 tab 和 sidebar 中设置的 id 代表 显示的位置, 具体可以查询 openfire_src/src/resources/jar/admin-sidebar.xml 中的id,从而确认相关 tab 和 sidebar 的 id 名称。
- 编辑 jsp 文件
注意这里需要导入如下几个标签哦,不然 i18n 可能没法使用...
<%@ page import="org.jivesoftware.util.JiveProperties"
errorPage="error.jsp"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
具体如下:
<%@ page
import="org.jivesoftware.openfire.container.PluginManager,
org.jivesoftware.util.JiveProperties"
errorPage="error.jsp"%>
<%@ page import="java.util.Map"%>
<%@ page import="java.util.HashMap"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager" />
<%
webManager.init(request, response, session, application, out);
%>
<%
// Get parameters
boolean update = request.getParameter("update") != null;
Map<String, String> errors = new HashMap<String, String>();
final JiveProperties mJiveProperties = JiveProperties.getInstance();
if (update) {
// TODO update params
}
%>
<html>
<head>
<title><fmt:message key="hello.title" /></title>
<meta name="pageID" content="jpush-setting" />
</head>
<body>
<p>
<fmt:message key="hello.info" />
</p>
</body>
</html>
注意:jsp调试目前没有找到方法,仅能通过日志的方式进行调试.
web接口插件开发
在 [WEB-INF] 目录下 web-custom.xml 则是对 servlet 等动态注册的配置页面,类似 Tomcat 中的 web.xml 配置, 如下两种方式进行配置:
- Servlet 注册
比如 Fastpath 插件下的 servlet 配置如下:
<?xml version='1.0' encoding='ISO-8859-1'?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- Servlets -->
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>org.jivesoftware.openfire.fastpath.ImageServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SoundServlet</servlet-name>
<servlet-class>org.jivesoftware.openfire.fastpath.SoundServlet</servlet-class>
</servlet>
<!-- Servlet mappings -->
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/getimage</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SoundServlet</servlet-name>
<url-pattern>/getsound</url-pattern>
</servlet-mapping>
</web-app>
- JerseyWrapper 配置
比如 mucservice 中配置 JerseyWrapper 的方式如下:
<?xml version='1.0' encoding='ISO-8859-1'?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- Servlets -->
<servlet>
<servlet-name>JerseyWrapper</servlet-name>
<servlet-class>org.jivesoftware.openfire.plugin.servlet.JerseyWrapper</servlet-class>
</servlet>
<!-- Servlet mappings -->
<servlet-mapping>
<servlet-name>JerseyWrapper</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
运行时数据区——方法区
在Java虚拟机中, 关于被装载类的信息存储在一个逻辑上被称为方法区的内存中。 当虚拟机加载某个类型时,它使用类加载器定位相应的class文件,然后读入这个class文件——一个线性二进制数据流,然后将它传输到虚拟机中 ,紧接者虚拟机提取其中的类型信息, 并将这些信息存储到方法区。该类型中的类(静态)变量同样也是存储在方法区中。 由于所有线程都共享方法区, 因此它们对方法区数据的访问必须被设计为是线程安全的 。假设同时有两个线程都企图访问一个类, 而这个类还投有被装入虚拟机, 那么,这时只应该有一个线程去加载它,而另一个线程则只能等待。 方法区的大小不必是固定的, 虚拟机可以根据应用的需要动态调整。同样, 方法区也不必是連续的, 方法区可以在一个堆(甚至是虚担机自已的谁)中自由分配。 另外, 虚拟机也可以允许用户或者程序员指定方法区的初始大小以及最小和最大尺寸等 。 方法区也可以被垃圾收集, 因为虚拟机允许通过用户定又的类加载器来动态扩展Java程序, 因此一些类也会成为程序“不再引用”的类。当某个类变为不再被引用的类时, Java虚拟机可以卸裁这个类(垃圾收集),从而使方法区占据的内...
-
下一篇
记一次MongoDB 数据乱码处理问题
公司前端组正在进行前后端分离,需要有后台接口提供,公司也没有搭建可用的Mock服务器,正好自己有现成的Flask做的一个小Demo, 现在Docker 又用的还可以,所以,二话不说后台接口我来提供。借助自己的阿里云搭起了我的微服务架构之路。 Flask 走起 Flask 提供的API相当简单,完全服务微服务架构的设计理念,我们规划做的是一个图书列表的管理,涉及到图书列表,详情,新增,删除; API 设计如下 @app.route('/books') def books(): return book_model.get_books() @app.route('/books/<string:book_id>') def book(book_id): ...... @app.route('/books/add', methods=['GET']) def add(): ...... @app.route('/books/<string:book_id>/delete') ...... 错误 在处理从数据库里面拿到的数据传到前端的时候就变成unicode编码了,中文全部...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程