在J2EE项目的开发阶段,开发人员通常使用的是JBoss开源应用服务器。而在生产阶段,商业应用服务器BEA WebLogic Server因其增强的特性成为不错的选择。遗憾的是,在JBoss中开发的应用程序不能在WebLogic Server上直接部署,需要进行修改。
原因是WebLogic Server的部署描述符与JBoss的部署描述符不同。将应用程序迁移到WebLogic上的方法是把特定于供应商的部署描述符转换为WebLogic部署描述符。在本文中,我们将把一个在JBoss中开发的EJB应用程序迁移到WebLogic应用服务器上,其中使用的数据库是MySQL。
初步安装
下载和安装BEA WebLogic Server(www.bea.com/framework.jsp?CNT=overview.htm &FP=/content/products/weblogic/server)。创建一个服务器域。下载MySQL JDBC驱动程序jar文件(www.mysql.com/products/connector/j/)和MySQL数据库服务器(www.mysql.com/products/mysql/)。开发一个Java应用程序或获取一个XSLT实用工具,使用XSLT把JBoss部署描述符转换为WebLogic部署描述符。
在部署描述符转换前,在JBoss中开发的应用程序不能在WebLogic中部署。在本文中,我们将通过转换部署描述符的方法,把一个在JBoss中开发的实体EJB应用程序示例迁移到WebLogic应用服务器上。
配置WebLogic JDBC
本小节描述在WebLogic Server上配置JDBC连接和MySQL数据库的方法。首先配置一个JDBC连接池,接下来配置用于访问JDBC连接池的JNDI数据源,然后把MySQL数据库驱动程序jar文件(mysql-connector-java-3.0.16-ga-bin.jar)添加到示例服务器的CLASSPATH变量中。WebLogic Server的CLASSPATH变量是在<BEA>\user_projects\domains\mydomain\startWebLogic脚本文件中进行设置的。双击该脚本文件,启动WebLogic示例服务器。服务器在端口7001启动。通过URL http://localhost:7001/console来登录WebLogic管理控制台(Administration Console)。在显示出来的管理控制台登录页面上输入用户名和口令,就可以登录到管理控制台。
在管理控制台中选择Services>JDBC节点。要配置JDBC连接池,右击Connection Pools节点,选择Configure a new JDBCConnectionPool。在Choose database frame displayed中选择MySQL作为Database Type(数据库类型),选择MySQL's Driver (Type 4)作为Database Driver(数据库驱动程序)。单击Continue按钮。接着指定JDBC连接的连接属性。在Database Name栏指定示例MySQL数据库的名字test,在Host Name栏指定localhost,在Database User Name栏指定root。用root用户名登录MySQL数据库不需要口令,但WebLogic Server需要为用户名指定一个口令。单击Continue按钮继续。
在Test database connection框中的Driver Classname栏指定MySQL驱动程序com.mysql.jdbc.Driver,该驱动程序用于建立与MySQL数据库的连接。在URL栏指定jdbc:mysql://localhost/test作为连接数据库的URL。单击Test Driver Configuration按钮,测试JDBC到数据库的连接。如果已建立连接,会显示内容为“connection successful”的消息。在Create and deploy框中,选择将要部署连接池的服务器。单击Create and deploy按钮,部署JDBC连接池到服务器上。配置好的连接会部署到示例服务器上,同时该连接池的节点被添加到JDBC>Connection Pools节点中。要修改连接池配置,选择该连接池节点,并修改各个选项卡上的设置:General、Target and Deploy、Monitoring、Control、Testing、Connections。
接下来,要配置WebLogic Server上的数据源。右击Services>JDBC节点,选择Configure a new JDBCTxDataSource,指定一个数据源名称,在JNDI Name栏为数据源指定JNDI名称,例如MySQLDS。单击Continue按钮继续。在Connect to connection pool框中,从连接池列表中选择前一节所配置的连接池,单击Continue按钮继续。在Target the data source框中选择一个服务器作为数据源的目标服务器,然后单击Create按钮。配置好的数据源会部署到示例服务器上,该数据源的节点被添加到数据源节点中。要修改数据源,选择该数据源的节点,并修改各个选项卡上的设置,包括Configuration、Target和Deploy。该数据源可以通过在数据源配置中所指定的JNDI名称MySQLDS来获取。
转换JBoss EJB应用程序
前一节已经在WebLogic Server上配置了MySQL数据库。下面我们将把JBoss EJB应用程序转换成WebLogic EJB应用程序,这涉及到部署描述符的转换。JBoss实体EJB应用程序由以下部分组成;EJB部署描述符(ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml)、bean类(CatalogBean.java)、远程接口(Catalog.java)和home接口(CatalogHome.java)。
要在JBoss服务器上部署实体EJB,应该创建一个EJB JAR文件。该文件结构如下:
META-INF/
ejb-jar.xml
jboss.xml
jbosscmp-jdbc.xml
CatalogBean.class
Catalog.class
CatalogHome.class
部署描述符中指定了EJB的结构化信息和应用程序汇编信息。结构化信息中包含将这个EJB指定为会话EJB还是实体EJB。ejb-jar.xml部署描述符中的应用程序汇编信息是在assembly-descriptor元素中指定的。JBoss中实体EJB的部署描述符为ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml,而WebLogic中对应的部署描述符依次是ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml。下面我们将介绍这些文件间的转换。
ejb-jar.xml部署描述符对于WebLogic和JBoss是相同的,清单4显示了示例实体EJB的该部署描述符,其中定义了一个名为Catalog的实体EJB,它包含3个CMP字段:catalogId、journal和publisher,主键字段是catalogId。
在我看来jboss的配置还是比较简单,不是很复杂和难以理解的,尽管都是手工的(没有人用jmx-console配吧),虽然weblogic的配置很图形化,但是不知道配置的东东跑到什么地方去了,config.xml文件只能找到connection pool等得配置,但是系统级的找不着,很典型的是log级别的配置,不知放哪里了,对weblogic了解不深,还望各位高手指点。
第一步:jbosscmp-jdbc.xml->weblogic-cmp-rdbms-jar.xml
如果你没有weblogic-cmp-rdbms-jar.xml文件的样本,jbuilder生成一个。
这个文件主要包含ejb字段和数据库字段的对应关系,移植这个文件修改不是很多,主要是datasource
需要修改,其余就是tag的不同了。
首先是数据源的修改,weblogic和jboss都提供对某个具体的EntityBean的datasource定义,而jboss还提供所有缺省的datasource,所以如果jbosscmp-jdbc.xml用的缺省的datasource形如:
<defaults> <datasource>java:/OracleDS</datasource> <datasource-mapping>Oracle9i</datasource-mapping> <create-table>false</create-table> </defaults> |
的得修改一下了,加到每个WEBLOGIC 每个定义entity下。另外java:/OracleDS得修改为OracleDS
示例:
jbosscmp-jdbc.xml <jbosscmp-jdbc> <defaults> <datasource>java:/OracleDS</datasource> <datasource-mapping>Oracle9i</datasource-mapping> <create-table>false</create-table> </defaults> <enterprise-beans> <entity> <ejb-name>Test</ejb-name> <table-name>Test</table-name> <cmp-field> <field-name>lineNbr</field-name> <column-name>LINE_NBR</column-name> </cmp-field> <cmp-field> <field-name>nxxNbr</field-name> <column-name>NXX_NBR</column-name> </cmp-field> </entity> <enterprise-beans> .... </bosscmp-jdbc> |
移植后的WEBLOGIC weblogic-cmp-rdbms-jar.xml
<weblogic-rdbms-jar> <weblogic-rdbms-bean> <ejb-name>AccNbr</ejb-name> <data-source-name>OracleDS</data-source-name> <table-map> <table-name>Test</table-name> <field-map> <cmp-field>lineNbr</cmp-field> <dbms-column>LINE_NBR</dbms-column> </field-map> <field-map> <cmp-field>nxxNbr</cmp-field> <dbms-column>NXX_NBR</dbms-column> </field-map> </table-map> </weblogic-rdbms-bean> .... </weblogic-rdbms-jar> |
注意weblogic datasource每个entity都需定义
第二步:jboss.xml->weblogic-ejb-jar.xml
jboss.xml中主要描述的是EJB的local和remote jndi名称,以及EJB资源和实际的对应关系
weblogic.xml中也是如此,weblogic中还必须定义Entity的persistence type。
除此,如过你没有用到别的依赖服务器的设置,基本上修改也就不多了。
sessionbean大体上不用修改啥,修改一下tag就ok了。对于entity还得加上entity-descriptor
示例:
jboss.xml <entity> <ejb-name>Test</ejb-name> <local-jndi-name>Test</local-jndi-name> </entity> weblogic-ejb-jar.xml <weblogic-enterprise-bean> <ejb-name>Test</ejb-name> <entity-descriptor> <persistence> <persistence-use> <type-identifier>WebLogic_CMP_RDBMS</type-identifier> <type-version>6.0</type-version> <type-storage>META-INF/weblogic-cmp-rdbms-jar.xml</type-storage> </persistence-use> </persistence> </entity-descriptor> <local-jndi-name>Test</local-jndi-name> </weblogic-enterprise-bean> |
对于ejb来将需要修改的地方只有两处了,当然如果你需要调整一下性能,那就是以后慢慢加的事了。
对于web应用来要可能增加weblogic.xml配置文件(如果你定义了ejb引用的话),也可以不要。
好了部署文件的修改完了。下面是weblogic的配置了,网上weblogic配置的文档也不少。我大概说说datasource配置,以及和jboss的区别
jboss: 在JBOSS_HOME\docs\examples\jca目录中有关于各个数据库的配置(如oracle-ds.xml),修改一下然后放到jboss的deploy目录下(jboss默认启动的是default那个目录,如果你要启动别的配置,需加参数-c),注意jndi-name名称就是你在部署文件中用到的OracleDS,如果你想加一些其他的关于datasource的配置(如对最大连接数的配置),可以将jca目录下generic-ds.xml配置考到你的文件中,那个是所有ds的默认配置。(3.2.1和3.0.X不同)
weblogic:先配置connection pools,配置一个连接,然后再新建一个datasource就ok了.
这里有点说明:weblogic的DataSourceJndi是OracleDS,而jboss是java:/OracleDS,注意两者datasource的区别.
配置好后可以将你文件打包部署到weblogic上了,如果在developmentmode模式,可以直接将文件copy到user_projects\mydomain\applications下,weblogic会自动部署,不过你上控制台看一下部署好的应用名可能不是你刚才的那个,weblogic也自动生成一个临时的名称
也可以直接再控制台上上传文件部署,或者用别的工具了.
说一下部署过程中会遇到的一些问题.
1.不符合ejb规范.报错ejbc....之类的错误,这种情况最好在部署时将weblogic的log级别调整到info lever,这样可以看到具体是什么地方不符合规范.如果你只通过web看部署的错误,你会弄的一头雾水的.:)
这里要说一点的是,我原来用xdoclet生成的ejb在jboss上部署没问题,在weblogic中部署提示少了一个ejbRemove方发,查了一下果然是少了,而jboss部署没有报错,这可能和实现有关系,weblogic是通过ejbc生成stub和proxy代码,而jboss主要使用的reflect,会提供给ejb一些默认的方法.(个人想法)
2.datasource没找着,在部署entity时,会根据datasource去找数据源的,如果你部署文件写错了,或者你配置的有问题,都会引起该问题.
3.log4j问题,JBOSS是使用的log4j做为日志,所以原来程序的log配置都和jboss放在一起了,现在移值到weblogic上,呵呵,都没了,只是我的info lever的日志可以出来.看来得手工配一配了:)
以上讲的是ejb移植平台最基本的配置,由于本人对weblogic不熟,没有涉及高级一些的配置.其中有些不对的