第一次参见公司的职称评定,评委问了一个问题,是我做权限管理那块的,说admin 管理员修改了一个用户的权限,让这个正在使用中的用户不能再 查看系统日志了 ,如何立刻反映到这个用户上。
我说 可以使用一个线程根据用户ID去请求后台,吧最新的权限信息同步到前台,这也是一个笨办法,能解决问题,可以不巧妙,如果我当时对推模式有所研究 一定会回答好这个问题。
推模式的 好处是由后台主动把信息退送到客户端 (比如浏览器),引起客户端 (比如HTML DOM结构变化)的变化,使用推模式就能很好的解决 我答辩时的问题,我那种扫描轮询的方式 会加大服务的压力
首先了解下什么是 推模式,以及一个 推模式的开源实现 (DWR)
以下是来自网上:
ajax 推模式
http://www.iteye.com/topic/155609
一个例子 聊天室
http://www.iteye.com/topic/199079
DWR 长连接方式的若干问题
http://www.blogjava.net/josson/archive/2008/03/31/189810.html
DWR推技术在开发中需要注意的ScriptSession问题
http://www.blogjava.net/zhyiwww/archive/2009/02/24/236318.html
深入理解基于 HTTP 长连接的“服务器推”技术(Comet)
http://bbs.phpchina.com/viewthread.php?tid=100836
http://hi.baidu.com/renyangok/blog/item/f4bb66803fbdadd2bc3e1ea3.html
dwr推
http://chenjumin.iteye.com/blog/690071
下面是 来自晚上的一个 聊天室的 推模式(使用DWR)的例子 我做了简单的修改
1. 聊天室用户信息 使用单例模式 放在一个Vector中 ,以前是网上的例子是放在list中的,这样做事为了解觉并发问题,应为 Vector 是同步的
2.小米同学做个一个简单的界面
3.对方法在session 中的用户 User 实现了 HttpSessionBindingListener 接口 用户推出 或者session 超时时候引起
聊天室人数变化 会直接推送到 前台页面
基本的原理是 使用http/1.1的长连接 监听某个页面,然后将服务器上的数据推送到 监听的页面,由于是服务器端主动推送数据的 所以高效 省时,节约资源
另外:
web服务器 所能处理的链接数 是有限的,每个用户都开一个长链接 而不释放,当连接数达到峰值时候会 阻塞后面的链接,因此需要 连接池技术 或者 叫链接 复用 ,好在这个问题 已经有解决方案了,我自己还没实现,最近加班忙的很 等闲了 我在给以前的 chat 加上 连接池!
面向 Java 开发人员的 Ajax: 使用 Jetty 和 Direct Web Remoting 编写可扩展的 Comet 应用程序
http://www.ibm.com/developerworks/cn/java/j-jettydwr/
注:
1.附件中是聊天室 的 源码 导入 eclipse 可直接修改!
2.将聊天室发布在tomcat中,验证推模式
a.首先建立 chat.xml 在 tomcat的 D:\apache-tomcat-6.0.18\conf\Catalina\localhost 下 ,内容如下(根据自己的tomcat安装目录做相应的修改) :
- < Context path = "/chat" docBase = "D:\workspace2\chat\WebRoot" debug = "0" reloadable = "true" > </ Context >
3.启动tomcat .访问 http://localhost:8080/chat 可以看到 聊天室的页面
为了便于测试 我们需要开 两个 浏览器 分别 注册 聊天室 成员 然后 互相聊天 ,看看推模式是如何在两个页面上传送数据的