基于openfire源码开发插件

【0】README
1)本文旨在 简述如何 基于openfire源码开发插件, 如何导入 openfire源码到 eclipse,参见 http://blog.csdn.net/pacosonswjtu/article/details/51871622
2)also , you can checkout  source code of the plugin from  https://github.com/pacosonTang/MultimediaMessagingPlatform/tree/master/plugin_cluster/plugindemo/src


【1】开发openfire插件步骤
step1)建立插件目录树(插件名称==plugindemo


补充1)各个目录树的目录项的意义:

补充2)目录树的缩略图如下


step2)添加 java 根目录到 source folder

step3)开发openfire插件,实现 Plugin接口

package com.myplugin;import java.io.File;import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.xmpp.packet.Packet;// 如果需要拦截消息,就必须实现  PacketInterceptor
public class PluginDemo implements PacketInterceptor, Plugin{private static PluginManager pluginManager;private InterceptorManager interceptorManager;public PluginDemo() {interceptorManager = InterceptorManager.getInstance();}@Overridepublic void interceptPacket(Packet packet, Session session,boolean incoming, boolean processed) throws PacketRejectedException {System.out.println("拦截消息以进行逻辑处理" + "from =" + packet.getFrom() + ", to = " + packet.getTo() + ", incoming = " + incoming + ", proccessed = " + processed);System.out.println("\n=========================");}@Overridepublic void destroyPlugin() {interceptorManager.removeInterceptor(this);System.out.println("PluginDemo Plugin has been destroyed.");}@Overridepublic void initializePlugin(PluginManager manager, File pluginDirectory) {interceptorManager.addInterceptor(this);pluginManager = manager;			System.out.println("PluginDemo Plugin has been installed successfully.");}
}
step4)可选的,如果你觉得有必要的话,还可以在插件中嵌入 servlet;

package com.myplugin.manager;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class PluginDemoServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/plain");PrintWriter out = response.getWriter();System.out.println("console info: 请求SampleServlet GET Method");out.println("GET Method: these info are transmitted into client.");out.flush();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// super.doPost(request, response); // should be commented outresponse.setContentType("text/plain");PrintWriter out = response.getWriter();System.out.println("请求 PluginDemoServlet POST Method");out.print("请求 PluginDemoServlet POST Method");out.flush();}@Overridepublic void init() throws ServletException {System.out.println("servlet init successfully.");}
}
step4)补充: 添加servlet映射

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE web-app  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  "http://java.sun.com/dtd/web-app_2_3.dtd">  <web-app><servlet>  <servlet-name>SampleServlet</servlet-name>  <servlet-class>com.myplugin.manager.PluginDemoServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>SampleServlet</servlet-name>  <url-pattern>/myservlet</url-pattern>  </servlet-mapping>
</web-app>
step5)可选的,你也可以开发一些jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>plugin demo page.</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="pageID" content="sample-service"/> <!-- 这个是必须的,同 plugin.xml 中引用的标识符必须一样. --></head><body><h3>hello world. <a href="<c:url value="/plugins/plugindemo/myservlet"/>">plugin demo servlet</a></h3><div class="jive-contentBoxHeader">jive-contentBoxHeader</div><div class="jive-contentBox">jive-contentBox</div><div class="jive-table"><table cellpadding="0" cellspacing="0" border="0" width="100%"><thead><tr><th>name</th><th>age</th><th>stuid</th></tr></thead><tbody><tr class="jive-odd"><td align="center">zhangsan</td><td align="center">35</td><td align="center">2014210541</td></tr><tr class="jive-even"><td align="center">lisi</td><td align="center">67</td><td align="center">2014110321</td></tr><tr class="jive-odd"><td align="center">wangwu</td><td align="center">12</td><td align="center">2015117891</td></tr></tbody></table></div></body>
</html>
step5)补充:在jsp中 请求 该 servlet
<h3>hello world. <a href="<c:url value="/plugins/plugindemo/myservlet"/>">plugin demo servlet</a></h3>
step6)编写插件配置文件 plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin><!-- Main plugin class  这里是最重要滴,就是你的插件的全路径--><class>com.myplugin.PluginDemo</class><!-- Plugin meta-data --><name>plugindemo</name><description>This is the my plugindemo.</description><author>pacoson</author><version>1.0</version><date>29/07/2016</date>    <minServerVersion>4.0.2</minServerVersion><licenseType>gpl</licenseType><adminconsole><tab id="tab-server"><sidebar id="sidebar-server-settings"><item id="plugindemo-service" name="my plugin demo" url="plugindemo-service.jsp"description="plugindemo-service plugin." /></sidebar></tab>    </adminconsole>
</plugin>
【2】编译插件并打包为jar copy到 openfire 插件目录下
1)编译打包后的效果

