1.由org.jivesoftware.openfire.nio.ConnectionHandler里的public void messageReceived(IoSession session, Object message)方法接收发送方的消息
从当前session中获取StanzaHandler的实例对象handler,并用handler的process(String stanza, XMPPPacketReader reader)方法,然后用void process(Element doc),该方法根据消息的类别(error,message,presence,iq)作 不同处理,这里是走message的处理逻辑
2.步骤1进入org.jivesoftware.openfire.net.StanzaHandler类中的protected void processMessage(Message packet)方法,该方法用来处理收到的消息包,该方法的注释说注册了接口org.jivesoftware.openfire.interceptor.PacketInterceptor
的方法会被调用---在数据包被路由之前和之后
3.步骤2中会调用org.jivesoftware.openfire.spi.PacketRouterImpl类中的void route(Message packet),该方法又调用了org.jivesoftware.openfire.MessageRouter类中的void route(Message packet),该方法的注释:执行真正的数据包路由,路由通常被认为是很快的,但是实际情况下如果需要很长时间来完成路由,为了让该方法能够迅速返回,这时需要通过另起一个线程来完成路由操作。


4.org.jivesoftware.openfire.interceptor.InterceptorManager拦截器管理器执行具体的拦截操作(拦截的处理顺序与拦截器加入的顺序相关)

5.接下去调用org.jivesoftware.openfire.spi.RoutingTableImpl类里的void routePacket(JID jid, Packet packet, boolean fromServer)

该方法的官方注释

6.最后执行路由失败的逻辑

网友评论