openfire的组件(Component)开发

在之前的文章《Openfire阶段实践总结》中提到过一种openfire的扩展模式Compoent。本文将主要探讨对这种模式的应用与开发方法。

内部与外部组件介绍

  在openfire中的许多插件都实现了Compoent,Compoent的灵活性在于它可以通过对特定的二级子域包进行处理。在XMPP协议中最为明显的使用场景就是群聊,这就是一个典型的例子。看看openfire中的聊天室JID都是什么格式:[email protected],很明这里多了一个conference。对比用户的JID:[email protected]。openfire通过一个注册路由器来为这种子域提供路由功能。

  这种机制带来了一个很灵活的扩展场景,就是你可以完全定义一套自己的协议处理,使得openfire作为一个消息中转中心而存在。在自己的组件内部可以实现更多的复杂的业务。

当然为了扩展的更丰富,openfire提供了内部与外部组件两种方式

  • 内部组件,主要是以插件的形式,jar包的形式。内部组件可以和主域有同样的访问和控制权限。比如你想获取主域中的所有用户那是可以的。
  • 外部组件,可是独立的一个应用程序,以tcp形式连接到openfire中,当然就不能获取到主域中的资源啦。

这两种组件的应用场景各有不同,内部组件可以与主域实现的比较紧密,基本上就是openfire一部分,比如你想扩展群聊为QQ形式的群,就可以使用内部组件来实现。而如果业务系统集成需要集成openfire的一些功能时,就可以选择外部组件模式,这样就要方便的多啦。比如你的商城需要有一个在线客户机器人,那么就可以选择外部组件。

主要的开发包

在openfire中提供了两个开发包,tinder和whack。

  • tinder

  主要封装了XMPP协议的基础包,JAVA开发的。在openfire中就引用了这个包,所以基本上服务端中使用这个协议包。

  • whack

  在tinder基础上提供了外部组件开发的一个开发包,使开发人员更方便的搭建openfire的外部组件。

这说明tinder是一个核心,这样也更好的用于各类项目,包括openfire自己。而whack更像是一个工具包,用于外部组件快速开发的东西,方便的集成到java项目中。tinder和whack都是maven包,这样对于maven项目就方便多啦。不像openfire是ant的,最初还挺不习惯的。

实现简单的机器人

那么实现一个简单的自动回复机器人,以此来展示一下组件的开发方法。

1、创建一个机器人,这个机器人主要是实现了自动回复的功能,所以机器人比较笨,只会说三句话,而且只能随机的回复。代码如下:

package org.jivesoftware.demo;

import java.util.Random;

import org.xmpp.packet.Message;

public class RobotService {
    private static final RobotService INSTANCES = new RobotService();
    private String[] autoReply = {"你好我是机器人大G,很高兴与你聊天", "哦,你说什么?", "下次再来吧,今天有点忙。"};

    private RobotService() {

    }

    private String getAutoReply() {
        Random random = new Random();
        Integer idx = random.nextInt(autoReply.length);
        return autoReply[idx];
    }

    public synchronized static RobotService getInstance () {
        return INSTANCES;
    }

    public Message Reply(Message msg) {
        Message reply = new Message();
        reply.setID(msg.getID());
        reply.setTo(msg.getFrom());
        reply.setFrom(msg.getTo());
        reply.setType(Message.Type.chat);
        reply.setBody(getAutoReply());
        return reply;
    }
}

机器人会自动从自己学会的语言中找一句回复。

2、实现外部组件

因为机器人自动回复并不需要与openfire内部作太多的交互,所以只需要做一个外部的组件即可。将前方发来的消息都转到特定的机器人组件中处理即可。这里需要的是实现AbstractComponent抽象类。

package org.jivesoftware.demo;

import org.xmpp.component.AbstractComponent;
import org.xmpp.packet.Message;

public class RobotComponent extends AbstractComponent{
    private String name;
    private String serverDomain;

    public RobotComponent(String name, String serverDomain) {
        this.name = name;
        this.serverDomain = serverDomain;
    }

    @Override
    public String getDescription() {
        return "我是一个机器人";
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    protected void handleMessage(Message message) {
        if ((message.getBody() == null)) {
            return;
        }
        //使用机器人回复
        Message reply = RobotService.getInstance().Reply(message);
        send(reply);
    }

}

这里要说明的是AbstractComponent这个抽象类,此类是tinder中为了简化Component的开发而提供的。其实就是对IQ、Mesage、disco等包的处理做了封装并提供了重写方法给派生类实现。开发者只需要关心具体的实现即可,不用关心协议的解析与处理。而如果直接实现Component接口的话就要逐一的去解析协议命名空间,再具体的进行处理。

由于机器人这个应用中只是简单的自动回复,所以只需要实现handleMessage方法即可。这个方法会自动获取到发送过来的Message数据包。而我们只需要将机器人回复的消息再发回给发送者即可。

3、将外部组件注册到openfire

这个比较简单,直接看代码:

package org.jivesoftware.demo;

import org.jivesoftware.weather.WeatherComponent;
import org.jivesoftware.whack.ExternalComponentManager;
import org.xmpp.component.ComponentException;

public class RobotDemoServer {
    public static void main(String[] args) {
        final ExternalComponentManager manager = new ExternalComponentManager("localhost", 5275);
        manager.setSecretKey("robot", "test");
        manager.setMultipleAllowed("robot", true);
        try {
            manager.addComponent("robot", new RobotComponent("robot", manager.getServerName()));

            //使程序不要退出
            while (true) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } catch (ComponentException e) {
            e.printStackTrace();
        }
    }
}

这里面主要的是ExternalComponentManager,这个类是whack提供的一个用于连接到openfire组件服务的封装类。

服务器地址和端口中的端口是指外部组件访问端口,这个端口可以在openfire服务器设置。

setSecretKey是用于设置连接的密码,这个也要根据服务器的设置来填写。

服务器的设置如下图中:

然后启动试试吧,向这个机器人发送消息即可。

