将JBoss EJB应用程序迁移到WebLogic上

本文介绍如何将JBoss中的EJB应用程序迁移到WebLogic应用服务器,涉及部署描述符的转换过程,包括从JBoss特定描述符到WebLogic特定描述符的转换方法。
时间:2005-11-03
作者: Ajay Vohra, Deepak Vohra
在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应用服务器上。

  示例应用程序包含一个Catalog实体EJB。清单1中显示的是该EJB的bean类(CatalogBean.java)。远程接口(Catalog.java)和home接口(CatalogHome.java)显示在清单2和清单3中。把JBoss EJB应用程序部署到WebLogic中并不需要修改实体EJB类,只需要修改该EJB的部署描述符。

清单1:CatalogBean.java

import javax.ejb.*;

abstract public class CatalogBean implements EntityBean {


  private EntityContext ctx;

	public CatalogBean() {};


  public void setEntityContext(EntityContext ctx) {

    this.ctx = ctx;
  }


  public void unsetEntityContext() {
    this.ctx = null;


  }

	abstract public String getCatalogId();
	abstract public void setCatalogId(String catalogId);

	abstract public String getJournal();
	abstract public void setJournal(String journal);

	abstract public String getPublisher();
	abstract public void setPublisher(String publisher);

  public void ejbActivate() {

  }


  public void ejbPassivate() {

  }


  public void ejbLoad() {

  }

  public void ejbStore() {

  }


  public void ejbRemove()
    throws RemoveException
  {

  }


  public String ejbCreate(String catalogId)
    throws CreateException
  {


    setCatalogId(catalogId);


    return null;
  }


  public void ejbPostCreate(String catalogId)
  {

  }



}

清单2:Catalog.java

import java.rmi.RemoteException;
import javax.ejb.*;


public interface Catalog extends EJBObject {


  public String getCatalogId()
    throws RemoteException;

  public String getJournal()
    throws RemoteException;

  public String getPublisher()
    throws RemoteException;

   public void setJournal(String journal)
    throws RemoteException;

  public void setPublisher(String publisher)
    throws RemoteException;

}

清单3:CatalogHome.java

import javax.ejb.CreateException;
import javax.ejb.EJBHome;
import javax.ejb.FinderException;
import java.rmi.RemoteException;



public interface CatalogHome extends EJBHome {


  public Catalog create(String catalogId)
    throws CreateException, RemoteException;

  public Catalog findByPrimaryKey(String catalogId)
    throws FinderException, RemoteException;



}

配置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。

清单4:ejb-jar.xml

<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC
"-//Sun Microsystems, Inc.//DTD Enterprise 
JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <entity> <ejb-name>Catalog</ejb-name> <home>com.ejb.CatalogHome</home> <remote>com.ejb.Catalog</remote> <ejb-class>com.ejb.CatalogBean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.String</prim-key-class> <reentrant>False</reentrant> <cmp-version>2.x</cmp-version> <abstract-schema-name>CatalogBean
</abstract-schema-name> <cmp-field> <field-name>catalogId</field-name> </cmp-field> <cmp-field> <field-name>journal</field-name> </cmp-field> <cmp-field> <field-name>publisher</field-name> </cmp-field> <primkey-field>catalogId</primkey-field> </entity> </enterprise-beans> </ejb-jar>

从weblogic-ejb-jar.xml到jboss.xml的转换

  weblogic-ejb-jar.xml和jboss.xml是特定于供应商的EJB部署描述符。为了在WebLogic应用服务器上部署JBoss EJB应用程序,要将jboss.xml转换成weblogic-ejb-jar.xml。jboss.xml中的根元素是jboss,weblogic-ejb-jar.xml中的根元素是weblogic-ejb-jar。对于jboss.xml和weblogic-ejb-jar.xml,都可以在jndi-name或local-jndi-name元素中指定EJB的JNDI名称。清单5显示的是示例实体EJB的jboss.xml部署描述符。weblogic-ejb-jar.xml部署描述符中的DOCTYPE元素如下:

<!DOCTYPE weblogic-ejb-jar PUBLIC
"-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN"
"http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd" > 

  jboss.xml部署描述符中的DOCTYPE元素如下:

<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">

清单5:jboss.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">
<jboss>
 <enterprise-beans>
  <entity>
   <ejb-name>Catalog&Lt;/ejb-name>
   <jndi-name>com.ejb.CatalogHome&Lt;/jndi-name>
  </entity>
 </enterprise-beans>
</jboss>

  使用定制的XSLT样式表,即weblogic-ejb-jar.xslt(参见清单6),将ejb-jar.xml部署描述符转换为weblogic-ejb-jar.xml部署描述符。该样式表创建了weblogic-ejb-jar.xml,它是JBoss上的jboss.xml文件在WebLogic上的等效。清单7中显示的是weblogic-ejb-jar.xslt样式表所生成的weblogic-ejb-jar.xml文件。

