`

application server 下的任务异步/并行执行方案

    博客分类:
  • ejb
阅读更多


    在application server下,比如常见的weblogic,glassfish,jboss等,由于javaee规范的要求,一般不容许直接启动线程。因此在常见的异步/并行任务执行上,会遭遇到比普通javase程序更多的麻烦。

    典型例子,在javase中,jdk1.5后就引入了java.util.concurrent包,提供Executor这个非常好用的框架,完美的满足一下典型需求:

    1. 同步变异步
        请求进来后,将请求封装为task,交给Executor执行,原线程可以立即返回
    2. 并行执行
        请求进来后,将请求拆分为若干个task,例如下发短信,有100个收件人就可以按照每个收件人一个task来执行,这样可以通过Executor来并行执行这些请求,远比循环执行要快的多。

    3. 等待任务结束
        有时有要求调用线程必须等待所有任务完成后再继续运行的需要,此外还有超时等细节设置要求。

    而在application server,为了避开自己启动线程的弊端,只好通过其他的方式来完成类似的功能。

    目前我们的项目开发中主要有三种实现方式:

    1. jms queue

        通过jms来实现异步和并发,然后自己通过编码方式完成调用线程等待所有任务执行成功。

        这个方案比较通用,因为jms是javaee的标准,所有的application server上都支持。因此天然具有跨application server的能力。

        缺点就比较多了,首先jms是需要实现串行化的,因此对task是有要求,不能串行化的类是不能传递的。另外串行化的性能损失比较大,造成性能和稳定性问题,这个在大压力下比较突出,基本我们目前在考虑放弃这个方案,而且逐步将原有的实现替换掉。
        这个方案还有另外一个缺点,配置麻烦,维护困难:需要创建jsm queque, connection factory, MDB等,如果系统中使用的多了,配置起来很罗嗦,修改时容许出错。

    2. commonj work manager

        这个是weblogic和WebSphere上支持的一个很实用的解决方案,个人感觉使用上非常舒服,配置简单,只要在weblogic-ejb-jar.xml中间中简单配置:

    < work-manager >
        
< name > wm/taskDistributionWorkManager </ name >
        
< min-threads-constraint >
            
< name > minthreads </ name >
            
< count > 1 </ count >
        
</ min-threads-constraint >
        
< max-threads-constraint >
            
< name > maxthreads </ name >
            
< count > 100 </ count >
        
</ max-threads-constraint >
    
</ work-manager >


        使用时用jdni lookup到就可以使用了。功能和使用方式和executor框架很类似,同样提供future,而且提供一个非常实用的waitAll()方法论支持等待任务完成。

        这个方案的性能非常好,和jms相比提升极大,运行也稳定。缺点就是不是标准,只有weblogic和WebSphere执行,在glassfish,jboss上无法使用。

    3. JCA work manager

        这个是JCA标准了,glassfish,jboss都支持的,和commonj work manager很像,但是,很遗憾的是没有future的支持,而且也没有类似的waitAll()方法,只能自己编码实现。
        spring为glassfish提供了一个工具类"org.springframework.jca.work.WorkManagerTaskExecutor",简化了JCA work manager的使用。

        JCA work manager的性能和稳定性都还不错,对比jms要好的多。

    从目前我们项目的使用经验上看,jms是准备要被淘汰的了(其实我是一直对jms不感冒的,尤其是在有性能要求的地方,想不出用jms的理由)。目前项目要求同时支持weblogic和glassfish,因此commonj work manager和JCA work manager刚好对应于weblogic和glassfish平台。实际使用中,是在这两个work manager上封装了一个通用的接口,然后再有commonj work manager和JCA work manager两个实现,在运行时通过判断平台来自动选择注入其中的一个。

分享到:
评论

相关推荐

    Python 异步协程函数原理及实例详解

    事件循环是异步编程的核心,它负责调度协程的执行,确保在适当的时间执行合适的任务。创建事件循环通常通过`asyncio.get_event_loop()`完成,而关闭则使用`loop.close()`。例如: ```python import asyncio async ...

    多处理器多线程软件性能优化

    JAWS(Java Application Web Server)框架是一个高性能、自适应的Web服务器,同时也是一种应用架构,能够用于构建其他类型的通信服务器。JAWS的核心组件包括并发框架、事件框架、I/O事件、定时事件和协议框架,这些...

    introduction to oracle9i:pl/sql

    10. **互联网应用开发**:Oracle9i Application Server提供了全面的Web应用开发和部署环境,支持J2EE标准。 通过"D32945.pdf"和"D32946.pdf"这两份文档,读者将深入学习Oracle9i的架构、配置、管理和PL/SQL编程,...

    Oracle Architecture and Tuning on AIX

    - **并行查询**:利用Oracle的并行查询功能,在多核处理器环境下实现数据并行处理。 - **统计信息收集**:定期更新表和索引的统计信息,确保查询优化器做出最佳决策。 综上所述,Oracle在AIX平台上的架构和调优是一...

    Oracle与SQLServe比较

    - Oracle以其高性能著称,尤其在处理大量并发事务和大数据量时,通过并行执行、分区等技术提供高效性能。 - SQL Server也具有良好的性能,尤其在Windows环境下,与操作系统集成紧密,优化了I/O和内存管理。 3. **...

    多处理器多线程软件性能优化.pdf

    本文以JAWS(Java Application Web Server)框架为例,深入探讨了如何通过通讯模式优化和多处理器优化来提升基于JAWS框架的通讯服务器在多处理器环境下的性能。JAWS是一个高性能的Web服务器,它不仅实现了HTTP协议,...

    Python库 | gevent-fastcgi-1.0.2.1.zip

    - **并发处理**:gevent-fastcgi支持并行处理多个请求,通过greenlet的协作调度,确保了无阻塞的执行流程。 - **错误处理**:它提供了完善的错误处理机制,帮助开发者调试和定位问题。 - **配置灵活性**:可以...

    Oracle开发实战经典

    随后,Oracle不断推陈出新,研发出一系列的新技术和产品,包括分布式数据库、并行计算、集群技术等。其中,Oracle的RAC(Real Application Clusters)技术允许数据库在多台服务器之间实现负载均衡,极大地提高了...

    Java企业开发指南

    2. **Sun Java System Application Server Platform Edition 9** 3. **J2EE平台概述** 4. **Java EE核心技术** 5. **应用部署与管理** 6. **安全性和性能优化** #### Java EE 5简介 Java EE 5是Java平台企业版的一...

    Oracle RAC性能优化实践.pptx

    例如,启用`parallel_force_local`以强制并行执行在本地节点上,增加`gcs_server_processes`以处理更多的全局缓存服务请求,利用DRM(动态重主控)特性进行资源管理。其他如`parallel_max_server`、`adaptive_cursor...

    oracle-产品介绍.ppt

    相比之下,IBM的DB2和Microsoft的SQL Server虽然也有其优势,但总体上在某些方面稍逊一筹,例如,SQL Server主要运行在Windows平台上,而Oracle则支持多种操作系统。 Oracle的市场份额在过去一直保持领先地位。在...

    Microsoft.Net常见问题集锦

    - 处理大量并发数据通常需要使用多线程或异步处理技术,如线程池、任务并行库(TPL)、异步/等待关键字等。同时还需要考虑数据的存储和访问策略,如使用高性能的数据结构和数据库索引。 19. **进程和线程的区别?*...

    jdk1.7和wildfly-8.1.0

    WildFly,前身为JBoss AS(Application Server),是Red Hat开发的一款开源的应用服务器,它实现了Java EE(Enterprise Edition)规范,用于部署和管理Java企业级应用程序。WildFly 8.1.0是其中的一个稳定版本,发布...

    Net FramaWork4.0.rar

    11. **异步编程模型**:引入了基于任务的异步模式(TAP),简化了异步操作的编写,增强了用户体验。 12. **代码访问安全性(Code Access Security, CAS)**:提供了一种机制,用于限制代码在运行时的权限,增强了...

    tornado官方翻译文档

    Tornado官方翻译文档是关于Tornado这个Python Web框架和异步网络库的使用手册。Tornado是为了解决高并发和长连接问题而设计的,它使用非阻塞的网络I/O模型,从而能够承受成千上万的并发连接,特别适合于实现长轮询、...

    aiohttp:用于asyncio和Python的异步HTTP客户端服务器框架

    1. **异步请求**:使用`async/await`语法发起HTTP请求,使得在等待响应时可以执行其他任务,提高程序效率。 2. **流式上传/下载**:允许将大文件或大量数据分块发送,或者接收大文件时逐块读取,避免内存瓶颈。 3. *...

    oracle原理中文版.pdf

    Oracle 9i也加强了自动调优功能,例如Parallel_Automatic_Tuning参数,这使得数据库能够根据工作负载自动调整并行执行的策略。 总而言之,Oracle 9i的这些核心组件和特性共同构成了一个强大而灵活的数据库系统,...

    ASP一键刷网页浏览

    这种方式可以让多个请求并行执行,提高刷浏览的速度和效率。 在压缩包文件名列表中,我们看到以下几个文件: 1. `fadmy.asa`:这可能是用来实现刷浏览功能的主要脚本文件,ASA(Active Server Applications)是ASP...

    使用C#控制SqueezeBox服务器(VS2010)-第1部分

    C# 4.0引入了任务并行库(TPL),这使得异步编程变得更加简洁。在我们的项目中,我们将使用Task类来实现异步操作,确保UI线程不会因为等待I/O操作完成而阻塞,提高用户体验。例如,我们可以创建一个异步方法来获取...

Global site tag (gtag.js) - Google Analytics