Dwr詳解

1.推送方式

    DWR支持三種方式從服務端推送數據到客戶端(服務器推,高大上,也就是反轉Ajax):Piggyback, Polling和Comet.
    Polling:這種方式相似於咱們常用的輪詢的方式,每隔幾秒中去動態請求一次數據,只不過dwr幫咱們去完成這個每隔。。請求一次數據的任務,默認dwr好像是5秒去請求一次,這種方式簡單,可是對於實時的數據來講不太合適,實現方式相似咱們在web頁面上寫一個js或者用ajax每隔一段時間去請求一下服務器,而後從後端服務中帶回數據。
    Commet:它是一種基於 HTTP 長鏈接的一種服務器推送技術,它不須要瀏覽器每次去鏈接請求,因此它的延遲很是低,可是它對服務器的負載帶來很大壓力,一些實時系統都是使用這種方式推送,commet方式也不可能一直保持鏈接狀態,因爲各類各樣的緣由可能會斷開鏈接,因此它也會根據已有的規則來重鏈接。
    Piggyback:這種方式就是服務器會記錄你的更新能容,當你的web去服務器請求的是否它會把從上次請求到此次請求之間的全部更新一塊兒返回給web頁面,上面兩種方式相對這種方式可能對網絡依賴比較強,Piggyback由於不是實時從服務端發送數據到客戶端,而是等待下次客戶端請求才一次發送給客戶端,因此數據延時相對較高,這種方式通常不須要其它配置就可使用。
    DWR容許你使用上面的任意一種方式來推送,只須要稍微修改一下配置文件便可。commet與polling是兩個極端,一個是長時間鏈接一個是長時間處於斷開等到客戶端去connect,默認這兩種方式是沒有打開的,由於對服務器的負載太大,能夠手動配置打開。web

2.細粒度控制

在上面提到,piggyback通常不須要過多的配置便可使用,它屬於被動模式,而polling與commet則屬於主動模式,DWR主要就是這兩種工做模式,被動模式沒什麼配置咱們不在說,若是沒有下面的配置,默認就是被動模式,下面主要了解一下主動模式也就是Active Reverse Ajax,而主動模式又能夠細分爲三種:ajax

  • Early Closing Mode(默認模式)
  • Full Streaming Mode(IE不支持,日了狗了)
  • Polling Mode

Early Closing Mode(默認模式)

在DWR2.04版本之前默認模式仍是Full Streaming Mode(咱們姑且給它叫FSM簡寫之),但以後默認就改成了Early Closing Mode(ECM),在FSM模式下這種長鏈接的模式會增長服務器的壓力,而如今ECM這種模式下若是沒有數據要輸出到瀏覽器那麼它保持60秒後會關閉,一旦有數據輸出,dwr會在關閉連接前再保持連接一個配置時間maxWaitAfterWrite讓數據發送出去,而後斷開鏈接,再從新啓一個鏈接等待數據。後端

maxWaitAfterWrite瀏覽器

1000服務器

Full Streaming Mode(IE不支持)

這種模式是響應最快的一種模式,由於它鏈接一次,斷開一次,它會每隔1分鐘去檢測一下瀏覽器是否關閉,ie下沒法使用,默認切換到了Early Closing Mode,可是在Early Closing Mode狀況下,若是你有大量的瀏覽器–服務器鏈接存在,它們可能在同一時間嘗試重鏈接,這種狀況下就會很糟糕,那麼能夠嘗試使用Full Streaming Mode這種模式,它只會關閉一次。。。,它的配置很簡單:網絡

maxWaitAfterWritesession

-1spa

Polling Mode

若是你認爲長時間持有鏈接是不明智的,那麼你可使用Polling Mode這種模式,配置以下:code

org.directwebremoting.extend.ServerLoadMonitor生命週期

org.directwebremoting.impl.PollingServerLoadMonitor

默認輪詢時間是5秒,你能夠經過下面參數配置:

disconnectedTime

60000

3.ScriptSession生命週期

當你把/dwr/engine.js放到你的項目中的時候,其實這個ScriptSession生命週期已經開始了,默認使用org.directwebremoting.impl.DefaultScriptSessionManager來管理整個生命週期,你能夠在頁面中加入這句代碼來通知DefaultScriptSessionManager,當頁面關閉時讓它的生命週期失效。

dwr.engine.setNotifyServerOnPageUnload(true);

1.       可是當瀏覽器直接關閉時可能致使短暫的延遲,若是浙對你的項目來講是不理想的,你能夠設置第二個參數:

dwr.engine.setNotifyServerOnPageUnload(true, true);

2.       這樣可能致使瀏覽器關閉與頁面卸載同時發生時卸載不一致的狀況。 若是沒有設置setNotifyServerOnPageUnload爲true或者失效,那麼默認使用服務器端的session失效時間,默認是5分鐘,這個能夠配置。

相關文章
相關標籤/搜索