`
weiwei5910
  • 浏览: 26832 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

javaWeb与Jquery ajax长轮询简单实现

 
阅读更多

javaWeb项目中需要一个实时提醒的功能,也就是某人做了某一操作,可以立即提醒到当前在线的用户

最开始想在用户做了操作后,储存一个状态到数据库中然后用每隔几秒用ajax去请求后台查询数据库来确定是否显示提醒窗口

提醒窗口使用jquery easyui 的messager 在右下角弹出如下图


后查得可通过AJAX长轮询的方法来解决频繁对后台的请求,进一步减小压力

在实现过程发现AJAX的多次请求会出现多线程并发的问题又使用线程同步来解决该问题


个人对ajax长轮询的一点愚见

ajax请示后台时,后台程序并没有立即返回信息而是挂起,当符合条件时才会返回信息


文笔不好,只能白话出来,如有不对的地方还请各位指正,一起探讨学习!

现贴出部分代码


js ajax实现部分

function getRtmMsg(show){
	    $.ajax({
		   type:"POST",
		   url:"rtmAction!getMsg.action",
		   data:"show="+show,
		   success: function(msg){
		     if(msg!=null){
		     	bottomRight();
		     	getRtmMsg("0");
		     }
		   }
		});
    }

使用 jquery easyui的messager弹出提示窗口代码

function bottomRight(){  
	    $.messager.show({  
	        title:'提醒',  
	        msg:'下载考生',  
	        showType:'show'
	    }); 
    }


后台Action

/**
 * 实时消息Action
 * @author wangwei
 * May 23, 2013
 */
public class RtmAction  extends ActionSupport{
	
	HttpServletResponse response = ServletActionContext.getResponse();
	HttpServletRequest request = ServletActionContext.getRequest();
	
	private static final ThreadLocal threadLocal = new ThreadLocal();
	private static Object lock = new Object();
	public void getMsg(){
		String show = request.getParameter("show");
		if("0".equals(show)){
			RtmTemplate.cjzxShow = false;
		}
		try {
			//多线程同步解决并发问题
			synchronized(lock){
				while(!RtmTemplate.cjzxShow){
					System.out.println("检测中。。。。");
					Thread.sleep(5000);
				}
			}
			response.getWriter().println("1");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
}






分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics