之前做了一个项目,要用到web层的异步化技术,在实际实现中,遇到了很多问题,作为教训简单罗列下。
1、app 容器/J2EE框架对异步的支持
在tomcat5、jboss4的时候,每一个请求都用了一个app容器线程来执行,app线程必须一直处理完或者等待别的线程处理完,才能拿着请求的链接把结果写回到客户端。如果你想这个时候释放掉app容器线程,让它去做别的事情,你自己启动线程去处理完逻辑后把结果写回,是不可能的。
但是等servlet 3规范出来后,这种方式就变得可行了。也就是你可以把容器线程和连接分离了,在app容器线程启动异步servlet后,把连接丢给别的线程(我们叫做业务工作线程)就好了,容器线程使命完成,可以处理下一个请求了。业务工作线程,可以等自己处理完后,通过连接把结果输出给前端,然后close掉连接就好了。这个要tomcat7及以后支持,可以参考个小例子。
当然,这个点上,只要选择合适的框架和容器版本,调调api就可以了。
2、Filter中做的事情谁来处理?
从1的描述看,容器线程早早的完成了使命,运行完了,但是业务逻辑还没有处理完。而通常filter是容器线程执行,如果在filter里边做了一些事情,如权限检查、日志、session处理等,有些是在业务逻辑执行前执行一次就行,业务逻辑执行后是不需要再处理什么东西的,这种是不受影响的。而有些资源控制如流控的、openSessionInView,则是在业务执行前处理一部分,业务执行完之后再处理一部分,这部分就需要调整,要么从Filter中迁出来,放到业务逻辑前后;要么Filter执行一部分,释放资源部分从filter迁出来,在业务执行线程中执行,等业务执行完了释放。
不过这里需要注意,如果初始化资源部分在Filter里边,释放资源在业务线程中的方式下,如果初始化资源后、启动业务线程之前出现异常可能导致一些资源释放不了。
3、如果使用了ThreadLocal呢?
如果有人钟爱ThreadLocal,在Filter或者业务线程执行的代码的别的部分,丢了些数据到ThreadLocal中,在业务处理过程中要用到。这种情况下,就需要ThreadLocal数据的传递了,从容器线程传递到业务线程。
不过这个不是所有数据都传递,如果你知道连BigDecimal里边都在用ThreadLocal的话、ReentrantReadLock都在用ThreadLocal的话,你大概就理解了为什么不是所有。所以要显式的传递了,即从容器线程get出来,再set到业务工作线程。
4、如果还使用了动态代理?
比如有人想监控部分servlet或如webwork的action的时候,看执行时间等信息,用动态代理统一管理,而这代理又是在业务逻辑线程启动前,遇到了如同filter一样的问题,参照filter的问题改造吧!
5、如果你用了一些web框架,而这些框架并不支持异步方式?
我能说恭喜你么,如果以上2、3、4条提到的代码你都可以控制,你还可以玩下去,而这个web框架你控制不了,里边无数的坑等你跳,他的一对fiter怎么处理,如果它基于filter还做了扩展?只能搞懂框架,把以上提到的2-4改一把了。。。。6、如果你的系统在线上跑的很稳定了,你是做改造,改造完之后还但是有很多问题需要长时间beta
如果你把异步化改造的结果直接合进主干,大家一起跑,有问题处理,忽略此条。
相关推荐
精通JAVA Web整合开发jsp+ajax+struts+hibernate 第07章 Java EE应用中的异步通信技术AJAX
异步Web方法调用例子-Java源码,此为完整代码
如何实现异步调用web服务的代码,该调用是 ASP.net Web 服务设计器所必需的
javaweb异步导出
struts-gpipe 提供了将 groovy 引入 struts java web 项目的功能, web页面模块化异步渲染。 这个项目的初衷是为了将groovy引入我们的struts web项目,在开发的过程中,发现有跟多可以做的是全,不过在最初的版本,...
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
会员注册唯一性检查的业务逻辑由一个名为CheckUser.java(见例程1)的HttpServlet来实现,CheckUser在web.xml中配置(见例程2),然后在会员注册页index.htm(见例程3)中使用AJAX技术异步调用CheckUser完成会员注册...
主要介绍了Java web spring异步方法实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
作者深入阐述了设计原则、前端层、Web服务、数据存储层、缓存、异步处理等核心概念与技术,针对可能发生的问题一一剖析,为读者勾勒出了简明清晰的技术框架图。相信《互联网创业核心技术:构建可伸缩的Web应用》 ...
仿照知乎做的一个Java web项目,是一个sns+资讯的web应用。使用SpringBoot+Mybatis+velocity开发。数据库使用了redis和mysql,同时加入了异步消息等进阶功能,同时使用python爬虫进行数据填充。 软件开发设计:应用...
这是一个java的web样例工程,实现的是jquery+ajax传输
仿照知乎做的一个Java web项目,是一个sns+资讯的web应用。使用SpringBoot+Mybatis+velocity开发。数据库使用了redis和mysql,同时加入了异步消息等进阶功能,同时使用python爬虫进行数据填充。 适合学习/练手、毕业...
MLDN 李兴华 Java Web 开发实战经典.pdf (高清版) 全书分为两部分,需 要全部下载下载一起解压,此部分为第一部分 带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 ...
该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...
如何使用JSON调用JavaScript中的同步和异步方式Web服务方法
MLDN 李兴华 Java Web 开发实战经典.pdf (高清版) 全书分为两部分,需 要全部下载下载一起解压,此部分为第二部分 带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 ...
本项目采用当前主流的Java Web编程语言、JavaScript、JSP、Jquery、Ajax 异步处理技术,HTML,CSS网页设计技术完美融合,力求界面美观、操作流畅。对在线视频系统进行了设计和实现。实现用户视频上传,可以是免费...
作者深入阐述了设计原则、前端层、Web服务、数据存储层、缓存、异步处理等核心概念与技术,针对可能发生的问题一一剖析,为读者勾勒出了简明清晰的技术框架图。相信《互联网创业核心技术:构建可伸缩的Web应用》 ...