即时消息机制实现方法
一般的信息处理系统中都存在网站内,系统内的人员互相发消息的要求,而实现起来一般也都补复杂,无非是数据库中建立1张表用来记录具体的消息内容和状态,发送者,当然这里也可以分解成2张表,都无所谓,只要能处理好就可以了.
主要是解决对于发送的消息的及时收到的消息,对每一个登录的客户端都需要定时来请求,来获得有没有自己的消息,这个定时触发的时间一般在几秒中之内,超过1分钟即不算即时消息了.如何解决这种客户端频繁请求消息的过程,如果这样大频率的直接请求查询数据库,必将在客户人数增加后导致服务器的崩溃.
可以采用内存映射的机制来处理.
设计一个内存共享的的
HashMap可以把它放在一个单态类中,用来映射消息.可以简单实现如下:
Key(userId)
|
Value(消息个数)
|
201
|
2
|
202
|
0
|
203
|
1
|
……..
|
……
|
1. 在用户登录的时候,首先根据用户的id查询数据库,统计消息的个数,并put到HashMap中.
2. 在客户端首页的某个位置来间隔一定的时间来请求检验该HashMap,如果消息个数不为0,则进行新消息的提示.
3. 在发送消息的时候,在给每一个接收者在HashMap中的消息个数++.
4. 在消息接受者查看消息时,给每一查看者的HaspMap对应的消息个数--.
5.
关于页面定时提交,
可以采用javascript
的方法设定定时,
并结合ajax
异步提交机制来进行定时请求,
如果发现计数器不为零,
则进行更改动画的消息图片来提示.
附录:
Message.js文件:
var send_space;
var time_space=5000;//5
秒
var i=0;
var basePath="";
var objimg;
function messagecheck(objname,path){
basePath=path;
objimg=document.getElementById(objname);
send();
}
function send(){
send_space=setTimeout("send();",time_space);
i++;
lock_requestdel();
}
function lock_requestdel() {//
初始化、指定处理函数、发送请求的函数
http_request = false;
var url=basePath+'messagesendcheck';
//
开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest) { //Mozilla
浏览器
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {//
设置MiME类别
http_request.overrideMimeType('text/xml');
}
}
else if (window.ActiveXObject) { // IE
浏览器
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) { //
异常,创建对象实例失败
window.alert("
不能创建XMLHttpRequest对象实例.");
return false;
}
http_request.onreadystatechange = processRequest_del;
//
确定发送请求的方式和URL以及是否同步执行下段代码
http_request.open("POST",url, true);
http_request.send(null);
}
//
处理返回信息的函数
function processRequest_del()
{
if (http_request.readyState == 4)
{ //
判断对象状态
// popinfo(1);
if (http_request.status == 200)
{ //
信息已经成功返回,开始处理信息
if((http_request.responseText)!=null&&(http_request.responseText).indexOf("false")>=0){
// alert("
删除失败");
objimg.innerHTML=" ";
}
else if((http_request.responseText)!=null&&(http_request.responseText).indexOf("true")>=0){
///
var url="'"+basePath+"progress/message.do?method=list'";
var mm="'main'";
var src='新消息" style="cursor:hand" />';
objimg.innerHTML=src ;
}
}
else
{ //
页面不正常
// alert("
服务器错误!!");
objimg.innerHTML=" ";
}
}
}
提示页面: