本文翻译自 - http://www.tigase.org/content/component-implementation-lesson-1-basics
Tigase组件是一个具有jid的实体。它可以接受/处理也可以产生packet。
举一些大家都知道的组件:MUC-多人聊天室或者PubSub-内容订阅。在Tigase服务器当中,所乎所有的东西实际上都是一个组件:Session Mananger/s2c connection manager/Message Router等等。组件基于服务器配置信息被加载,新添加的组件可以运行时被服务器加载和激活。你可以简单的在配置文件中修改类名来替换一个组件。
开发组件是Tigase开发过程中的一个必不可少的部分,在过程中可以使用很多现成的API和代码,让工作变得简单。下面的文档会帮助你熟悉现有的API,让组件开发更有效率。
组件实现第一节 - 开发基础
Tigase组件的开发很简单,使用现成的API可以让你只用简单几行代码就开发出功能强大的组件。你可以在很多地方找到API描述文字。这一系列课程使用代码样例来传授如何使用尽可能简单的代码和现成API来产生预期的效果。
Even though all Tigase components are just implementations of ServerComponent interface I will keep such a low level information to necessary minimum.基于实现接口来创建组件是可行的,但不够高效。我们的目的是教会你如何使用现成的代码,只需要简单的几段代码。
这就是第一课,第一课囊括了组件实现的基础知识。我们现在创建一个组件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import java.util.logging.Logger;
import tigase.server.AbstractMessageReceiver;
import tigase.server.Packet;
public class TestComponent extends AbstractMessageReceiver {
private static final Logger log = Logger.getLogger(TestComponent.class.getName());
@Override
public void processPacket(Packet packet) {
log.finest("My packet: "+ packet.toString());
}
}
|
extend AbstractMessageReceiver 抽象类唯一需要做的事情就是实现 void processPacket(Packet packet) 方法。这其实是组件处理packet的真正逻辑处理代码实现。类的名字是TestComponent。
只使用这么几行代码就完成了一个全功能的tigase组件,可以被加载到Tigase服务器,可以接收并处理packet,可以输出服务发现信息,可以对管理器的ad-hoc指令做出应答,支持脚本,生成统计信息,可以被部署为外部组件等。
在为接口实现添加更多功能之前,我们先对组件进行配置,确保在服务下一次启动的时候组件能够被顺利加载。假如init.properties文件是这样的:
1
2
3
4
5
6
7
8
9
10
|
config-type = --gen-config-def
--debug = server
--user-db = derby
--admins = admin@devel.tigase.org
--user-db-uri = jdbc:derby:/Tigase/tigasedb
--virt-hosts = devel.tigase.org
--comp-name-1 = muc
--comp-class-1 = tigase.muc.MUCComponent
--comp-name-2 = pubsub
--comp-class-2 = tigase.pubsub.PubSubComponent
|
配置文件当中已经有了两个组件muc和pubsub,现在我们添加第三个——我们自己的新组件:在后面添加两行配置项。
1
2
|
--comp-name-3 = test
--comp-class-3 = TestComponent
|
现在需要删除etc/tigase.xml,然后重启。
查看组件是否被服务器加载有几种方法,最简单的一种是通过XMPP客户端使用管理员帐号连接到服务器,然后查看服务发现列表。如果一切正常的话,你应该看到如图所示的一个列表,组件的描述信息是“未定义的描述”,这是一个默认的描述信息,我们可以在后面来对这个信息进行修改,组件的默认JID是“test@devel.tigase.org”,“devel.tigase.org”是域名,“test”是组件的名称。
另外一个方法是借助日志来看组件是否已经被加载。养成使用日志查看系统运行信息的习惯对于tigase的开发是非常有帮助的。日志文件存放于logs文件夹,logs/tigase.log.0的内容如下,如果组件已经被加载,你会看到类似于下面的信息:
1
2
3
4
5
|
MessageRouter.setProperties() FINER: Loading and registering message receiver: test
MessageRouter.addRouter() INFO: Adding receiver: TestComponent
MessageRouter.addComponent() INFO: Adding component: TestComponent
MessageRouter.addComponent() FINER: Adding: test component to basic-conf registrator.
Configurator.componentAdded() CONFIG: component: test
|
如果你的组件没有被加载,那么首先应该检查的是配置文件。也许在启动tigase服务之前忘记了删除tigase.xml文件,或者是TestComponent没有正确得被放置到类路径下。
如果一切正常,就像第一张图片展示的那样,已经可以看到刚开发的组件。在组件上面双击,会弹出一个ad-hoc(管理器脚本)命令窗口。就像下图那样,窗口里应该只有两个选择——增加和删除。
命令列表
还可以在服务发现窗口里面查看新组件的统计信息,点击新组件就可以看到,它是非常基本的packet计数器。
正如你所看到的,简单的几行代码就已经可以开发出功能强大的组件了。现在,你也许会问,这个组件能做些什么事情吗?比如接收和处理packet。使用你最熟悉的xmpp客户端向test@devel.tigase.org(如果你将你的domain设置为devel.tigase.org)发送一个消息看看会发生什么,根据processPacket(…) 当中的代码,它会把发送的消息打印日志。在测试中我发送了一个标题为“test message” body体为“this is a test”的消息,日志文件应该会包含有下面的项:
1
2
3
4
5
|
TestComponent.processPacket() FINEST: My packet: to=null, from=null,
data=
test message
this is a test
, XMLNS=jabber:client, priority=NORMAL
|
我们现在确定了所有的事情都如我们预期的那样,现在我们可以在processPacket(…)方法里面填充一些有意义的代码了。