ajax长轮询 (转)

时间:2023-03-09 17:57:54
ajax长轮询 (转)

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

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

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

ajax长轮询 (转)

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

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

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

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

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

现贴出部分代码

js  ajax实现部分

  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弹出提示窗口代码

  1. function bottomRight(){
  2. $.messager.show({
  3. title:'提醒',
  4. msg:'下载考生',
  5. showType:'show'
  6. });
  7. }

后台Action

    1. /**
    2. * 实时消息Action
    3. * @author wangwei
    4. * May 23, 2013
    5. */
    6. public class RtmAction  extends ActionSupport{
    7. HttpServletResponse response = ServletActionContext.getResponse();
    8. HttpServletRequest request = ServletActionContext.getRequest();
    9. private static final ThreadLocal threadLocal = new ThreadLocal();
    10. private static Object lock = new Object();
    11. public void getMsg(){
    12. String show = request.getParameter("show");
    13. if("0".equals(show)){
    14. RtmTemplate.cjzxShow = false;
    15. }
    16. try {
    17. //多线程同步解决并发问题
    18. synchronized(lock){
    19. while(!RtmTemplate.cjzxShow){
    20. System.out.println("检测中。。。。");
    21. Thread.sleep(5000);
    22. }
    23. }
    24. response.getWriter().println("1");
    25. } catch (IOException e) {
    26. e.printStackTrace();
    27. } catch (InterruptedException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. }