锁定老帖子 主题:后台向前台消息推送求解决方案
精华帖 (0) :: 良好帖 (0) :: 新手帖 (19) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-20
js:部分
/*** * 系统消息发送及弹出js文件 * 注意: 只能body中引入,如果在其它地方引入可能会出现错误. */ var d_msg={}; var d_msg_head = document.getElementsByTagName("HEAD"); //加载jquery文件 if( typeof(jQuery)=='undefined'){ d_msg.jqueryf = document.createElement('SCRIPT'); d_msg.jqueryf.setAttribute("type","text/javascript"); d_msg.jqueryf.src = '/js/jquery/jquery_last.js'; } //加载dwr引擎 if (typeof(dwr)=='undefined' || dwr == null) { d_msg.dwr = document.createElement('SCRIPT'); d_msg.dwr.setAttribute("type","text/javascript"); d_msg.dwr.src = '/dwr/engine.js'; } //加载消息发送文件 d_msg.script = document.createElement('SCRIPT'); d_msg.script.setAttribute("type","text/javascript"); d_msg.script.src = '/dwr/interface/SystemMessgeServices.js'; //加载弹出框 art组件 if (!window.art) { /*d_msg.art = document.createElement('SCRIPT'); d_msg.art.src = '/js/artDialog/artDialog.min.js'; d_msg.art.setAttribute("type","text/javascript"); // d_msg.skin = document.createElement('SCRIPT'); d_msg.skin.setAttribute("type","text/javascript"); d_msg.skin.src = '/js/artDialog/skin.js';*/ } //将js文件加载到文档中 for(var par in d_msg){ if(d_msg_head){ d_msg_head[0].appendChild(d_msg[par]); }else{ document.body.appendChild(d_msg[par]); } } //初始化消息接收机制 jQuery(document).ready(function(){ if(!propmtMsg.init){ propmtMsg(); propmtMsg.init = true; } }); //从服务器获取消息 function propmtMsg(keepConnect){ var clientKey = propmtMsg.clientKey?propmtMsg.clientKey:''; var keepConnect = keepConnect?keepConnect:''; jQuery.ajax({ data :{ clientKey: clientKey,keepConnect:keepConnect}, dataType : 'html', type : 'post', timeout:300000, url : '/common/systemMsg.do?content=&method=getMSG', success : function(jsonStr){ if(jsonStr=="")return; var data ; try{ //JSON.parse(jsonStr); data = eval("("+jsonStr+")"); }catch(e){ return ; } var msgs = new Array();//最新消息 var count =0;//消息总记录数 for(var par in data){ msgs = data[par];//取得消息 count=par; continue; } //存储从服务器端获取的 客户端编号 if(!propmtMsg.clientKey){ propmtMsg.clientKey = msgs[0].clientKey; } if(count==0){ propmtMsg(); return; } if(!msgs){//消息为空重新获取消息 propmtMsg("keepConnect"); // return; } if(msgs.length<1){//消息长度为空,重新获取消息 propmtMsg("keepConnect"); // return; } //其它该sessionId打开多个页面时,服务器会通知该session所打开的页面(此机制为了解决服务端及时发现已经关闭或离开的页面,防止内存泄露), //通知客户端此条连接等待作废(以disable为标记)重新发起消息请求,并为客户端设置clientKey if(msgs[0].disable){ propmtMsg("keepConnect"); //通知服务器当前客户端页面仍然有效 if(msgs[0].clientKey){ propmtMsg.clientKey = msgs[0].clientKey;//重新设置客户端id } return; } propmtMsg.keepConnect = null; if(propmtMsg.showPanel){ propmtMsg.showPanel.close(); } var title = msgs[0].title; if(!title){ title="您有新的消息"; } var contenMemo = msgs[0].memo; if(window.art){ if(msgs[0].url) contenMemo+=" <a href ='"+msgs[0].url+"'>更多...</a>"; try{ //弹出消息框 ,这里只弹出了第一条消息,可以将返回的多条消息,另外展示^_^ propmtMsg.showPanel = window.art.dialog({ title:title, left: 'right' , top: 'bottom', width:250, effect:true, //time:15, content: contenMemo, closeFn:function(){ propmtMsg.showPanel = null;//标记弹出框已经关闭 } }); }catch(e){ } } propmtMsg("keepConnect"); }, error: function(XMLHttpRequest,textStatus,errorThrown){ if(textStatus=="timeout"){ delete propmtMsg['clientKey'];//请求超时,删除当前客户端的key propmtMsg(); } } }); } //window.onerror = function(){ //nnd ie7在ajax超时老是报js错,虽然功能没有收到影响,但是错误太恶心了 暂时把它屏蔽 (ie6,ie8都不存在此问题....)可以采用iframe请求代替ajax来解决此问题. //if(arguments && 3==arguments.length){ // if(130==arguments[2])return true; //} //return true; //} //测试发送消息 function SendMsg(msg,userId){ if(!msg)return; if(!userId)return; if(msg==''|| userId=='')return; SystemMessgeServices.sendMsg({ receiver:{id:userId}, createTime:1280010281, memo:msg, createUser:{id:1}, title:'test' }); } |
|
返回顶楼 | |
发表时间:2011-10-20
最后修改:2011-10-20
jsp调用: <input type="text" id="MSG_T_Msg" /> <select id="MSG_T_USER"> <option value="1">admin</option> <option value="2">t1</option> <option value="3">t2</option> </select> <input value="发送" type="button" onclick="SendMsg($('#MSG_T_Msg').val(),$('#MSG_T_USER').val())"/> 基本全了 ,明天整理一下,今天先闪了 后台JAVA调用: 和前台的dwr SystemMessgeServices.sendMsg 一样 |
|
返回顶楼 | |
发表时间:2011-10-21
前台用flex的话,可以采用blazeds,我实现过。。
|
|
返回顶楼 | |
发表时间:2011-10-21
pushlet
我的项目再用,楼主可以去看我的文章 |
|
返回顶楼 | |
发表时间:2011-10-21
dwr 推技术demo
http://www.blogjava.net/freeman1984/archive/2009/11/19/302961.html |
|
返回顶楼 | |
发表时间:2011-10-21
ileson 写道 坐等 http socket 很想解决这个问题。
等了一年了都 。哎。。 +1 |
|
返回顶楼 | |
发表时间:2011-10-21
freegaga 写道 要求:当数据库中的数据发生变化时,需要主动将状态通知到前端,不希望使用定时异步刷新,请问各位高手有什么解决方案没有
Pushlet可以解决你的问题.而且很简单. |
|
返回顶楼 | |
发表时间:2011-10-21
dwr推送?
|
|
返回顶楼 | |
发表时间:2011-10-21
最后修改:2011-10-21
Long polling.
web qq啥的都是用它。 |
|
返回顶楼 | |
发表时间:2011-10-23
最后修改:2011-10-23
walldr2161 写道 说说想法不一定能实现:监听数据库,其实也就是AOP监听insert、delete、update等,
帖子一个 希望有所帮助 http://www.open-china.net/blog/8940.html 就是这样 的 dwr 的comet模型实现和aop相结合 用Aop拦截上述方法 上一个项目就是这么干的 |
|
返回顶楼 | |