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

内部与外部组件介绍

  在openfire中的许多插件都实现了Compoent,Compoent的灵活性在于它可以通过对特定的二级子域包进行处理。在XMPP协议中最为明显的使用场景就是群聊,这就是一个典型的例子。看看openfire中的聊天室JID都是什么格式:room1@conference.domain,很明这里多了一个conference。对比用户的JID:user1@domain。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("test1@robot." + connection.getServiceName());
msg.setBody("hello robot");
try {
connection.sendStanza(msg);
} catch (NotConnectedException e) {
System.err.println("send error." + e.getMessage());
}
}

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

  1. openfire spark 二次 开发 服务插件

    ====================  废话 begin   ============================ 最近老大让我为研发平台增加即时通讯功能.告诉我用comet 在web端实现即 ...

  2. vue.js组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...

  3. 基于TypeScript的FineUIMvc组件式开发(概述)

    WebForm与Mvc 我简单说一下WebForm与Mvc,WebForm是微软很早就推出的一种WEB开发架构,微软对其进行了大量的封装,使开发人员可以像开发桌面程序一样去开发WEB程序,虽然开发效率 ...

  4. vue(9)—— 组件化开发 - webpack(3)

    前面两个终于把webpack相关配置解析完了.现在终于进入vue的开发了 vue组件化开发预热 前期准备 创建如下项目: app.js: footer.js: main.js: webpack.con ...

  5. vue从入门到进阶:组件Component详解(六)

    一.什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功 ...

  6. Vue 入门之组件化开发

    Vue 入门之组件化开发 组件其实就是一个拥有样式.动画.js 逻辑.HTML 结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue 的组件和也做的非常 ...

  7. vue组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了一下的内容.首先会对使用Vue进行开发的一些前期需要的技术储备进行简单 ...

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

    採用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发反复功能时.能够利用已有的组件库高速开发.对于开发者而言仅仅须要简单配置流程就能够完毕工作了.开发增删 ...

  9. Vue教程:组件Component详解(六)

    一.什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功 ...

随机推荐

  1. ASP.NET Core 1.1.0 Release Notes

    ASP.NET Core 1.1.0 Release Notes We are pleased to announce the release of ASP.NET Core 1.1.0! Antif ...

  2. .NET面试题系列[8] - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...

  3. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  4. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  5. 理解nodejs模块的scope

    描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...

  6. H5程序员如何利用cordova开发跨平台应用

    什么是Cordova? Cordova以前也叫PhoneGap,它提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还 ...

  7. 如何利用pt-online-schema-change进行MySQL表的主键变更

    业务运行一段时间,发现原来的主键设置并不合理,这个时候,想变更主键.这种需求在实际生产中还是蛮多的. 下面,看看pt-online-schema-change解决这类问题的处理方式. 首先,创建一张测 ...

  8. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  9. 体验报告:微信小程序在安卓机和苹果机上的区别

    很多人可能会问:微信小程序和在微信里面浏览一个网页有什么区别? 首先,小程序的运行是全屏的,界面跟进入了一个APP很像,更为沉浸跟在微信里面访问h5不一样:其次,它的浏览体验更为稳定. 不过,这还不够 ...

  10. 【干货分享】流程DEMO-资产请购单

    流程名: 资产请购  业务描述: 流程发起时,会检查预算,如果预算不够,流程必须经过总裁审批,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金额的预算.  流程相关文件: 流程 ...