当前位置: 首页 > >

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

发布时间:

??? 众所周知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包。对不同的包分发路由进行不同的处理。



友情链接: