EJB應用從WebLogic到JBoss的遷移方法

WebLogic服務器是一種領先的商業應用服務器。但對於小型企業的開發人員,基於標準的開源應用服務器JBoss可用於替代WebLogic和WebSphere等商業應用服務器。不幸的是,在WebLogic上開發的應用不能部署到JBoss上。JBoss遷移服務(Migration Services)對遷移應用至JBoss提供了支持。該方法,通過將特定廠商的部署描述符轉換成JBoss兼容的描述器,使應用遷移到JBoss上。爲了示範應用遷移的效果,我們把在WebLogic中對Oracle數據庫開發的EJB應用遷移到使用開源的MySQL數據庫的JBoss應用服務器。

本指南有如下幾個部分:
1.        初始設置
2.        概述
3.        根據MySQL配置JBoss
4.        轉換WebLogic的EJB應用
5.        在JBoss中部署EJB應用

初始設置
用MySQL數據庫驅動程序類配置MySQL數據庫的JDBC連接
1.        下載MySQL JDBC驅動程序.jar文件。
2.        下載並安裝MySQL數據庫服務器。
3.        下載並安裝JBoss 4.0應用服務器。

開發一個可用XSLT把WebLogic部署描述符轉換成JBoss部署描述符的Java應用程序。部署描述符同樣可用XSLT工具進行轉換。

概述
在不作任何改動的情況下,爲WebLogic開發的應用無法在JBoss中部署,因爲JBoss應用服務器的部署描述符有別於WebLogic的部署描述符。在本指南中,我們將通過把WebLogic部署描述符轉換成JBoss部署描述符,把一個在WebLogic中開發的實體EJB應用範例遷移到JBoss中。

該應用範例由一個Catalog實體EJB構成。本文後的Resources部分有一個weblogic-jboss-resources.zip範例文件,裏面存放有EJB的bean類(CatalogBean.java)、遠程接口(Catalog.java)和本地接口(CatalogHome.java)。配置JBoss要用到MySQL開源數據庫。要把WebLogic中的應用遷移到JBoss,不必改動實體EJB類,只需改動EJB部署描述符即可。

在JBoss中使用MySQL
MySQL是一個適合開源項目和小型企業的開源數據庫。用MySQL數據庫配置JBoss需要作如下改動:

配置JBoss的Classpath
根據MySQL配置JBoss 4.0,首先需要複製驅動程序類的.jar文件mysql-connector-java-3.0.9-stable-bin.jar到<JBoss>/server/default/lib目錄。這裏<JBoss>是你的JBoss應用服務器安裝目錄。lib目錄中的.jar和.zip文件存在於JBoss服務器的Classpath中。

配置MySQL數據源
要使用MySQL數據源,複製<JBoss>/docs/examples/jca/mysql-ds.xml到<JBoss>/server/default/deploy目錄。在JBoss服務器啓動時,存在於deploy目錄下的數據源配置文件將被部署。對mysql-ds.xml配置文件的改動如下:
•設置<driver-class/>爲com.mysql.jdbc.Driver,<connection-url/>爲jdbc:mysql://localhost/<database>,這裏的<database>指的是MySQL數據庫。<database>值可命名爲test——本文所創建的MySQL範例數據庫。
•在jndi-name元素中指明數據源JDDI名。
•設定連接MySQL的用戶名和密碼。默認情況下,對於root用戶名無需密碼。
•設定type-mapping元素爲mySQL。type-mapping元素指明瞭先前在standardjbosscmp-jdbc.xml部署描述符中定義的數據庫類型映射。對於MySQL數據庫,類型映射名爲mySQL。

改動後的mysql-ds.xml就像這樣:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost/test</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password></password>
    <metadata>
         <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>



通過數據源的JNDI名,我們可以從數據源獲得一條JDBC連接:

    InitialContext initialContext = new InitialContext();
    javax.sql.DataSource ds = (javax.sql.DataSource)
    initialContext.lookup("java:/MySqlDS");
    java.sql.Connection conn = ds.getConnection();



配置登陸
接下來,我們根據MySQL數據庫的設置改動login-config.xml配置文件。登陸MySQL數據庫須用到應用方案MySqlDbRealm。在login-config.xml中添加以下<application-policy/>元素:

<application-policy name = "MySqlDbRealm"> 
   <authentication>
      <login-module code =  
              "org.jboss.resource.security.ConfiguredIdentityLoginModule"
                     flag = "required">
         <module-option name ="principal"></module-option>
         <module-option name ="userName">root</module-option>
         <module-option name ="password"></module-option>
         <module-option name ="managedConnectionFactoryName">  
            jboss.jca:service=LocalTxCM,name=MySqlDS
         </module-option>
      </login-module>
   </authentication>
</application-policy>  



通過改動mysql-ds.xml和login-config.xml文件,JBoss 4.0服務器已經可以與MySQL數據庫協同工作。除上述設置外,可能還需爲JBoss部署描述符和JBoss JDBC配置文件作一些額外的改動。

部署CMP實體EJB時,若選擇了“create table”(在jbosscmp-jdbc.xml中把create-table元素改爲true),並且某個MySQL表的主鍵(唯一鍵)長度超過了500字節,應用的部署將在MySQL數據庫中產生一條SQL語法錯誤警告。對於java.lang.String類型的CMP字段,我們知道在standardjbosscmp-jdbc.xml部署描述符中有mySQL類型映射,所以我們可以設置sql-type爲java中的 java.lang.String類型,可減少VARCHAR值,從而減少了主鍵(唯一鍵)的長度。另一個可能出現的問題涉及部署描述符中的column-name元素。如果MySQL中某張表的某一字段與MySQL保留字相同,在把J2EE應用部署到JBoss後將產生錯誤,解決問題的辦法是,把該字段名換成非MySQL保留字。

