Java Web应用Web层异步化应该考虑的问题

标签: java web 应用 | 发表时间:2014-01-25 09:45 | 作者:yueyemaitian
出处:http://www.iteye.com

        之前做了一个项目,要用到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

        如果你把异步化改造的结果直接合进主干,大家一起跑,有问题处理,忽略此条。
        如果你需要长时间单机beta,又要考虑每次别人的新需求、日常上线,你要合并他们的代码进你分支,然后回归,然后上线beta

        

    

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java web 应用] 推荐:

xssProject在java web项目中应用

- - Java - 编程语言 - ITeye博客
1.项目引入xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar包. * 覆盖getParameter方法,将参数名和参数值都做xss过滤. * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>.

使用Gradle构建Java Web应用(译)

- - BlogJava-首页技术区
使用Gradle构建Java Web应用. 本文是发布在 java.net上的一篇摘自于<Gradle in Action>一书中的 节选,介绍了使用 Gradle构建Java Web应用的过程. 刚刚接触Gradle,看到了这篇小文,随手译了出来:-) (2014.01.23最后更新).

Java Web应用Web层异步化应该考虑的问题

- - 企业架构 - ITeye博客
        之前做了一个项目,要用到web层的异步化技术,在实际实现中,遇到了很多问题,作为教训简单罗列下. 1、app 容器/J2EE框架对异步的支持.         在tomcat5、jboss4的时候,每一个请求都用了一个app容器线程来执行,app线程必须一直处理完或者等待别的线程处理完,才能拿着请求的链接把结果写回到客户端.

【转】使用 Java 实现 Comet 风格的 Web 应用

- - 互联网 - ITeye博客
您可能已经听说过 Comet,因为它最近受到了一定的关注. Comet 有时也称反向 Ajax 或服务器端推技术(server-side push). 其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据. 听起来简单,但是如果熟悉 Web 应用程序,尤其是 HTTP 协议,那么您就会知道,这绝不简单.

【java_web】web批量分页打印

- - Web前端 - ITeye博客
//把iframe的html挪到div上. <!-- media="print"表示改样式只在打印预览或打印的时候才生效 --> <style media="print" type="text/css">  . <!-- 根据urlList,生成<div> <iframe><iframe/></div> 这样格式的页面-->.

Java Web 服务性能优化实践

- - 博客 - 伯乐在线
来源: IBM developerworks. 简介: 本文介绍如何提升 Java Web 服务性能,主要介绍了三种方法:一是采用 Web 服务的异步调用,二是引入 Web 服务批处理模式,三是压缩 SOAP 消息. 重点介绍在编程过程中如何使用异步 Web 服务以及异步调用和同步调用的差异点. 本文还示范了如何在项目中使用以上三种方法,以及各种方法所适合的应用场景.

关于Java Web打印的选择

- - JavaScript - Web前端 - ITeye博客
 最近遇到一个项目,需要用到较为复杂的打印功能,包括批量打印等. 目前来说,一般一个简单的详情页面打印,直接调用window.print就行了;. 但遇到复杂的时候,我们可能会想到用集成好的控件来解决,当然,如果你有时间又不怕麻烦,你也可以自己写一堆js. 这里,我就先抛砖引玉对两个比较常用的打印控件谈谈自己的看法.

java web开发 高并发处理

- - 企业架构 - ITeye博客
java web开发 高并发处理. java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据). 一:高并发高负载类网站关注点之数据库. 没错,首先是数据库,这是大多数应用所面临的首个SPOF. 尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.

[Java Web]敏感词过滤算法

- - CSDN博客推荐文章
DFA算法的原理可以参考 这里,简单来说就是通过Map构造出一颗敏感词树,树的每一条由根节点到叶子节点的路径构成一个敏感词,例如下图:. LOG.error("sensitiveWordMap 未初始化!");. LOG.error("敏感词库文件转码失败!");.

Java 开发 2.0: 使用 Gretty 的超轻量级 Java Web 服务

- 圣斌 - IBM developerWorks 中国 : 文档库
Gretty 是构建 Web 服务超轻量级框架的新学派之一. 构建于极快的 Java NIO API 之上,Gretty 将 Groovy 用作 Web 端点和 Grape 的 Maven 式依赖关系管理的一种域特定语言. 本文介绍如何开始使用 Gretty 来构建和部署 Java Web 服务应用程序.