清单6:weblogic-ejb-jar.xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" doctype-public=
"-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN" doctype-system=
"http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd"/> <xsl:template match="/jboss"> <weblogic-ejb-jar> <xsl:apply-templates select="enterprise-beans/entity"/> </weblogic-ejb-jar> </xsl:template> <xsl:template match="entity"> <weblogic-enterprise-bean> <ejb-name><xsl:value-of select="ejb-name"/></ejb-name> <entity-descriptor> <persistence> <persistence-use> <type-identifier>WebLogic_CMP_RDBMS</type-identifier> <type-version>7.0</type-version> <type-storage>META-INF/
weblogic-cmp-rdbms-jar.xml</type-storage> </persistence-use> </persistence> </entity-descriptor> <jndi-name><xsl:value-of select="jndi-name"/></jndi-name> </weblogic-enterprise-bean> </xsl:template> </xsl:stylesheet>

清单7:weblogic-ejb-jar.xml

<?xml version="1.0"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC
"-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN"
"http://www.bea.com/servers/wls810
/dtd/weblogic-ejb-jar.dtd" > <weblogic-ejb-jar> <weblogic-enterprise-bean> <ejb-name>Catalog</ejb-name> <entity-descriptor> <persistence> <persistence-use> <type-identifier>WebLogic_CMP_RDBMS</type-identifier> <type-version>7.0</type-version> <type-storage>META-INF/weblogic-cmp
-rdbms-jar.xml</type-storage> </persistence-use> </persistence> </entity-descriptor> <jndi-name>com.ejb.CatalogHome</jndi-name> </weblogic-enterprise-bean> </weblogic-ejb-jar>

从jbosscmp-jdbc.xml到weblogic-cmp-rdbms-jar.xml的转换

  weblogic-cmp-rdbms-jar.xml中指定了CMP实体EJB的数据库持久性信息。该文件包含实体EJB的表格名称、连接数据库的数据源和与该EJB CMP字段相对应的列。用于指定CMP实体EJB持久性信息的JBoss部署描述符是jbosscmp-jdbc.xml,清单8显示了示例EJB的jbosscmp-jdbc.xml。

清单8:jbosscmp-jdbc.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jbosscmp-jdbc PUBLIC 
"-//JBoss//DTD JBOSSCMP-JDBC 4.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_4_0.dtd"> <jbosscmp-jdbc> <defaults> <datasource>java:/MySqlDS</datasource> <datasource-mapping>mySQL</datasource-mapping> </defaults> <enterprise-beans> <entity> <ejb-name>Catalog</ejb-name> <create-table>true</create-table> <table-name>Catalog</table-name> <cmp-field> <field-name>catalogId</field-name> <column-name>catalogId</column-name> </cmp-field> <cmp-field> <field-name>journal</field-name> <column-name>journal</column-name> </cmp-field> <cmp-field> <field-name>publisher</field-name> <column-name>publisher</column-name> </cmp-field> </entity> </enterprise-beans> </jbosscmp-jdbc>

  weblogic-cmp-rdbms-jar.xml中根元素是weblogic-rdbms-jar,jbosscmp-jdbc.xml中根元素是jbosscmp-jdbc。weblogic-cmp-rdbms-jar.xml文件中的data-source-name元素指定了连接到数据库的数据源,它等效于jbosscmp-jdbc.xml部署描述符中的datasource元素。weblogic-cmp-rdbms-jar.xml文件中的field-map元素指定了实体EJB CMP字段与数据库中表的列之间的映射关系,它等效于jbosscmp-jdbc.xml部署描述符中的cmp-field元素。weblogic-cmp-rdbms-jar.xml文件中dbms-column元素指定了一个列的名称,它等效于jbosscmp-jdbc.xml部署描述符中的column-name元素。

weblogic-cmp-rdbms-jar.xml文件中的DOCTYPE如下:

<!DOCTYPE weblogic-rdbms-jar PUBLIC
'-//BEA Systems, Inc.//DTD WebLogic 8.1.0 
EJB RDBMS Persistence//EN' 'http://www.bea.com/servers/wls810/dtd
/weblogic-rdbms20-persistence-810.dtd'>

  jbosscmp-jdbc.xml文件中的DOCTYPE如下:

<!DOCTYPE jbosscmp-jdbc PUBLIC "
-//JBoss//DTD JBOSSCMP-JDBC 4.0//EN" "http://www.jboss.org/j2ee/dtd
/jbosscmp-jdbc_4_0.dtd">

  使用定制的XSLT样式表(weblogic-cmp-rdbms-jar.xslt)(参见清单9)进行jbosscmp-jdbc.xml到weblogic-cmp-rdbms-jar.xml的转换。该样式表创建了weblogic-cmp-rdbms-jar.xml,它是JBoss上的jbosscmp-jdbc.xml文件在WebLogic上的等效。清单10中显示的是weblogic-cmp-rdbms-jar.xml。

