欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JBoss EJB应用程序迁移到WebLogic上

程序员文章站 2022-05-26 08:33:41
...

在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不熟,没有涉及高级一些的配置.其中有些不对的