J2EE中间件
中间件层主要是网客通平台使用的J2EE中间件,包括平台使用到的应用服务器和中间件技术。一、应用服务器
应用服务器为网客通提供的整个J2EE平台实现,EMALL基础服务层和应用层、业务层都是建立在应用服务器之上。
网客通设计上遵循SUN公司提出的J2EE规范,这样能够尽可能的保证在不同的J2EE应用服务器中进行移植。
经过测试、网客通平台支持Tomcat、WebLogic、JBoss这几种J2EE应用服务器。
二、中间件技术
本着重用的设计原则,网客通在一些功能中采用了已有的成熟技术,这些都是经过实践考验的中间件。主要以java标准包和开源项目为主,大部分都针对系统作了相应调整,以便适合系统的需要。
1. Apache commons:
著名的开源组织Apache的一个java工具包,提供很多实用的功能。
1) commons-beanutils:
提供对Java反射和自省API的包装。
在平台中用于通用的接口设计。
2) commons-codec:
包含一些通用的编码解码算法。Hex,Base64, 以及URL encoder。
平台中主要用来做消息摘要,实现数据加密等功能。
3) commons-collections:
提供一个类包来扩展和增加标准的Java Collection框架。提供了比j2sdk更全面的数据结构,平台中继承并实现了一些特殊的数据结构。
4) commons-pool:
提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池。
我们在原有的基础上进行了优化,在性能和使用性方面有所提高。
5) commons-dbcp:
这是一个基于apache的对象池(apache commons pool)实现的数据库连接池。
我们在原有的基础上进行了优化,对数据库连接进行了特别的处理,防止数据库连接泄漏的问题,并提供了监控的功能。
6) commons-discovery:
供工具来定位资源(包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。
7) commons-el:
提供在JSP2.0规范中定义的EL表达式的解释器。
对平台中的JSP提供EL表达式支持。
8) commons-fileupload:
强大和高性能的文件上传功能。
平台中被用于上传各种图片、Flash、文档等资源,我们在原有的基础上进行了优化。
9) commons-logging:
提供通用的日志操作接口。
主要用于程序调试和服务器日常的日志输出。
10) commons-validator:
提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器(校验方法)和校验规则。支持校验规则的和错误消息的国际化。
平台中用来校验各种xml数据。
2. Cewolf / JFreeChart:
Cewolf 是一个用于生成各种图表的标签库。它支持在JSP中嵌入图表图片。运行servlet 容器的任意的Web应用程序服务器都可以使用它。因为Cewolf 是一个功能完整的标签库,所以不需要使用Javascript。
JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。主要用于生成统计图表。
这两个技术一起提供了网客通平台的统计分析图表,JFreeChart主要用于输出图表,Cewolf对其进行了封装。
3. Dom4j:
Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
主要用来处理XML数据。
XML在网客通有广泛的应用,主要是作为配置文件使用。由于XML严格的格式要求和层次结构,也有用来作为参数在HTML表单中传递。如组合商品功能,因为组合商品中的商品是由管理员挑选的,参数数量并不确定,如果每从组合商品中添加/删除一个商品都直接更新到数据库话,会对系统造成负荷。所以,在组合商品的管理中,将操作的数据类转换成XML传递,就可以一次进行修改。
4. Hibernate:
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
在平台中,我们采用Hibernate进行数据库操作,只有在一些对数据库性能有特别要求的模块,才直接使用jdbc进行连接。
5. Ehcache:
Ehcache出自Hibernate,在Hibernate中使用它作为数据缓存的解决方案。这是Hibernate必须的包。
6. JCrontab:
它是由Java语言编写的日程处理程序,它目的是提供强大的定时处理功能,让我们的应用程序可以按照提供的时间表来执行不同的应用。
我们主要用Jcrontab管理以下一些定时任务:
1) 年排行榜后台更新进程:自动计算年排行榜。
2) 月排行榜后台更新进程:自动计算月排行榜。
3) 周排行榜后台更新进程:自动计算周排行榜。
4) 日排行榜后台更新进程:自动计算日排行榜。
5) 更新对象缓存:实现对象缓存的更新,处理那些长期没被再一次访问的对象缓存。
6) 清页面缓存:当管理员使用的手工刷新页面缓存的功能时,系统会将这些需要刷新的缓存加到一个队列中,由本进程负责刷新。
7) 相关产品自动实现间隔:相关产品的计算对系统消耗比较大,所以系统不会对所有几十万个商品进行计算,只有在用户查看单个商品时算出这个商品的相关产品并进行缓存。那么当用户下一次访问这个商品的相关产品时就直接从缓存中读取出来。而这个进程就是为了定时更新这个缓存。
8) 自动推荐后台更新进程:进程根据商品推荐规则进行自动推荐。
9) 新闻推荐后台更新进程:进程根据新闻推荐规则进行自动推荐。
10) 关键字后台进程:当用户在前台搜索栏中输入一个查询值时,系统并不马上将其统计到关键字,而是放到内存中,由此进程定时统计。
11) 保存访问量信息进程:用户每访问一次系统,系统并不马上统计,而是放到内存中,由此进程定时保存到数据库,供统计进程进行统计。
12) 年访问量排行计算:计算年访问量排行榜。
13) 月访问量排行计算:计算月访问量排行榜。
14) 周访问量排行计算:计算周访问量排行榜。
15) 日访问量排行计算:计算日访问量排行榜。
16) 年降价排行计算:计算年降价排行榜。
17) 月降价排行计算:计算月降价排行榜。
18) 周降价排行计算:计算周降价排行榜。
19) 日降价排行计算:计算日降价排行榜。
20) 统计计算:每天对访问量进行统计。
21) 生成订阅邮件列表进程:根据用户的订阅设置,生成需要发送的邮件队列。
22) 发送订阅邮件进程:根据要发送的邮件队列发送邮件。
23) 拍卖自动出价进程:实现拍卖模块中的自动出价功能。
7. JCS:
JCS是Jakarta的项目Turbine的子项目。它是一个复合式的缓冲工具。可以将对象缓冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构建具有缓冲的分布式构架,以实现高性能的应用。
对于一些需要频繁访问而每访问一次都非常消耗资源的对象,可以临时存放在缓冲区中,这样可以提高服务的性能。而JCS正是一个很好的缓冲工具。缓冲工具对于读操作远远多于写操作的应用性能提高非常显著。
网客通平台中使用jCS提供缓存功能,主要是页面缓存和对象缓存,通过JCS,系统将用户访问过的页面和对象缓存到内存中,对于访问量巨大,内存缓存已经不能负荷的情况下,我们还可以将缓存设置到硬盘中保存。
使用缓存的话,能将系统可负载和性能大幅度的提升。当没有使用集群环境的情况下,缓存是一种必不可少的技术。
8. JSF / MyFaces:
JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。
JSF 的主要优势之一就是它既是 Java Web 用户界面标准又是严格遵循模型-视图-控制器 (MVC) 设计模式的框架。用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使 JSF 应用程序更易于管理。为了准备提供页面对应用程序数据访问的 JSF 上下文和防止对页面未授权或不正确的访问,所有与应用程序的用户交互均由一个前端“Faces”servlet(控制器)来处理。
MyFaces是JavaServer Faces(JSF) Web框架 (JSR 127)的一个实现。提供了很多常用控件。
我们平台中采用一些基于JSF框架的MyFaces控件。这样使程序结构十分清晰。
9. Log4j:
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
这是一个可选包,如果不使用Log4j的话,commons-logging会自动使用SUN J2SDK的日志包,不过我们还是推荐使用Log4j,它的功能非常强大。
10. Lucene:
Lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自已需要自订其功能。
我们使用Lucene建立索引,并在这基础上实现了全文搜索功能。
11. Ant:
Ant是一个基于Java的自动化脚本引擎,脚本格式为XML。
我们除了用Ant做Java编译相关任务外,还通过插件实现很多应用的调用。包括程序编译、打包、Hibernate配置文件自动生成、部署、以及单元测试等操作。
当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,Ant本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。
12. Axis:
Axis是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。SOAP是被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
网客通平台使用Axis提供WebService支持,广泛应用于通用数据接口,对外系统提供服务等功能。
如:
1) 商品查询服务:提供接口让外接系统可以查到平台中的商品信息。
2) 新闻发布服务:提供接口让外接系统可以取到各类新闻。
3) 订单服务:提供接口让外接系统可以在平台中生成订单,并获取各种订单信息。
注:上述服务都有严格的权限控制。
13. JavaMail:
JavaMail是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。
我们使用JavaMail实现了平台中邮件发送、群发等相关功能,供业务系统使用。
14. XDoclet:
XDoclet是一个开源项目,可以通过在java源代码中的一些特殊的注释信息,自动生成配置文件、源代码等等。例如web、ejb的部署描述文件等。
我们用XDoclet来生成Hibernate的hbm配置文件。
15. JSTL:
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。
我们使用JSTL封装各种业务逻辑。
16. Jakarta ORO:
Jakarta ORO Java 类是一套文本处理Java类,提供了与Perl5 兼容的规则表达式,类AWK规则表达式,glob 表达式,以及用于执行替换、分割、过滤文件名等的工具。这个包是OROMatcher, AwkTools, PerlTools, and TextTools libraries originally from ORO, Inc的后续产品。
网客通平台使用ORO处理正则表达式,广泛应用于各种文本处理中。
17. SwarmCache / JGroups:
SwarmCache是一个简单且有效的分布式缓存,它使用IP multicast与同一个局域网的其他主机进行通讯,是特别为集群和数据驱动web应用程序而设计的。SwarmCache能够让典型的读操作大大超过写操作的这类应用提供更好的性能支持。SwarmCache使用JavaGroups来管理从属关系和分布式缓存的通讯。
JGroups是一个开源的纯java编写的可靠的群组通讯工具。其工作模式基于IP多播,但可以在可靠性和群组成员管理上进行扩展。其结构上设计灵活,提供了一种灵活兼容多种协议的协议栈,对于每个产品都有不同的可靠性需求。这种协议栈可以让用户定义的自己可靠性指标和性能指标。
当使用集群环境时,系统存在着缓存同步的问题,需要对集群中每一台服务器的缓存进行同步,这样就必须要有一个缓存同步的机制,SwarmCache和JGroups就是为了解决这个问题而被加到网客通中。
18. JUnit:
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
我们主要用JUnit来进行单元测试。