`

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

    博客分类:
  • java
阅读更多

        之前做了一个项目,要用到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。那合并代码和回归绝逼有可能搞死人,工作量之大,超出想象。这种情况下,你可以考虑同步异步一起支持。如果入口少,代码实现业务方,但是如果入口多呢?一个个改也不是人干的,自己通过asm通过maven插件打包后动态修改Servet/Action的继承体系,加个支持异步的基类?喔,是不是已经离原来要解决的问题越来越远了?

        

    

 

分享到:
评论

相关推荐

    Java Web应用开发技术实用教程

    Java Web应用开发技术实用教程是针对大学学习者设计的一本应用教程,主要涵盖了使用Java语言进行Web应用程序开发的各种核心技术。本教程旨在帮助学生和初学者深入理解如何利用Java技术栈构建功能丰富的Web应用。 ...

    Java Web应用客户端编程

    Java Web应用客户端编程是开发基于Web的交互式应用程序的关键部分,它主要关注用户与服务器之间的交互逻辑和用户体验。客户端编程通常涉及HTML、CSS、JavaScript,以及一些库和框架,如jQuery、Bootstrap等,来创建...

    Java Web应用开发与实践范例

    同时,现代Java Web开发往往与RESTful API设计、JSON数据交换格式、单页应用(SPA)和前后端分离等趋势相结合,使用Ajax实现异步交互,提高用户体验。 虽然《Java Web应用开发与实践范例》中可能缺少第五章和第六章...

    《Java Web应用开发技术实用教程》-王红-电子教案

    《Java Web应用开发技术实用教程》是一本专为学习Java Web开发的初学者和进阶者编写的教材,由王红老师倾力打造。这本书涵盖了Java Web开发的基础知识到高级技术,旨在帮助读者掌握构建动态网页和Web应用程序的技能...

    Java Web应用中的异步处理技术与实践

    在当前信息化时代,Java Web应用的性能和用户体验显得尤为重要。异步处理作为一种提高应用响应速度和性能的关键技术,已经成为Java Web开发中不可或缺的一部分。本文将详细介绍在Java Web应用中实现异步处理的方法,...

    《Java Web应用开发技术实用教程》-电子教案+源码

    《Java Web应用开发技术实用教程》是一本深入探讨Java Web开发的教材,旨在帮助学习者掌握构建基于Web的Java应用程序所需的关键技能。本教程结合了理论与实践,提供了丰富的电子教案和配套源码,使学习过程更为直观...

    异步Web方法调用例子-Java源码

    总之,异步Web方法调用在Java中具有重要的应用价值,通过AXIS2这样的框架,可以方便地实现异步Web服务的开发和调用,提高系统性能和用户体验。在实际项目中,根据需求选择合适的异步调用策略,并确保正确处理回调和...

    Java Web之高级应用

    **Java Web之高级应用** Java Web技术是互联网应用程序开发的核心之一,它涵盖了各种技术和框架,用于构建动态、交互式的Web应用程序。在这个高级应用的主题中,我们主要探讨的是Java Web技术的深入理解和实践,由...

    精通JAVA Web整合开发jsp+ajax+struts+hibernate 第07章 Java EE应用中的异步通信技术AJAX

    在Java EE应用中,异步通信技术是提升用户体验和系统性能的重要手段,特别是在Web应用程序中。本章将深入探讨AJAX(Asynchronous JavaScript and XML)技术,它是实现Web页面无刷新更新的关键技术,广泛用于现代网页...

    Java web 应用与开发教程 课件

    JavaBean则是一种符合特定规范的Java类,常作为业务逻辑层的组件在Web应用中使用。 课程可能涵盖以下关键知识点: 1. **Java Web环境搭建**:包括安装JDK、设置环境变量、配置Tomcat服务器,以及部署Web应用的基础...

    Java Web应用程序设计

    Java Web应用程序设计是开发基于Java技术的Web应用的过程,它结合了Java编程语言、服务器端技术、HTML、JavaScript以及相关的框架来构建动态、交互式的Web服务。本教程配套的源代码提供了实际操作的实例,帮助学习者...

    Java Web 整合开发 完全自学手册 源代码

    这本书旨在帮助读者全面掌握Java Web应用程序的开发技能,从基础到高级,涵盖了一系列核心概念和技术。通过源代码的学习,读者可以更直观地理解并实践这些知识点。 1. **Servlet与JSP**:Java Web开发中的两大基石...

    Java典型应用彻查1000例第六卷:web应用开发(源码+PPT+习题).rar

    《Java典型应用彻查1000例第六卷:Web应用开发》是针对Java Web开发领域的一本实战性教程,包含源码、PPT演示文稿以及配套习题,旨在帮助学习者深入理解和掌握Java在Web开发中的各种应用场景。本教程以实际案例为...

    Java Web开发应用详解(独门架构)

    Java Web开发是构建基于互联网的应用程序的关键技术,它利用Java编程语言和一系列相关技术来创建动态、交互式的网站。"Java Web开发应用详解(独门架构)"可能涵盖了许多主题,包括但不限于Servlets、JSP(JavaServer ...

    java文件异步上传

    Java文件异步上传是一种在Web应用中常见的技术,它允许用户在不阻塞浏览器界面的情况下上传文件。这种技术尤其在处理大文件或者批量上传时,能够显著提升用户体验,因为它们不会冻结页面,允许用户继续与应用程序...

    Java Web编程实战宝典(光盘源代码)

    《Java Web编程实战宝典》是一本面向初学者的编程指南,主要涵盖了使用Java语言进行Web应用程序开发的各种技术和实践。这本书的光盘源代码提供了丰富的示例和项目,旨在帮助读者深入理解Java Web开发的核心概念,并...

    java web数据库应用系统开发与实例

    在Java Web数据库应用系统开发中,我们通常会涉及到多个关键技术和概念,这些是构建高效、稳定和可扩展的Web应用程序的基础。以下是对这些知识点的详细解释: 1. **Java编程语言**:Java是一种广泛使用的面向对象的...

    MLDN Java Web 开发实战经典源码李兴华源代码

    在Java Web应用中,JDBC是数据访问层(DAO)的关键部分。 4. **JNDI服务**:Java Naming and Directory Interface用于查找和管理网络资源,常用于Java EE环境中的资源定位,如数据库连接池配置。 5. **过滤器与...

Global site tag (gtag.js) - Google Analytics