修改tigase配置文件
--cluster-mode = false config-type = --gen-config-def --cluster-nodes = xumatoMacBook-Pro.local --debug = server,xmpp.impl,db,cluster --user-db = derby --admins = [email protected] --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); } } }
config-type = --gen-config-comp --debug = server --user-db = derby --admins = [email protected] --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
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即可,负载均衡按照上面自定义的那个执行。