2)通过ant 编译插件的步骤(其实很简单,因为 openfire 自带 编译模板,如果要自己写的话,那就有点复杂了)
step1)根目录\build.properties, 填写 插件名称 到 合适位置


step2)右键build.xml -> run as -> ant build(有两个ant build,选择第2个),运行 ant 脚本 编译即可,编译后的结果 在 本章节已经说明了;


【3】查看访问效果



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享18道Java基础面试笔试题

转载自 分享18道Java基础面试笔试题&#xff08;面试实拍&#xff09; 1.你最常上的两个技术站和最常使用的两个app分別进什么&#xff1f;主要解决你什么需求&#xff1f; 2.请简述http协议中get请求和post请求的区别. 3.请简述session和cookie的区別. 4.简述Servlet与JSP的关…

xmpp协议框架包介绍:org.xmpp.packet.Packet+JID+PacketInterceptor+Session

【1】org.xmpp.packet.Packet&#xff08;数据包&#xff09;&#xff1a;1&#xff09;intro&#xff1a; 一个 XMPP数据包&#xff08;也被称为 数据节&#xff09;。每个数据包由 dom4j 元素来支持。有一系列易于操作元素&#xff08;Element&#xff09;的便捷方法&#xf…

Dubbo面试题锦集

转载自 Dubbo面试题锦集1、默认使用的是什么通信框架&#xff0c;还有别的选择吗?2、服务调用是阻塞的吗&#xff1f;3、一般使用什么注册中心&#xff1f;还有别的选择吗&#xff1f;4、默认使用什么序列化框架&#xff0c;你知道的还有哪些&#xff1f;5、服务提供者能实现失…

spring-boot--整合thymeleaf模板

http://blog.csdn.net/li396864285/article/details/53811527

Zookeeper面试题锦集

转载自 Zookeeper面试题锦集1、zookeeper是什么框架&#xff1f;2、有哪些应用场景&#xff1f;3、使用什么协议&#xff1f;4、说说分布式一致性算法Paxos5、说一说选举算法及流程6、zookeeper有哪几种节点类型&#xff1f;7、zookeeper对节点的watch监听通知是永久的吗&#…

ReviewForJob(1)数据结构与算法分析引论

【1】 数学基础1.1&#xff09;本书将使用以下4个定义&#xff1a; 对上述定义的分析&#xff08;Analysis&#xff09;&#xff1a; - A1&#xff09;第一个定义是说T&#xff08;N&#xff09;的增长率小于等于f&#xff08;N&#xff09;的增长率&#xff1b;- A2&#x…

Spring MVC+layui(基于bootstrap)+t 新增功能(页面和数据传递)

为开发的规范&#xff0c;更易于扩充&#xff0c;将新增与列表页分开为:list.html、add.html list.html:<!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"> <head> <meta charset"utf-8"></meta> <meta name&…

2017派卧底去阿里、京东、美团、滴滴带回来的面试题

转载自 2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案一&#xff0c;阿里巴巴面试题二&#xff0c;京东面试题三&#xff0c;美团面试题四&#xff0c;滴滴面试题五&#xff0c;本次卧底面试得到的结论通过面试题来看&#xff0c;可以看出目前互联网公司面试考点为&…

ReviewForJob(2)算法分析

【0】README1)本文旨在review 算法分析的几个算法问题 附带源码&#xff1b;【1】最大子序列和问题的解&#xff08;两种解法——分治法联机算法&#xff08;推荐&#xff09;&#xff09;【1.1】分治法1&#xff09;intro&#xff1a;其思想是把问题分成两个大致相等的子问题&…

