陈设基于JBoss的J2EE应用措施
副标题#e#
JBoss,作为J2EE应用处事器,以其EJB容器卓越的机能、技能的潮水性、开拓陈设J2EE应用的利便性赢得了许多J2EE开拓者的信赖。个中,免安装、基于JMX构架、热陈设(Hot Deploy)、快速开拓EJB应用等几项特征与其他商用处事器对比,显得有些自得忘形的样子。尽量其自己没有重大的缺陷,但究竟是Open Source的开拓模式,文档很少,因此要很好的把握、能干开拓基于JBoss的应用照旧显得有些力有未逮。
本文结相助者的开拓履历,给出在JBoss 3.2.1下开拓J2EE的一些很实用的相关的留意事项和法则。个中,读者必然要知道JBoss 3.2.1作为JBoss的过渡产物(与JBoss 3.0.x、JBoss 4.x对比),自然有些对象和JBoss 3.0.x、JBoss 4.x有很大不同。可是,一般环境下,本文先容的内容,概略上都适合JBoss各个版本。
下载完JBoss 3.2.1后,解压到一个没有空格的目次路径下面就可以运行JBoss,所以很利便,但前提是方针呆板安装了Java 2 Standard Edition。一切停当后,我们就开始吧。(假设JBoss 3.2.1安装在:C:jboss-3.2.1_tomcat-4.1.24,本利用default设置)
一、相关设置文件的配置
为开拓J2EE应用,操纵数据库成了必不行少的内容;调理日志输出的具体水平成了调试J2EE应用的要害;EJB应用的调优进程是J2EE应用的焦点。
1. 数据源的设置:
在JBoss 3.2.1中,设置数据源的步调很简朴,JBoss 3.2.1自己带了主流数据库的设置实例,于目次下:C:jboss-3.2.1_tomcat-4.1.24docsexamplesjca。详细利用哪个设置文件取决于方针用户的数据库。假如是SQL Server 2000,则需要利用mssql-ds.xml文件(支持当地事务)可能mssql-xa-ds.xml文件(支持全局事务);假如是Oracle 9i数据库,则需要利用oracle-ds.xml文件可能oracle-xa-ds.xml文件等。这里以SQL Server 2000为例。
首先将mssql-ds.xml文件拷贝到目次:C:jboss-3.2.1_tomcat-4.1.24serverdefaultdeploy下。然后打开文件,并作如下修改:
<datasources>
<local-tx-datasource>
<jndi-name>VSSDB</jndi-name>
<connection-url>jdbc:microsoft:sqlserver://125.16.45.158:1433;DatabaseName=DDD
</connection-url>
<driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class>
<user-name>sa</user-name>
<password>sa</password>
<min-pool-size>50</min-pool-size>
<max-pool-size>200</max-pool-size>
</local-tx-datasource>
</datasources>
假如方针J2EE应用只需要当地事务,则上述进程已经完成了Datasource的设置,同时这个设置将用于JDBC以及EJB通过JNDI利用。假如要实现EJB利用Datasource,则还需要修改位于目次:C:\jboss-3.2.1_tomcat-4.1.24\server\default\conf下的standardjbosscmp-jdbc.xml文件。好比:
<jbosscmp-jdbc>
<defaults>
<datasource>java:/VSSDB1</datasource>
<datasource-mapping>MS SQLSERVER2000</datasource-mapping>
<create-table>true</create-table>
<remove-table>false</remove-table>
<read-only>false</read-only>
<time-out>300</time-out>
<pk-constraint>true</pk-constraint>
<fk-constraint>false</fk-constraint>
个中,java:/VSSDB中的VSSDB就是mssql-ds.xml设置的数据源;而“java:/”前缀表白该定名空间只是对JBoss自己可见,即运行于JBoss外的应用是不可以或许利用这里界说的数据源,这一点但愿留意。
其次,MS SQLSERVER2000中的MS SQLSERVER2000可以在该文件的其他处所找到。(假如是其他数据库,环境都是雷同的)
2. 日志的输出具体水平设置:
由于JBoss 3.2.1开拓回收了Log4j打点其日志信息(严格地讲,它扩展了Log4j),因此相识Log4j的机理,有助于领略JBoss 3.2.1打点日志的方法。JBoss 3.2.1回收JMX架构的同时,且以.xml文件范例为设置文件,因此可以找到位于目次:C:\jboss-3.2.1_tomcat-4.1.24\server\default\conf下的log4j.xml文件。好比,个中一段设置示譬喻下:
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<param name="Threshold" value="INFO"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n-->
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
好比,为了调理JBoss 3.2.1节制台日志输出的具体水平(调解为DEBUG级别),我们需要修改value=”INFO”,将INFO改为DEBUG。 假如开拓Entity Beans,可以调理位于与log4j.xml文件同一目次下的standardjboss.xml文件(该文件主要是提供修改EJB相关的调试、运行、调优、陈设参数)。假如Entity Beans回收的为Standard CMP 2.x EntityBean,则将个中的属性的取值改为true。
#p#分页标题#e#
<container-configuration>
<container-name>Standard CMP 2.x EntityBean</container-name>
<call-logging>false</call-logging>
<invoker-proxy-binding-name>entity-rmi-invoker</invoker-proxy-binding-name>
<sync-on-commit-only>false</sync-on-commit-only>
完成上述两步后,在调试Entity Beans时通过节制台,可以看到Entity Beans发出的JDBC挪用细节。
#p#副标题#e#
3. Tomcat容器相关参数的设置:
假如利用JBoss 3.2.1与Tomcat 4.1.24的集成版本,则可以通过调理别离位于目次:C:jboss-3.2.1_tomcat-4.1.24serverdefaultdeployjbossweb-tomcat.sar下的web.xml和目次:C:jboss-3.2.1_tomcat-4.1.24serverdefaultdeployjbossweb-tomcat.sarMETA-INF下的jboss-service.xml文件来到达方针读者特定需求。好比,假如想将HTTP处事端口改为80,则可以修改jboss-service.xml文件;假如想使方针J2EE应用处理惩罚更多的文件范例,可以修改web.xml文件。
4. 相关类库的安排:
假如应用涉及到第三方类库,好比JDBC Driver,则可以将这些JDBC Driver存放到目次下:C:jboss-3.2.1_tomcat-4.1.24serverdefaultlib。留意,不是目次:C:jboss-3.2.1_tomcat-4.1.24lib下。
假如是与方针J2EE应用相关,则可以存放到方针.war(可能.ear)内里,可能xxx.war目次中的WEB-INFOlib下。无论那种景象,都需要遵循J2EE类型。虽然,JBoss 3.2.1的设置文件有许多,好比尚有提供邮件处事的mail-service.xml文件等。
二、开拓EJB应用
假如开拓EJB应用,发起回收JBoss作为开拓处事器,因为开拓、调试、陈设速度快。假如回收其他商用处事器,由于实现机理的差异,其编译的速度很慢。假如回收Entity Beans技能,则您需要知道这几点。第一,您方针系统的数据源有几多个操纵进口,等于否存在Entity Beans之外的方法来操纵数据库。假如有,则需要调理相应的提交计策以及计策。
好比,JBoss 3.2.1回收的方法有4种:A、B、C、D。虽然,假如除了Entity Beans会见数据库外,别无它出,回收A是很理智的。假如有,则需要取决于详细的环境利用方法。同时,方法的选择与计策有干系。可以或许回收的Entity Beans或Entity Beans Methods,则只管回收,这样会淘汰或消除死锁产生的大概性。只管回收1:n的干系来操纵n方的数据表布局,这样可以或许提高EJB Container的效率。
一般环境下,J2EE应用处事器支持JDBC事务、JTA事务、容器打点事务。同时,最好不要在措施中同时利用上述三种事务范例,好比在JTA事务中嵌套JDBC事务;第二方面,事务要在尽大概短的时间内完成,不要在差异要领中实现事务的利用。好比,下面给出了回滚JDBC事务的代码示例:
public void processT(String orders) {
Context initCtx = new InitialContext();
javax.sql.DataSource ds = javax.sql.DataSource)initCtx.lookup
(“java:comp/env/jdbc/OrdersDB”);
java.sql.Connection conn = ds.getConnection();
try{
conn.setAutoCommit( false ); //变动JDBC事务的默认提交方法
orderNo = createOrder( orders );
updateOrderStatus(orderNo, “orders created”);
conn.commit();//提交JDBC事务
}catch( Exception e ){
try{
conn.rollback();//回滚sJDBC事务
throw new EJBException(“事务回滚: “ + e.getMessage());
}catch( SQLException sqle ){
throw new EJBException(“呈现SQL操纵错误: “ + sqle.getMessage());
}
}
}
下面给出了JTA事务代码示例:
public void processOrder(String orderMessage) {
UserTransaction transaction = mySessionContext.getUserTransaction();//得到JTA事务
try{
transaction.begin();//开始JTA事务
orderNo = sendOrder(orderMessage);
updateOrderStatus(orderNo, “order sent”);
transaction.commit();//提交JTA事务
}catch(Exception e){
try{
transaction.rollback();//回滚JTA事务
}catch(SystemException se){
se.printStackTrace();
}
throw new EJBException(“事务回滚: “ + e.getMessage());
}
}
同时,假如Session Bean回收JTA打点事务,必然不要通过JNDI获取JTA事务,不然功效不堪设想;而是回收雷同,“mySessionContext.getUserTransaction()”的要领获取。
最后,可以利用容器打点事务(CMT)。在利用CMT进程中,假如声明让容器完成事务回滚,则方针EJB应用必需抛出系统级异常,不然容器是不会满意事务的ACID。在包javax.ejb的异常类中,除了NoSuchEntityException和EJBException属于系统级异常外,其他的异常全部是应用级异常。
#p#分页标题#e#
别的,在开拓Entity Beans进程中,可以或许利用CMP的处所只管不要回收BMP的方法。假如拟回收BMP的方法,还不如回收Session Bean + JDBC,个中可以通过JTA节制事务(假如机能问题不是很重要的话)。可以或许通过容器实现的事务(即,通过声明)的处所只管回收,提高开拓效率,使得您可以越发专注于业务逻辑自己。只管回收J2EE类型回收的各项技能。假如方针系统需要移植,但利用了许多与JBoss特有的技能,其移植事情则很贫苦。
三、开拓Web应用
一般环境下,开拓Web应用最好回收一些Thirty-Part软件可能Framework。好比,Struts、Log4j、webMethods等等。其优势显而易见。
就今朝而言,Struts的应用根基上成为了开拓Web应用的尺度。即将推出来的JSF很好的实现了与Struts的增补和集成。同时,JSF也将给快速开拓JSP Web前端应用带来革命。别的,Struts也恰恰促进了JSF的成长。开拓JBoss 3.2.1下的Web应用的进程和其他应用处事器下都差不多。