惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
D
Docker
J
Java Code Geeks
腾讯CDC
Blog — PlanetScale
Blog — PlanetScale
G
Google Developers Blog
M
MIT News - Artificial intelligence
L
LangChain Blog
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
博客园 - Franky
GbyAI
GbyAI
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
N
Netflix TechBlog - Medium
B
Blog RSS Feed
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News

博客园 - 冬冬

高校、科研院所科研信息管理系统 - 寻求合作 走向管理之路:从向别人求助开始 C语言数据结构学习用单元测试 人性与天性 提问的方式方法 使用ExtJs开发MIS系统(系列文章) 使用ExtJs开发MIS系统(7):ExtJs性能浅析 使用ExtJs开发MIS系统(6):客户端MVC 使用ExtJs开发MIS系统(5):使用Action抽象客户端操作 使用ExtJs开发MIS系统(3):使用数据库保存客户端状态 使用ExtJs开发MIS系统(2):Js的动态加载 使用ExtJs开发MIS系统(1):基于ExtJs的MIS构架设计 项目管理纵横谈(2)──继续说项目管理的目标 项目管理纵横谈(1)──项目的管理的目标 网路爬虫(3):url索引 权限系统设计 团队管理心得总结--回复别人的邮件 团队职能划分 战略与战术--再论软件设计的度
使用ExtJs开发MIS系统(4):轮询
冬冬 · 2008-12-21 · via 博客园 - 冬冬

Posted on 2008-12-21 18:39  冬冬  阅读(3391)  评论()    收藏  举报

众所周知,Http是无状态的,每次请求结束后,客户端都会和服务器端断开连接。请求总是从客户端发起的,除非客户端发起请求,否则服务器端没有办法主动地向客户端传递任何数据。然而对于MIS,常常需要从服务器端推送数据给客户端,例如当用户提交了一个新的申请后,需要管理员去审批。解决办法就是客户端“锲而不舍”的询问服务器,是否有新的事情要做,也就是所谓轮询技术。

轮询的过程可以用下面这个图来描述:

image

我们仍然以用户登录为例,先来看轮询的过程:

  1. 每一次用户成功登陆后,服务器端都会向客户端颁发一个身份令牌,这个令牌是一个GUID。
  2. 客户端每一分钟向服务器端发起一次请求,报告当前用户登陆令牌。
  3. 服务器取得该令牌后,验证用户登录信息,如果用户登录信息有效,则更新用户最后活动时间,然后返回用户当前登录有效的信息,否则返回错误。
  4. 客户端解析登陆信息。
  5. 如果令牌失效,例如用户被管理员锁定或删除等,则报告登陆失效,跳转登陆界面。否则什么都不做。

这样就能实现:

  1. 任何用户信息的改变都会及时体现,例如该用户接收到新的系统短消息,则下次客户端轮询时会有报告。
  2. 管理员人员可以管理用户登陆状态,较准确的查看当前登录用户或者踢出用户等。

实际上,轮询根本目的是使服务器端可以更准确的了解客户端状态,也有机会告诉客户端要做些什么,这模拟了一个双向请求的链接。

使用ExtJs实现轮询是非常用容易的,内置的Ext.TaskMgr封装了setInterval,clearInterval等方法,例如上面的轮询可以用下面的代码来实现:

   1:  Srims._activeTask = {
   2:      run: function(){
   3:          var token = Srims.currentLoginLog.token;
   4:          if (token == undefined) 
   5:              Srims.currentLoginLog.token = Cookies.getToken();
   6:          Ext.Ajax.request({
   7:              url: '/User.asmx/Active',
   8:              success: Srims._onActive,
   9:              method: 'POST'
  10:          });
  11:          
  12:      },
  13:      interval: 1000 * 60
  14:  }
  15:  Ext.TaskMgr.start(Srims._activeTask);

详细说明可以参考ExtJs文档中Ext.TaskMgr和Ext.util.TaskRunner这两个类。