• 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.       
  • 相关阅读:
    转载c++中的多态性
    sdk环境下数据库访问之ADO
    ADO数据库访问问题
    PopMenu 弹出式菜单(变灰,禁用,激活)
    控制台窗口界面控制设计
    判断整数序列是不是二元查找树的后序遍历结果
    把二元查找树转变成排序的双向链表
    二叉树平衡因子应用举例
    二元查找树转换为它的镜像
    满二叉树先序、中序和后序之间的转换
  • 原文地址:https://www.cnblogs.com/bmaker/p/5782441.html
Copyright © 2020-2023  润新知