锁定老帖子 主题:客户端同步,服务器端异步
精华帖 (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},只是表示客户端是多线程的,服务器端不确定?
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-01-07
servlet不是线程安全的,当然是多线程处理的,你这个没有试过,以前当请求不同url的时候返回没有规律,考虑缓存可能会引起这样结果
|
|
返回顶楼 | |
发表时间:2012-01-07
传时间戳,进入服务端方法时保存全局标识,假设在session中保存这个时间戳。当服务端执行完以后,检查之前存的时间戳还对不对,如果时间变了,说明执行过程中又有新的请求进来了,如果没变,就可以返回结果给客户端了。
也许客户端的时间不够精确,时间戳区分不开,可以在cookie里维护一个请求次数,点一次就加1,把序号传过去效果也是一样的。 |
|
返回顶楼 | |
发表时间:2012-01-07
是会出现这样的情况。基本上所有的应用服务器都是用线程池接收请求,然后再用另一个线程池处理请求的,再加上一些网络状况,所以先发送的请求,完全有可能最后返回。
|
|
返回顶楼 | |
发表时间:2012-01-09
我猜想需求是,不管客户端刷新多少次,返回的都是最新的汇率。我觉得可以在服务端设置session级(或全局)变量,存最新汇率,这样,不管客户端ajax请求的顺序是什么,返回的都是最新汇率。
|
|
返回顶楼 | |
发表时间:2012-01-09
页面保留stub,每一次请求发送一个自增的请求号,返回值带回这个号码,页面判断本次返回是不是最新的。
|
|
返回顶楼 | |
发表时间:2012-01-09
先理解原理,再做coding,明显有很多基础薄弱地方, session原理 可以看看ThreadLocal的实现
这种并发量大的读取可以使用多缓存机制,master/slave 缓存, 使用多缓存,master主缓写入,slave 副缓读, 把主缓数据写入同步到副缓存。 |
|
返回顶楼 | |
发表时间:2012-01-09
为什么需求需要客户端ajax请求异步? |
|
返回顶楼 | |
发表时间:2012-01-10
引用 1.那么怎么处理知道是最后一次请求呢??
设一个时间戳,记住最后一后请求的时间 客户端不发送时间,服务器返回数据时返回服务器时间,客户端比较多次返回的时间大小就可以。 3.完全有可能最后请求的最先返回,你测试时第二个请求应该是被同一个debug停住了。 4.同3,不同请求之间完全没关系 5.多线程 6.服务器一直是多线程的 |
|
返回顶楼 | |
发表时间:2012-01-10
觉得你可以在当前页面级别创建一个计数器,不是方法里面.每次发送进行计数,并且将这个参数从后台返回.
ajax返回方法中判断返回参数是否域计数器一致,如果不一致就不进行显示.这样既可以启动显示最后一次的效果, 又不会为返回顺序不确定而发愁. |
|
返回顶楼 | |