您的位置:首页 > 运维架构

Openfire源码分析----消息处理流程

2014-12-24 16:03 441 查看
    众所周知Openfire是基于mina编写的。因此直接找到ConnectionHandler,这个类继承IoHandlerAdapter。

熟悉mina的会知道接受消息并处理的方法为messageReceived。我们也只关心这个方法:

@Override

 public void messageReceived(IoSession session, Object message) throws Exception {

        // Get the stanza handler for this session

        StanzaHandler handler = (StanzaHandler) session.getAttribute(HANDLER);

        // Get the parser to use to process stanza. For optimization there is going

        // to be a parser for each running thread. Each Filter will be executed

        // by the Executor placed as the first Filter. So we can have a parser associated

        // to each Thread

        int hashCode = Thread.currentThread().hashCode();

        XMPPPacketReader parser = parsers.get(hashCode);

        if (parser == null) {

            parser = new XMPPPacketReader();

            parsers.put(hashCode, parser);

        }

        // Update counter of read btyes

        updateReadBytesCounter(session);

        //System.out.println("RCVD: " + message);

        // Let the stanza handler process the received stanza

        try {

            handler.process((String) message, parser);

        } catch (Exception e) {

            Log.error("Closing connection due to error while processing message: " + message, e);

            Connection connection = (Connection) session.getAttribute(CONNECTION);

            connection.close();

        }

    }

这个方法会调用StanzaHandler的process进行消息路由。

判断是否为权限包、消息包、状态包或者IQ包。对不同的包分发路由进行不同的处理。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: