ajax长轮询 (转)

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

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

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

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

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

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

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

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

现贴出部分代码 

js  ajax实现部分

[javascript] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. function getRtmMsg(show){  
  2.         $.ajax({  
  3.            type:"POST",  
  4.            url:"rtmAction!getMsg.action",  
  5.            data:"show="+show,  
  6.            success: function(msg){  
  7.              if(msg!=null){  
  8.                 bottomRight();  
  9.                 getRtmMsg("0");  
  10.              }  
  11.            }  
  12.         });  
  13.     }  


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

[javascript] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. function bottomRight(){    
  2.         $.messager.show({    
  3.             title:'提醒',    
  4.             msg:'下载考生',    
  5.             showType:'show'  
  6.         });   
  7.     }  



后台Action

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 实时消息Action 
    3.  * @author wangwei 
    4.  * May 23, 2013 
    5.  */  
    6. public class RtmAction  extends ActionSupport{  
    7.       
    8.     HttpServletResponse response = ServletActionContext.getResponse();  
    9.     HttpServletRequest request = ServletActionContext.getRequest();  
    10.       
    11.     private static final ThreadLocal threadLocal = new ThreadLocal();  
    12.     private static Object lock = new Object();  
    13.     public void getMsg(){  
    14.         String show = request.getParameter("show");  
    15.         if("0".equals(show)){  
    16.             RtmTemplate.cjzxShow = false;  
    17.         }  
    18.         try {  
    19.             //多线程同步解决并发问题  
    20.             synchronized(lock){  
    21.                 while(!RtmTemplate.cjzxShow){  
    22.                     System.out.println("检测中。。。。");  
    23.                     Thread.sleep(5000);  
    24.                 }  
    25.             }  
    26.             response.getWriter().println("1");  
    27.         } catch (IOException e) {  
    28.             e.printStackTrace();  
    29.         } catch (InterruptedException e) {  
    30.             e.printStackTrace();  
    31.         }  
    32.     }  
    33.       
原文地址:https://www.cnblogs.com/bmaker/p/5782441.html