zoukankan      html  css  js  c++  java
  • 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.       
  • 相关阅读:
    [转载]DBA的特质第一部分:技术
    DPA/Ignite由于DNS问题导致连接不上被监控的数据库服务器
    ORACLE计算表引占用空间大小
    Reporting Services 错误案例一则
    SQL SERVER Transactional Replication中添加新表如何不初始化整个快照
    TNS-12540: TNS:internal limit restriction exceeded
    Error: 9001, Severity: 21, State: 5 The log for database 'xxxx' is not available
    ORA-01012: not logged on
    -bash: .bash_profile: command not found
    -bash: ulimit: pipe size: cannot modify limit: Invalid argument
  • 原文地址:https://www.cnblogs.com/bmaker/p/5782441.html
Copyright © 2011-2022 走看看