初看Tigase的packet内部流转机制一开始不是太明白。里面用到了较多的线程,代码不太看得懂。慢慢的通过一条消息的请求和响应的代码跟踪分析,搞清楚了消息流转的过程。
前言
本文使用Tigase Server version:7.0.2 进行的代码跟踪和分析。
使用工具:IntelliJ IDEA14.1.4
Tigase通过tigase.io包当中的代码读取网络中的字节数组,然后通过tigase.net包当中的类把字节数组转换为字符,最后通过tigase.xml包当中的XML解析器把这些字符转换成XML DOM对象。
图片流程说明
看tigase源码你会发现所有的tigase处理都是基于多线程,每个component都有自己的in和out处理线程,线程间的数据传输通过queue
总的流程大致就是:
文字流程说明
下面是请求和响应的步骤说明(只列出了关键的步骤)。
A. 从client到server的过程(请求-Request)
ClientConnectionManager和MessageRouter都间接或直接继承了AbstractMessageReceiver。
tigase.server.AbstractMessageReceiver – 它已经实现了四个接口:ServerComponent,MessageReceiver,Configurable和StatisticsContainer。
它通过自己的多个线程来管理内部数据队列,且能避免死锁。
它使用事件驱动的方式来处理数据,当packet被发送到AbstractMessageReceiver实例的abstract void processPacket(Packet packet)方法时,就立即启动了packet的处理工作。当然你还是需要实现抽象类当中的抽象方法,如果你还希望输出packet数据(例如当它收到请求时还需要发送响应),可以调用boolean addOutPacket(Packet packet)方法。
a. XMPPIOService负责接收客户端报文并转换为对应的packet放入队列receivedPackets(相当于in_queues)中,而SocketThread负责创建ReadThread和WriteThread线程,ResultsListener则是SocketThread的一个内部类。ResultsListener负责调度socketReadThread()和socketWriteThread(), Client2Server读取和写入数据包的IO操作主要由XMPPIOService来完成,XMPPIOService实例则在read和write线程中被使用。
b. ClientConnectionManager则负责从XMPPIOService获取receivedPackets,并对收到的报文进行处理,并将处理后的报文放入MessageRouter的out_queues队列中。