DWR支持三种方式从服务端推送数据到客户端(服务器推,高大上,也就是反转Ajax):Piggyback, Polling和Comet.
Polling:这种方式相似于咱们常用的轮询的方式,每隔几秒中去动态请求一次数据,只不过dwr帮咱们去完成这个每隔。。请求一次数据的任务,默认dwr好像是5秒去请求一次,这种方式简单,可是对于实时的数据来讲不太合适,实现方式相似咱们在web页面上写一个js或者用ajax每隔一段时间去请求一下服务器,而后从后端服务中带回数据。
Commet:它是一种基于 HTTP 长链接的一种服务器推送技术,它不须要浏览器每次去链接请求,因此它的延迟很是低,可是它对服务器的负载带来很大压力,一些实时系统都是使用这种方式推送,commet方式也不可能一直保持链接状态,因为各类各样的缘由可能会断开链接,因此它也会根据已有的规则来重链接。
Piggyback:这种方式就是服务器会记录你的更新能容,当你的web去服务器请求的是否它会把从上次请求到此次请求之间的全部更新一块儿返回给web页面,上面两种方式相对这种方式可能对网络依赖比较强,Piggyback由于不是实时从服务端发送数据到客户端,而是等待下次客户端请求才一次发送给客户端,因此数据延时相对较高,这种方式通常不须要其它配置就可使用。
DWR容许你使用上面的任意一种方式来推送,只须要稍微修改一下配置文件便可。commet与polling是两个极端,一个是长时间链接一个是长时间处于断开等到客户端去connect,默认这两种方式是没有打开的,由于对服务器的负载太大,能够手动配置打开。web
在上面提到,piggyback通常不须要过多的配置便可使用,它属于被动模式,而polling与commet则属于主动模式,DWR主要就是这两种工做模式,被动模式没什么配置咱们不在说,若是没有下面的配置,默认就是被动模式,下面主要了解一下主动模式也就是Active Reverse Ajax,而主动模式又能够细分为三种:ajax
在DWR2.04版本之前默认模式仍是Full Streaming Mode(咱们姑且给它叫FSM简写之),但以后默认就改成了Early Closing Mode(ECM),在FSM模式下这种长链接的模式会增长服务器的压力,而如今ECM这种模式下若是没有数据要输出到浏览器那么它保持60秒后会关闭,一旦有数据输出,dwr会在关闭连接前再保持连接一个配置时间maxWaitAfterWrite让数据发送出去,而后断开链接,再从新启一个链接等待数据。后端
maxWaitAfterWrite
浏览器
1000
服务器
这种模式是响应最快的一种模式,由于它链接一次,断开一次,它会每隔1分钟去检测一下浏览器是否关闭,ie下没法使用,默认切换到了Early Closing Mode,可是在Early Closing Mode状况下,若是你有大量的浏览器–服务器链接存在,它们可能在同一时间尝试重链接,这种状况下就会很糟糕,那么能够尝试使用Full Streaming Mode这种模式,它只会关闭一次。。。,它的配置很简单:网络
maxWaitAfterWrite
session
-1
spa
若是你认为长时间持有链接是不明智的,那么你可使用Polling Mode这种模式,配置以下:code
org.directwebremoting.extend.ServerLoadMonitor
生命周期
org.directwebremoting.impl.PollingServerLoadMonitor
默认轮询时间是5秒,你能够经过下面参数配置:
disconnectedTime
60000
当你把/dwr/engine.js放到你的项目中的时候,其实这个ScriptSession生命周期已经开始了,默认使用org.directwebremoting.impl.DefaultScriptSessionManager来管理整个生命周期,你能够在页面中加入这句代码来通知DefaultScriptSessionManager,当页面关闭时让它的生命周期失效。
dwr.engine.setNotifyServerOnPageUnload(true);
1. 可是当浏览器直接关闭时可能致使短暂的延迟,若是浙对你的项目来讲是不理想的,你能够设置第二个参数:
dwr.engine.setNotifyServerOnPageUnload(true, true);
2. 这样可能致使浏览器关闭与页面卸载同时发生时卸载不一致的状况。 若是没有设置setNotifyServerOnPageUnload为true或者失效,那么默认使用服务器端的session失效时间,默认是5分钟,这个能够配置。