Tigase packet跨服务器流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w690333243/article/details/81984421

10.10.2.120服务器账号 [email protected] 发送消息给[email protected]
以下为log
https://download.csdn.net/download/w690333243/10638078

其中方法调用

Src/main/java/tigase/server/ConnectionManager.java 
private static ConnectionOpenThread connectThread = ConnectionOpenThread.getInstance();
->setProperties()
->addWaitingTask(port_props) ->reconnectService
->startService(port_props) ->addConnectionOpenListener

ConnectionManage.ConnectionListenerImpl
->cli.accept(SocketChanne sc)
->IO serv = getXMPPIOServiceInstance();
serv.accept(sc);  

->socketIO = new SocketIO(socketChannel);
IOInterface   getSocketChannel



ConnectionOpenThread : 实现了runnable接口,监听xmpp连接
getInstance(){new Thread(new ConnectionOpenThread()).start}
SocketThread.java
static
{new Thread(socketReadThread[i]).start}
run()
->completionService.submit(serv);
IOService.java 
->Call()  
-> serviceListener.packetsReady(this);
ConnectionManager.java
->packetsReady(IO serv)
->processSocketData(serv)

src/main/java/tigase/server/xmppclient/ClientConnectionManager.java
->processSocketData(serv)
->addOutPacket(p);

AbstractMessageReceiver.java
->addOutPacket(p);
->out_queues.get(queueIdx).put(packet, packet.getPriority().ordinal());
src/main/java/tigase/server/AbstractMessageReceiver.java
startThreads()
AbstractMessageReceiver.QueueListener.java extends Thread
run()
-> packet = queue.take();
-> processPacket(packet);

src/main/java/tigase/server/ConnectionManager.java
->writePacketsToSocket(serv, processSocketData(serv));
-> serv.addPacketToSend(p);
->serv.processWaitingPackets();
XMPPIOService.java
->processWaitingPackets()
Src/main/java/tigase/server/xmppsession/SessionManager.java
->handleLogin()

组件的getDefaults()方法调用流程
Src/main/java/tigase/server/XmppServer.java
->setConfig()
Src/main/java/tigase/server/MessageRouter.java
-> addRegistrator()
Src/main/java/tigase/server/AbstractComponentRegistrator.java
-> addComponent()
Src/main/java/tigase/conf/ConfiguratorAbstract.java
-> componentAdded()
->setup()
->component.getDefaults(getDefConfigParams()),component.setProperties(prop);
Src/main/java/tigase/server/xmppsession/SessionManager.java
->getDefaults() 

跨服务器的流程和本地路由基本与相似,
可以参考https://blog.csdn.net/Cancer_DD/article/details/38872497
不同点

MessageRouter.processPacket(Packet packet)部分代码如下:
@Override
    public void processPacket(Packet packet) {

        //getTo 方法取pcketTo的值,若为空,则取stanzaTo(中的to)
        if (packet.getTo() == null) {
            return;
        }    
        ...
        //匹配分发组件
        ServerComponent comp = getLocalComponent(packet.getTo());

        if (comp != null) {

            Queue results = new ArrayDeque();

            if (comp == this) {
                processPacketMR(packet, results);
            } else {
                ...
                comp.processPacket(packet, results);
            }
            ...
            return;//匹配本地组件成功
        }
ServerComponent[] comps = getComponentsForLocalDomain(host);

        if (comps == null) {

            // Still no component found, now the most expensive lookup.
            // Checking regex routings provided by the component.
            comps = getServerComponentsForRegex(packet.getTo().getBareJID().toString());
        }
        ...
    }

匹配本地组件不成功,Packet will be processed by: s2s@localhost,由AbstractMessageReceiver的非阻塞性方法addPacketNB(Packet packet)加入到out_queues。将调用s2s组件,即S2SConnectionManager.java代码中打开连接失败(120到130的连接)将会使用tcp协议建立和其的连接,连接建立后会回调IOService.handshakeCompleted() 方法

猜你喜欢

转载自blog.csdn.net/w690333243/article/details/81984421