论坛首页 综合技术论坛

客户端同步,服务器端异步

浏览 13208 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-01-03  

最近在公司碰到点难题。关于点击button拿到最新的汇率。

 

之前的需求是客户端AJAX请求为同步,async=false.点击一次按钮,在前一个请求没有返回以前,不发出新的请求的。

 

 

$.ajax({
  url: "test.html",
  async:false,
  success: function(){
      //todo
  }
});
 

 

后来需求需要客户端ajax请求异步。async:true。比如:连续点击10次,响应错误显示error message和成功返回更新数据都只与最后ajax请求相关。

 

1.那么怎么处理知道是最后一次请求呢??

设一个时间戳,记住最后一后请求的时间,

 

$.ajax({
  url: "test.html",
  async:true,
  time:new Date(),
  success: function(){
      //todo
  },error:function(){ }
});

 服务端不改变time的值,返回来。success里面比较一下时间就行了。

 

2.error message处理。

如果是timeout error message呢。如何判断是最后一次的error呢。根本不可能返回time param.

讨论了许久,有个比较垃圾的方式:lastSuccess=false,如果最后一次成功返回,就lastSuccess=true.

在error里面,if(lastSuccess==fasle){显示error message}.

特殊情况,如果第一次失败,那么会show error message.第二次成功了,那么会清除error message,然后更新数据。

 

3.考虑一种极端情况,如果点击三次,倒是最后一次请求最先返回,有可能吗?如果有可能,那么上面分析的逻辑是对的吗?

我用Thread.sleep()的方式来unit test。一直不成功。ajax响应会按请求的顺序返回。

我的debug的方法,把前一个ajax response请求hold住,后面也一个请求居然排队??

为什么呢。servlet不是对于每个请求会有一个新的servlet吗??

 

4.请问,两个用户访问同一个servlet,如果a用户的请求没有返回,b的请求可以发出吗?a,b同一台机器同一browser?

同一个pc,不同browser??不同pc呢?

 

5.难道servlet对于同一session的用户,请求是单线程的??

 

6.jquery.ajax{async:true},只是表示客户端是多线程的,服务器端不确定?

 

 

 

 

   发表时间:2012-01-07  
servlet不是线程安全的,当然是多线程处理的,你这个没有试过,以前当请求不同url的时候返回没有规律,考虑缓存可能会引起这样结果
0 请登录后投票
   发表时间:2012-01-07  
传时间戳,进入服务端方法时保存全局标识,假设在session中保存这个时间戳。当服务端执行完以后,检查之前存的时间戳还对不对,如果时间变了,说明执行过程中又有新的请求进来了,如果没变,就可以返回结果给客户端了。
也许客户端的时间不够精确,时间戳区分不开,可以在cookie里维护一个请求次数,点一次就加1,把序号传过去效果也是一样的。
0 请登录后投票
   发表时间:2012-01-07  
是会出现这样的情况。基本上所有的应用服务器都是用线程池接收请求,然后再用另一个线程池处理请求的,再加上一些网络状况,所以先发送的请求,完全有可能最后返回。

0 请登录后投票
   发表时间:2012-01-09  
我猜想需求是,不管客户端刷新多少次,返回的都是最新的汇率。我觉得可以在服务端设置session级(或全局)变量,存最新汇率,这样,不管客户端ajax请求的顺序是什么,返回的都是最新汇率。
0 请登录后投票
   发表时间:2012-01-09  
页面保留stub,每一次请求发送一个自增的请求号,返回值带回这个号码,页面判断本次返回是不是最新的。
0 请登录后投票
   发表时间:2012-01-09  
先理解原理,再做coding,明显有很多基础薄弱地方, session原理 可以看看ThreadLocal的实现

    这种并发量大的读取可以使用多缓存机制,master/slave 缓存,

    使用多缓存,master主缓写入,slave 副缓读,  把主缓数据写入同步到副缓存。


0 请登录后投票
   发表时间:2012-01-09  

为什么需求需要客户端ajax请求异步?

0 请登录后投票
   发表时间:2012-01-10  
引用
1.那么怎么处理知道是最后一次请求呢??

设一个时间戳,记住最后一后请求的时间

客户端不发送时间,服务器返回数据时返回服务器时间,客户端比较多次返回的时间大小就可以。

3.完全有可能最后请求的最先返回,你测试时第二个请求应该是被同一个debug停住了。

4.同3,不同请求之间完全没关系

5.多线程

6.服务器一直是多线程的
0 请登录后投票
   发表时间:2012-01-10  
觉得你可以在当前页面级别创建一个计数器,不是方法里面.每次发送进行计数,并且将这个参数从后台返回.
ajax返回方法中判断返回参数是否域计数器一致,如果不一致就不进行显示.这样既可以启动显示最后一次的效果,
又不会为返回顺序不确定而发愁.
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics