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.       
  • 相关阅读:
    luogu P5473 [NOI2019]I 君的探险 交互 随机 二分 分治 整体二分
    218. The Skyline Problem
    315. Count of Smaller Numbers After Self
    493. Reverse Pairs
    307. Range Sum Query
    1409. Queries on a Permutation With Key
    如果redis没有设置expire,他是否默认永不过期?
    同步调用和异步调用
    缓存穿透、缓存击穿、缓存雪崩概念及解决方案
    Python实现发送邮件---转载至https://www.cnblogs.com/liuqingzheng/articles/10072695.html
  • 原文地址:https://www.cnblogs.com/bmaker/p/5782441.html
Copyright © 2011-2022 走看看