java并行程序基础

1 进程 1 进程和线程之间的关系&#xff1a;进程是线程的容器。2 线程 1 线程的执行流程&#xff1a; **线程调用start(&#xff09;**方法时&#xff0c;表示线程开始执行&#xff1b;当线程执行时&#xff0c;处于RUNNABLE状态&#xff0c;表示线程所需的一切资源都准备好了…

ReviewForJob(3)表、栈和队列

【0】表ADT1&#xff09;intro&#xff1a;我们把 形如 A1, A2, A3, ..., An 的结构称为表&#xff1b;2&#xff09;表的实现&#xff1a; 数组&#xff08;循环数组&#xff09; 或 链表 或 双链表 或 循环链表实现&#xff1b;3&#xff09;表的插入&#xff0c;删除操作可以…

2017一季度JAVA面试题锦集

转载自 2017一季度JAVA面试题锦集 1、如何实现分布式事务&#xff0c;你们公司是怎么解决的&#xff1f; 2、HashMap数据结构及实现原理&#xff0c;其链表是用来解决什么问题的 3、可以自定义java.lang.String类吗&#xff0c;说明为什么 4、redis 1&#xff09;有哪几种类型的…

JDK并发包

JDK提供了大量实用的API和框架&#xff0c;来支持JDK内部功能&#xff1a; 介绍更多多线程控制方法&#xff0c;比如之前的synchronized&#xff1b;介绍JDK中对线程池的支持&#xff0c;提高线程调度性能&#xff1b;向大家介绍JDK的一些并发容器。 1 多线程的团队协作&…

ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列

【0】README 0&#xff09;希尔排序是基于插入排序的。将插入排序算法 内for循环中的所有 1 改为增量就可以。。bingo。。 插入排序源码 1&#xff09;本文旨在给出 希尔排序&#xff08;缩小增量排序&#xff09;之塞奇威克增量序列 的源码实现&#xff1b; 2&#xff09;为…

稍微有点难度的10道java面试题,你会几道?

转载自 稍微有点难度的10道java面试题&#xff0c;你会几道&#xff1f; 1、jvm对频繁调用的方法做了哪些优化&#xff1f; 2、常见的攻击手段有哪些&#xff1f;如何防范&#xff1f; 3、restful api有哪些设计原则&#xff1f; 4、hessian是做什么用的&#xff1f;它的…

重新学习Spring一--Spring在web项目中的启动过程

1 Spring 在web项目中的启动过程 Spring简介 Spring 最简单的功能就是创建对象和管理这些对象间的依赖关系&#xff0c;实现高内聚、低耦合。&#xff08;高内聚&#xff1a;相关性很强的代码组成&#xff0c;既单一责任原则&#xff1b;低耦合&#xff1a;耦合指块间联系&…

ReviewForJob——堆排序

【0】README1&#xff09;本文旨在给出 推排序的源码实现&#xff1b;堆排序是基于二叉树的数组实现的&#xff1b;【1】堆排序步骤step1&#xff09;对排序数据建堆&#xff0c;执行 n 次 insert 操作&#xff08;基于上滤操作&#xff09;&#xff1b;每次 insert 包括 将 新…

重新学习Spring2——IOC和AOP原理彻底搞懂

一、AOP 1 Spring AOP 的实现原理 是对OOP编程方式的一种补充。翻译过来为“面向切面编程”。 1 AspectJ是静态代理的增强&#xff1a;所谓静态代理就是AOP框架会在便一阶段生成AOP代理类&#xff0c;也叫编译器增强。 2 使用Spring AOP 与AspectJ 的静态代理不同&#xff0c…

厉害了,关于String的10道经典面试题

转载自 厉害了&#xff0c;关于String的10道经典面试题 1、String是基本数据类型吗&#xff1f; 2、String是可变的话&#xff1f; 3、怎么比较两个字符串的值一样&#xff0c;怎么比较两个字符串是否同一对象&#xff1f; 4、switch中可以使用String吗&#xff1f; 5、String …