openfire插件–外部组件开发
与外部交互
外部组件
openfire外部组件,就是与openfire所在的进程没有关系,甚至可以不与openfire在同一台机器上运行的组件,一般是一个可运行的jar包,我们叫做外部组件,使用tcp连接(类似客户端Socket的监听端口)与openfire之间进行通信,处理一些服务器需要处理的逻辑。目前可以使用Whack
和Tinder
连接操作。
Openfire的外部组件使用tcp连接与openfire之间进行通信。
- 发送消息到openfire,格式形如
<message to="x.myopenfire.com">内容</message>
。 - Openfire收到这条消息,发现了有一个二级域名
x.myopenfire.com
,它会在外部组件中寻找谁会处理这个域名的消息,发现了该外部组件并会转发给外部组件。 - 外部组件接受到这条消息,处理后再发回openfire,格式形如
<message to="userx@myopenfire.com" from="x.myopenfire.com">内容</message>
。 - openfire发到用户上。
配置
先配置子域名和密码,如下服务器端口默认为5275,子域名为chat,密码为123456。这里操作的是ofExtComponentConf
数据库表。
Java
外部组件使用Whack
(需自行编译jar包,ver2.0.1)连接openfire,类似Socket监听服务器端口。注意必须在openfire启动后在启动外部组件,不然会报错。这种方式相当于转发。
org.xmpp.component.ComponentException: internal-server-error
import org.jivesoftware.whack.ExternalComponentManager;
import org.xmpp.component.ComponentException;
public class Main {
public static void main(String[] args) {
ExternalComponentManager mgr = new ExternalComponentManager(
"192.168.43.42", 5275); //openfire的IP和相应的端口
mgr.setSecretKey("chat", "123456"); //设置子域和口令(密码)
try {
mgr.addComponent("chat", new ChatComponent());
} catch (ComponentException e) {
e.printStackTrace();
System.exit(-1);
}
// daemon
while (true) {
try {
Thread.sleep(10000);
} catch (Exception e) {
}
}
}
}
业务逻辑实现Component,在public void processPacket(Packet packet)
处理具体数据。
import org.xmpp.component.Component;
import org.xmpp.component.ComponentException;
import org.xmpp.component.ComponentManager;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
public class ChatComponent implements Component{
private static final String name="chat";
private static final String description="实现多人通过组件在区域内聊天";
private JID jid;
private ComponentManager comMgr;
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public void processPacket(Packet packet) {
System.out.println(packet.toXML());
}
public void initialize(JID jid, ComponentManager componentManager)
throws ComponentException {
this.jid=jid;