XMPP的一些工做--續

    看來最近這段時間我和xmpp是幹上了。今天要寫一點關於xmpp pubsub的一些認識。java

    服務器用openfire3.7.1node

    咱們都知道XMPP pubsub的功能很強大。能夠用來完成很是多的功能。正好最近在開發一些服務器端的應用用到了pubsub的功能。而後對openfire的pubsub實現有了一些瞭解。算法

    我用一個例子來講明具體的流程:客戶端publish它的狀態信息。服務器端的應用subscribe客戶端的狀態信息。服務器收到publish消息後,發送notification給應用。     編程

    NodeAffiliate.java中sendPublishedNotifications方法就是整個流程中關鍵的入口。它調用了sendEventNotification方法。這個方法裏面會根據subscriber JID做爲key來構建一個hashmap。map的value是subID。服務器

    這裏要說明一下:缺省狀況下,openfire支持同一個JID對同一個node作屢次的subscribe。這樣subID就用來區分多個subscription。session

    hashmap構建好了以後,就遍歷整個map,而後調用node.sendEventNotification--->PubSubModule.sendNotification--->PacketRouterImpl.route---->MessageRouter.routedom

    這個中間沒有什麼要說的。走到MessageRouter.route方法後是最關鍵的地方了。component

    方法的開始和退出的時候兩次調用了InterceptorManager.getInstance().invokeInterceptors。這是openfire plugin被調用的地方。我會下一篇裏面講我對plugin的一些瞭解,以及我所作的plugin。排序

    方法的中間就是調用RoutingTableImpl.routePacket, 這就是openfire在路由traffic的地方。思路就是:遊戲

    1)若是接受者的domain和服務器的domain一致,就調用routeToLocalDomain

    2)  若是接受者的domain包含服務器的domain,就調用routeToComponent。這裏要說明一下,大多數狀況下,咱們會利用external component來實現咱們本身的服務器應用。這時候就須要給咱們的external component定義一個sub-domain。例如:服務器的domain是ilxlf.com,咱們要用external component實現一個遊戲的應用,那麼咱們定義component的sub-domain是:game.ilxlf.com  服務器內部就這一步來判斷是否要路由到咱們的component。

    3)最後調用 routeToRemoteDomain.

    這裏我說明第一步的邏輯: routeToLocalDomain

    這裏有一個前提知識:full JID和bare JID。這裏就不講了。我只說bare JID的狀況。

    當服務器發現subcriber用的是bare JID,他的流程是:

    1)找到這個subscriber所對應的全部活的session。

    2)從這些session裏面選擇優先級最高的一個session。最後調用LocalClientSession的deliver方法把消息發出去。

    3)若是優先級最高的是一組session,那麼再根據session的presence信息中的一些狀態值排序,這裏有一個最好理解的排序算法:多個session中,最後一個鏈接到服務器的session優先級最高。就用這個session把消息發出去。

    到這裏服務器就把notification包發給subscriber。

    今天先寫到這裏。下一篇再講pubsub的一些編程方面的總結。

相關文章
相關標籤/搜索