清单9:weblogic-cmp-rdbms-jar.xslt

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" doctype-public=
"-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB
RDBMS Persistence//EN"
doctype-system="http://www.bea.com/servers
/wls810/dtd/weblogic-rdbms20-persistence-810.dtd"/>
<xsl:template match="/jbosscmp-jdbc">

<weblogic-rdbms-jar>
<xsl:apply-templates select="enterprise-beans/entity"/>
<create-default-dbms-tables>
AlterOrCreate</create-default-dbms-tables>
</weblogic-rdbms-jar>
</xsl:template>

<xsl:template match="entity">
<weblogic-rdbms-bean>
<ejb-name><xsl:value-of select="ejb-name"/></ejb-name>
<data-source-name><xsl:value-of
select="../../defaults/datasource"/></data-source-name>
<table-map>
<table-name><xsl:value-of select="table-name"/></table-name>

<xsl:apply-templates select="cmp-field"/>
</table-map>

</weblogic-rdbms-bean>


</xsl:template>

<xsl:template match="cmp-field">
<field-map>
<cmp-field><xsl:value-of select="field-name"/>
</cmp-field>
<dbms-column><xsl:value-of select="column-name"/>
</dbms-column>
</field-map>
</xsl:template>
</xsl:stylesheet>

清单10:weblogic-cmp-rdbms-jar.xml

<?xml version="1.0"?>
<!DOCTYPE weblogic-rdbms-jar PUBLIC 
'-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB RDBMS 
Persistence//EN' 'http://www.bea.com/servers/wls810/dtd/
weblogic-rdbms20-persistence-810.dtd'> <weblogic-rdbms-jar> <weblogic-rdbms-bean> <ejb-name>Catalog</ejb-name> <data-source-name>java:/MySqlDS</data-source-name> <table-map> <table-name>Catalog</table-name> <field-map> <cmp-field>catalogId</cmp-field> <dbms-column>catalogId</dbms-column> </field-map> <field-map> <cmp-field>journal</cmp-field> <dbms-column>journal</dbms-column> </field-map> <field-map> <cmp-field>publisher</cmp-field> <dbms-column>publisher</dbms-column> </field-map> </table-map> </weblogic-rdbms-bean> <create-default-dbms-tables>AlterOrCreate
</create-default-dbms-tables> </weblogic-rdbms-jar>

  WebLogic部署描述符中的DTD与JBoss部署描述符中的DTD是不同的。借助于XSLT(如果要在部署描述符中表示附加的元素,可以修改定制的XSLT),可以实现从JBoss部署描述符到WebLogic部署描述符的转换。接下来会将EJB应用程序部署到WebLogic Server上。

在WebLogic上部署EJB应用程序

  完成从JBoss EJB部署描述符到WebLogic部署描述符的转换后,在WebLogic Server上创建一个EJB JAR文件,该文件的结构如下:

META-INF/
  ejb-jar.xml
  weblogic-ejb-jar.xml
  weblogic-cmp-rdbms-jar.xml
CatalogBean.class
Catalog.class
CatalogHome.class

  编译示例EJB类和接口。

java Catalog.java CatalogBean.java CatalogHome.java

  将WebLogic部署描述符(ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml)复制到META-INF目录下。使用JAR工具(http://java.sun.com/j2se/1.4.2/docs/ tooldocs/windows/jar.html)从WebLogic部署描述符、类和接口创建一个JAR文件。

jar cf CatalogEJB.jar CatalogBean.class
Catalog.class CatalogHome.class META-INF/*.xml

  要部署WebLogic实体EJB应用程序,把JAR文件CatalogEJB.jar复制到<BEA>\user_projects\domains\mydomain\applications下,其中<BEA>是安装WebLogic Server的目录。当服务器启动后,EJB应用程序就部署到WebLogic Server上了。WebLogic Server上的应用程序目录对应于Jboss应用服务器上的部署目录。

结束语

  通过转换部署描述符,JBoss上的实体EJB应用程序可以迁移到WebLogic应用服务器上。使用类似的过程,通过将jboss-web.xml部署描述符转换成weblogic.xml,JBoss J2EE Web应用程序也可以迁移到WebLogic上。

原文出处

Migrating a JBoss EJB Application to WebLogic

http://wldj.sys-con.com/read/117492.htm

<!--文章其他信息-->
作者简介
Ajay Vohra 是DataSynapse公司的高级解决方案架构师。
Deepak Vohra 是一名NuBean顾问兼web开发人员。他拥有Sun Certified Java 1.4 Programmer和Sun Certified Web Component Developer for J2EE证书。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值