pushlet工作流程分析

http://www.cnblogs.com/duanxz/p/5194472.html

Pushlet工作流程分析時採用從前臺頁面請求到後臺程序響應,後臺程序執行流程,最後前臺對響應請求。分析對象是ajax-pushlet-client客戶端。分析工具藉助了firebug。
1)頁面加載時,調用PL._addEvent(window, ‘load’, PL._init, false),其本質是調用了window.onload=PL._init(),即獲取XMLHttpRequest對象,設定pushlet的請求URL爲pushlet.srv,將狀態置爲STATE_READY。
2)通過某種方式調用了joinListen(aSubject),加入、監聽、並訂閱(subscribe),這裏的aSubject和subscrible是“/pushlet/ping”,構造好query,然後調用PL._doRequest(‘join-listen’, query),這時的query是值爲“p_format=xml-strict&p_mode=pull&p_subject=/pushlet/ping”。參數含義:
p_format:響應格式,這裏指嚴格的xml;
p_mode:pushlet模式;
p_subject:請求主題。
3)是否等待狀態準備好(waitForState)爲false,即可以直接進行請求,其原因是在初始化時已將狀態設置爲STATE_READY了,向服務器端發出請求,利用GET請求,URL爲“../../pushlet.srv?p_event=join-listen&p_format=xml-strict&p_mode=pull&p_subject=/pushlet/ping”。參數補充說明:p_event,即請求事件類型,這裏爲“join-listen”;而pushlet.srv是pushlet servlet配置地址,在web.xml中指明。
4)第一次以GET方式請求:
GET 方式請求:
eventType=join-listen
p_subject=/pushlet/ping
p_format=xml-strict
p_mode=pull
p_event=join-listen
創建一個Session 設置userAgent=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10
創建一個Command實例:包括一個Session,事件Event,HTTP Servlet請求,HTTP Servlet響應
處理來自客戶端的servlet請求
不同事件決定不同的操作
先請求加入
加入操作
Pushlet[INFO] SessionManager: Sun Jun 14 20:48:55 CST 2009 sapeledowe at 127.0.0.1 added
取得返回格式,默認值爲js
實際值爲xml-strict
新建響應事件,類型爲join-ack
響應事件P_ID=sapeledowe
響應事件P_FORMAT=xml-strict
Pushlet[INFO] S-127.0.0.1[sapeledowe]: [Controller] joined
如果返回事件不是nack,再請求監聽
請求監聽操作
獲取一個訂閱者,設置主題=/pushlet/ping 標籤=null
Pushlet[INFO] S-127.0.0.1[sapeledowe]: [Subscriber] Subscription added subject=/pushlet/ping sid=vusos label=null
Pushlet[INFO] S-127.0.0.1[sapeledowe]: [Controller] Listening mode=pull userAgent=mozilla/5.0 (windows; u; windows nt 5.1; zh-cn; rv:1.9.0.10) gecko/2009042316 firefox/3.0.10
如果監聽返回事件不是nack,則設置響應事件類型爲join-listen-ack
響應事件類型爲listen 或者 refresh
獲得訂閱者
從隊列中獲取事件,並推送至客戶端
設置響應URL=/blchat/pushlet.srv?p_id=sapeledowe&p_event=refresh
發送 刷新事件 到客戶端
設置響應事件的屬性
通過客戶端適配器推送給客戶端
響應事件:
p_event=join-listen-ack
p_mode=pull
p_time=1244995572
p_id=sebocegebi
p_format=xml-strict
p_sid=nehon

p_event=refresh
p_time=1244995572
p_wait=5888
p_url=/blchat/pushlet.srv?p_id=sebocegebi&p_event=refresh

第二次請求:
GET 方式 eventType=refresh
p_id=sapeledowe
p_event=refresh
創建一個Command實例:包括一個Session,事件Event,HTTP Servlet請求,HTTP Servlet響應
處理來自客戶端的servlet請求
不同事件決定不同的操作
響應事件類型爲listen 或者 refresh
獲得訂閱者
從隊列中獲取事件,並推送至客戶端
設置響應URL=/blchat/pushlet.srv?p_id=sapeledowe&p_event=refresh
發送 刷新事件 到客戶端
設置響應事件的屬性
通過客戶端適配器推送給客戶端
結論:
1、第一次請求後建立一個服務器端長久的session,同時創建一個對應的subscribe一個controller,並將他們與session關聯。
2、系統中Event是怎麼產生的:系統中產生的EVENT是來源於系統自帶的幾個產生線程。TestEventPullSources中有幾個靜態內部內,它們在系統初始化的時候就自動創建了。系統通過Dispatcher類將事件分發到各個Session工廠中各個Session中,分別加入到各自的Subscribe的EventQueue中去。
3、servlet取得reflesh操作請求後重新讀取隊列中的事件,然後將其轉換爲XML輸出到前臺,最後再輸出一個“reflesh”事件。響應事件對應了JavaScript裏相應的對象。“reflesh”事件導致再次請求服務器,不過這一次不再創建session,而是根據sessionId直接取得服務器端實例,然後再獲取事件隊列中的事件,如此循環。
5、退出時,停止session,移去所有的subscriptions,設置響應事件爲“E_LEAVE_ACK”,並將其作爲控制類事件發送到客戶端。
後面將對Pushlet源代碼中的設計模式和二次開發過程進行分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章