    public static void TestSendMessage() {
        Message msg = new Message("[email protected]" + connection.getServiceName());
        msg.setBody("hello robot");
        try {
            connection.sendStanza(msg);
        } catch (NotConnectedException e) {
            System.err.println("send error." + e.getMessage());
        }
    }
时间: 2024-11-08 20:14:20

openfire的组件(Component)开发的相关文章

openfire spark 二次 开发 服务插件

====================  废话 begin   ============================ 最近老大让我为研发平台增加即时通讯功能.告诉我用comet 在web端实现即时通讯. 最初狂搜集资料.不能让自己方向错了.这是很重要的. 不过还是难免的周折了一番.测试了一个comet4j的聊天小例子.用它前后端开发成本太大.对服务器也太大压力放弃了. 最终决定使用openfire +jsjac.js + JabberHTTPBind 然后实现老大要求的 web 及时通讯功

慕课网实战—《用组件方式开发 Web App全站 》笔记五-折线图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 折现图绘制大致步骤 折线图画布 JavaScript CSS 折线图绘制网格线 // 水平网格线 100份 -> 10份 var step = 10; ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = '#AAAAAA'; window.ctx = c

慕课网实战—《用组件方式开发 Web App全站 》笔记七-饼图和环图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 饼图开发(绘制饼图准备) 饼图实现原理 饼图开发(绘制饼图) 代码 /* 饼图组件对象 */ var H5ComponentPie =function ( name, cfg ) { var component = new H5ComponentBase( name ,cfg ); // 绘制网格线 - 背景层 v

慕课网实战—《用组件方式开发 Web App全站 》笔记四-柱状图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 柱图开发思路 水平柱图开发(HTML的DOM搭建) ???? ???? 水平柱图开发(CSS样式编写) /* 柱状组件样式 */ .h5_component_bar{ } .h5_component_bar .line{ height: 15px; font-size: 12px; line-height: 15p

《开源框架那点事儿23》:采用TinyDB组件方式开发

采用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发重复功能时,可以利用已有的组件库快速开发.对于开发人员而言只需要简单配置流程就可以完成工作了. 开发增删改查的组件接口.本来这部分很花费时间,如果采用组件复用的话,就可以实现一次开发,终生受益. 配置curd.beans.xml和tinydb.xml. 使用流程编辑器定制组件流程curd.pageflow. 修改页面文件:list.page和operate.page,使之符合流程方式调用. 修改布局

《开源框架那点事儿23》:採用TinyDB组件方式开发

採用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发反复功能时.能够利用已有的组件库高速开发.对于开发者而言仅仅须要简单配置流程就能够完毕工作了.开发增删改查的组件接口.本来这部分非常花费时间,假设採用组件复用的话,就能够实现一次开发,终生受益. 配置curd.beans.xml和tinydb.xml. 使用流程编辑器定制组件流程curd.pageflow. 改动页面文件:list.page和operate.page.使之符合流程方式调用. 改动布局

慕课网实战—《用组件方式开发 Web App全站 》笔记二

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 项目JS类开发 静态页思路验证 jQuery全屏滚动插件fullPage.js ??使用参考:Fullpage入门指南 组件切换,入场,出场动画 ???? DOM事件循环传播-无限循环 ??使用return false;或者triggerHander()方法阻止事件向上传播. 相关代码 HTML <body&

学习 | jQuery移动端页面组件化开发(一)

最近在学习移动端组件化开发web页面,其中有好多小细节,值的去思考. 主要介绍JS的思路,具体的代码就不贴了,主要是想表达出一种思路 总体来说 1.入口文件,在入口文件中导入插件,插件样式,jquery // 首先要有config参数 var config ={ // config } // 进行实例化 var H5 = new H5Component(config) // 插入DOM中 $(".container").append(H5) // 触发组件中的自定义事件 $("

Vue组件化开发

一. 通过axios实现数据请求 1. json简介 json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式. json的作用:在不同的系统平台,或不同编程语言之间传递数据. 1.1 json数据的语法 json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量,不支持undefined,值还可以是数组或者jso