Servlet3.0 异步处理问题

learn_try_best 2014-06-03 10:03:11
Servlet3.0引入了异步处理请求机制。

1个请求过来 耗时的话可以新开一个线程,让这个新的线程处理。 Servlet线程直接返回给容器。

我做了1个ajax测试。

结果ajax返回的时候需要等待异步线程执行完才能得到数据...

这样不是没意义了吗? 还是要等待全部执行完。


但是我直接访问页面的话,可以先出来一部分数据,然后异步执行完刷出另外一部分数据。


想问下,为什么ajax需要等待另外一个线程执行完才能response数据。 谢谢。
...全文
464 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
angwan 2015-08-11
  • 打赏
  • 举报
回复
可能大家没说到点子上,以ford推断,ajax和页面访问没有任何区别,ajax等到servlet3.0的异步任务执行完才取到返回,很可能是服务端没有调PrintWriter的close方法,而只调用了flush方法,这样的话,可能不会立即返回给ajax,浏览器反应也不一样,有的浏览器如果chrome会立即显示异步之前的内容,而ie则等待调用了close才能显示页面内容。不过如果异步之前调用了close方法,那么异步中就不能使用跟页面相关的对象了,也就是与页面的交互在异步任务开始前就结束了。不过即使如此,也可能遇到返回给页面依然慢的情况,那就看看跟线程池设置或者其他是否有关系了。
姜小白- 2014-06-04
  • 打赏
  • 举报
回复
servlet的异步旨要在节省容器的请求线程数量。容器可以并发处理的请求数量是有限的,ajax请求会一直占据着当前的请求线程,直至后台处理完成,才能释放当前请求线程;而servlet的异步,则是将请求放到线程池中,先释放当前请求线程,把请求的机会让给别人,自己处理完成后,再将结果返回给前台。我觉得异步的servlet是对ajax的一个补充吧,个人见解,欢迎再讨论
loveunittesting 2014-06-04
  • 打赏
  • 举报
回复
ajax可以根据http状态码来判断服务器端是否成功返回。我想是因为异步处理完成后才是200OK,所以一般ajax代码(只处理200或者错误的)那时才有反应。你可以根据返回http状态码判断是主线程返回还是异步的线程返回。
tony4geek 2014-06-04
  • 打赏
  • 举报
回复
Defonds 2014-06-04
  • 打赏
  • 举报
回复
Ajax 根据返回码进行判断 楼主可以显式返回正确执行的返回码给它
learn_try_best 2014-06-03
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
最近也刚看servlet3.0的异步处理,跟楼主一起探讨一下吧。 我这么理解的:Ajax和同步的servlet结合时,servlet每次直接返回部分数据,等后台相应完全后再将数据全部返回至前台。 Ajax和异步的servlet结合时,servlet到后台后,就按照异步的servlet的规则处理了,先将该线程放在线程池中,等该线程处理执行完成后,再返回至页面。这时,Ajax也就被当做一个普通的请求处理了。
这样异步不就失去意义了吗。 ajax为什么不先返回,然后另外个线程执行完再返回呢。 跟直接访问页面一样。
姜小白- 2014-06-03
  • 打赏
  • 举报
回复
最近也刚看servlet3.0的异步处理,跟楼主一起探讨一下吧。 我这么理解的:Ajax和同步的servlet结合时,servlet每次直接返回部分数据,等后台相应完全后再将数据全部返回至前台。 Ajax和异步的servlet结合时,servlet到后台后,就按照异步的servlet的规则处理了,先将该线程放在线程池中,等该线程处理执行完成后,再返回至页面。这时,Ajax也就被当做一个普通的请求处理了。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