修改tigase配置文件
--cluster-mode = false
config-type = --gen-config-def
--cluster-nodes = xumatoMacBook-Pro.local
--debug = server,xmpp.impl,db,cluster
--user-db = derby
--admins = admin@xumatoMacBook-Pro.local
--user-db-uri = jdbc:derby:/Applications/Tigase-5.1.4/tigasedb
--virt-hosts = xumatoMacBook-Pro.local
--comp-class-1 = tigase.muc.MUCComponent
--comp-name-1 = muc
--sm-plugins = +jabber:iq:auth,+urn:ietf:params:xml:ns:xmpp-sasl,+urn:ietf:params:xml:ns:xmpp-bind,+urn:ietf:params:xml:ns:xmpp-session,+jabber:iq:register,+jabber:iq:roster,+presence,+jabber:iq:privacy,+jabber:iq:version,+http://jabber.org/protocol/stats,+starttls,+msgoffline,+vcard-temp,+http://jabber.org/protocol/commands,+jabber:iq:private,+urn:xmpp:ping,+basic-filter,+domain-filter,+pep,-zlib
--comp-name-2 = ext
--comp-class-2 = tigase.server.ext.ComponentProtocol
--external = guanfei.org:test:listen:5270:xumatoMacBook-Pro.local:accept:GuanfeiLB
配置开启5270端口,以xep-0114的accept方式,等待外部component接入,GuanfeiLB为自定义的load balance规则
--external = guanfei.org:test:listen:5270:xumatoMacBook-Pro.local:accept:GuanfeiLB
package tigase.server.ext.lb;
import java.util.ArrayList;
import tigase.server.Packet;
import tigase.server.ext.ComponentConnection;
import tigase.server.ext.ComponentIOService;
/**
* guanfei's lb
*
* @author guanfei
* @created 2013-1-21
*
* @version 1.0
*/
public class GuanfeiLB implements LoadBalancerIfc {
static int i = 0;
@Override
public ComponentIOService selectConnection(Packet p,
ArrayList<ComponentConnection> conns) {
ComponentIOService result = null;
int index = (++i) % 2;
ComponentConnection conn = conns.get(index);
if (conn.getService() != null && conn.getService().isConnected()) {
result = conn.getService();
}
return result;
}
}
编写外部component,建工程,加依赖
编写component类,打印点信息,直接信息恢复给发送者
package com.guanfei.comp;
import tigase.server.AbstractMessageReceiver;
import tigase.server.Packet;
/**
* Guanfei的component
*
* @author guanfei
* @created 2013-1-21
*
* @version 1.0
*/
public class GuanfeiComponent extends AbstractMessageReceiver {
@Override
public void processPacket(Packet arg0) {
System.out.println(arg0.getElemCData());
if ("message" == arg0.getElemName()) {
System.out.println(arg0.getFrom());
System.out.println(arg0.getTo());
Packet result = arg0.swapElemFromTo();
addOutPacket(result);
}
}
}
写component配置文件,以comp方式启动,即以组件方式启动,并以xep-0114连接到tigase server
config-type = --gen-config-comp
--debug = server
--user-db = derby
--admins = admin@guanfei.org
--user-db-uri = jdbc:derby:/Applications/Tigase-5.1.4/tigasedbGuanfei;create=true
--virt-hosts = guanfei.org
--comp-name-1 = guanfei
--comp-class-1 = com.guanfei.comp.GuanfeiComponent
--external = guanfei.org:test:connect:5270:xumatoMacBook-Pro.local:accept
启动后查看tigase server的日志输出
2013-01-21 19:36:10 ConnectionManager$ConnectionListenerImpl.accept() FINEST: Accept called for service: null@null
2013-01-21 19:36:10 ConnectionManager.serviceStarted() FINER: [[ext]] Connection started: null, type: accept, Socket: nullSocket[addr=/192.168.60.161,port=57141,localport=5270]
2013-01-21 19:36:10 ComponentProtocol.serviceStarted() FINEST: Connection started: 192.168.60.161, xmlns: jabber:component:accept, type: accept, id=192.168.60.161_5270_192.168.60.161_57141
2013-01-21 19:36:10 ComponentProtocol.serviceStarted() FINEST: cid: null, sending: null
2013-01-21 19:36:10 ComponentProtocol.xmppStreamOpened() FINEST: Stream opened: 192.168.60.161, xmlns: jabber:component:accept, type: accept, uniqueId=192.168.60.161_5270_192.168.60.161_57141, to=guanfei.org
2013-01-21 19:36:10 ComponentProtocol.xmppStreamOpened() FINEST: tigase.server.ext.handlers.ComponentAcceptStreamOpenHandler is processing request
2013-01-21 19:36:10 ComponentAcceptStreamOpenHandler.streamOpened() FINEST: CompRepoItem for guanfei.org set: guanfei.org:test:accept:5270:xumatoMacBook-Pro.local:accept:tigase.server.ext.lb.GuanfeiLB
2013-01-21 19:36:10 ComponentAcceptStreamOpenHandler.streamOpened() FINEST: ID generated and set: e9c0ccd9-55a7-42d9-97df-903508945d8b
2013-01-21 19:36:10 ComponentProtocol.xmppStreamOpened() FINEST: Sending back: <stream:stream xmlns='jabber:component:accept' xmlns:stream='http://etherx.jabber.org/streams' from='guanfei.org' id='e9c0ccd9-55a7-42d9-97df-903508945d8b'>
2013-01-21 19:36:10 ComponentProtocol.processSocketData() FINEST: Processing socket: null, type: accept, Socket: nullSocket[addr=/192.168.60.161,port=57141,localport=5270], data: null, type: accept, Socket: nullSocket[addr=/192.168.60.161,port=57141,localport=5270]
2013-01-21 19:36:10 HandshakeProcessor.process() FINEST: Calculating digest: id=e9c0ccd9-55a7-42d9-97df-903508945d8b, secret=test, digest=3eb494154a8d65c99b348ba308797b53fd89330e
2013-01-21 19:36:10 ComponentProtocol.updateRoutings() FINEST: All regex routings: [.*@guanfei.org, .*\.guanfei.org, guanfei.org]
2013-01-21 19:36:10 ComponentProtocol.bindHostname() FINE: Authenticated: guanfei.org
2013-01-21 19:36:10 BasicComponent.updateServiceDiscoveryItem() FINEST: Adding new item: <item name="ext-comp connected" jid="guanfei.org"/>
2013-01-21 19:36:10 ComponentProtocol.addComponentConnection() FINER: A new component connection added for: guanfei.org
2013-01-21 19:36:10 ConnectionManager.writePacketsToSocket() FINEST: null, type: accept, Socket: nullSocket[addr=/192.168.60.161,port=57141,localport=5270], Writing packet: from=null, to=null, DATA=<handshake/>, SIZE=12, XMLNS=null, PRIORITY=NORMAL, PERMISSION=NONE, TYPE=null
验证一下效果
外部组件集群,直接按照同样的配置在启动一个comp即可,负载均衡按照上面自定义的那个执行。