轉換WebLogic的EJB應用
設置完MySQL和JBoss後,我們現在需要把WebLogic的EJB應用轉換爲JBoss的EJB應用。這一過程涉及改變部署描述符。WebLogic的實體EJB應用由EJB部署描述符(ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml)、bean類(CatalogBean.java)、遠程接口(Catalog.java)和本地接口(CatalogHome.java)構成。在WebLogic服務器中部署實體EJB時,創建了一個EJB的.jar文件;這個EJB的.jar文件有如下結構:

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



部署描述符中指明瞭EJB結構信息和應用組合信息。結構信息包括指出EJB是一個會話EJB還是實體EJB。ejb-jar.xml部署描述符的assembly-descriptor元素指明瞭應用組合信息。WebLogic的實體EJB部署描述符有ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml,相應的JBoss部署描述符是ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml。下面將介紹兩者間的轉換。

除了multiplicity元素,WebLogic和JBoss的ejb-jar.xml部署描述符內容是相同的。JBoss服務器ejb-jar.xml中的multiplicity元素需要首字母大寫;例如,one要寫成One,many要寫成Many。

在樣例代碼中,有實體EJB範例的ejb-jar.xml部署描述符。ejb-jar.xml範例定義了一個EJB名爲“Catalog.”的實體EJB。EJB範例的CMP字段有catalogId、journal和publisher,其主鍵字段是catalogId。

把weblogic-ejb-jar.xml轉換成jboss.xml

對EJB來說,weblogic-ejb-jar.xml和jboss.xml部署描述符是特定廠商的部署描述符。想把WebLogic EJB應用部署到JBoss應用服務器上,就要把weblogic-ejb-jar.xml部署描述符轉換成jboss.xml。

weblogic-ejb-jar.xml中的根元素是weblogic-ejb-jar。jboss.xml中的根元素是jboss。在jboss.xml 和weblogic-ejb-jar.xml部署描述符中的EJB JNDI名分別爲jndi-name元素和local-jndi-name元素。在樣本代碼中有實體EJB範例的weblogic-ejb-jar.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">



源碼的.zip文件中存有轉換部署描述符weblogic-ejb-jar.xml到jboss.xml的定製XSLT樣式表jboss.xslt。欲瞭解更多關於XSLT轉換的詳情,請參閱Sun公司的XSLT指南。樣式表在JBoss中創建的jboss.xml,等同於WebLogic的weblogic-ejb-jar.xml部署描述符。jboss.xslt樣式表產生的jboss.xml存放在範例代碼中。

把weblogic-cmp-rdbms-jar.xml轉換成jbosscmp-jdbc.xml

weblogic-cmp-rdbms-jar.xml部署爲一個CMP實體EJB指明瞭數據庫持久化信息。weblogic-ejb-jar.xml文件包括某實體EJB對應的表名、連接數據庫的數據源和數據庫中對應實體EJB字段的列。實體EJB範例的weblogic-cmp-rdbms-jar.xml部署描述符存放在.zip文件中。在JBoss中,指明CMP實體EJB持久化信息的部署描述符是jbosscmp-jdbc.xml。

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中用於指明實體EJB CMP字段到數據庫表中對應列映射的field-map元素,等同於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'



對應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">



把部署描述符weblogic-cmp-rdbms-jar.xml轉換成jbosscmp-jdbc.xml的定製XSLT樣式表jbosscmp-jdbc.xslt存放在範例代碼中。JBoss中的樣式表創建了jbosscmp-jdbc.xml,它等同於WebLogic中的weblogic-cmp-rdbms-jar.xml部署描述符。jbosscmp-jdbc.xml存放在.zip文件中。

WebLogic部署描述符的DTD不同於JBoss部署描述符。通過定製XSLT(爲部署描述符添加新元素時,需對XSLT作一些改動),WebLogic的部署描述符可轉換成JBoss部署描述符。接下來的部分,EJB應用將部署到JBoss服務器上。

在JBoss中部署EJB應用
在把WebLogic的EJB部署描述符轉換成JBoss部署描述符之後,你需要創建一個EJB .jar文件,把部署描述符部署在JBoss服務器上。JBoss .jar文件的結構是:

META-INF/
  ejb-jar.xml
  jboss.xml
  jbosscmp-jdbc.xml
CatalogBean.class
Catalog.class
CatalogHome.class



編譯範例EJB類和接口。
java Catalog.java CatalogBean.java CatalogHome.java

複製JBoss部署描述符ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml到目錄META-INF下。用jar工具從JBoss部署描述符、類和接口創建一個.jar文件。

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


要部署JBoss實體EJB應用,需複製.jar文件EntityEJB.jar到<JBoss>/server/default/deploy目錄下,這裏的<JBoss>是JBoss的安裝目錄。當JBoss服務器啓動時,上面的EJB應用將被部署。JBoss應用服務器的deploy目錄對應於WebLogic應用服務器的applications目錄。

結論
通過轉換部署描述符,部署在WebLogic上的實體EJB應用可被遷移至JBoss應用服務器。採用類似的方法,把weblogic.xml部署描述符轉換成jboss-web.xml,可使WebLogic J2EE web應用遷移至JBoss。

本文代碼:
http://www.onjava.com/onjava/2005/03/09/examples/weblogic-jboss-resources.zip 

發佈了4 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章