IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere | Open source  >

WebSphere 迁移: 将应用程序从 WebSphere Application Server Community Edition 迁移到其他 WebSphere Application Server 产品

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 中级

Nell Gawor (ngawor@us.ibm.com), 顾问软件工程师, IBM

2005 年 12 月 19 日

使用 IBM Rational® Application Developer,将一个复杂的示例应用程序从 IBM® WebSphere® Application Server Community Edition 迁移到 IBM WebSphere Application Server Base 的过程演练。这一演练过程涉及到 JSP、servlet、EJB、消息传递和数据库访问,它可以帮助您迁移自己的应用程序,以及解决经常导致应用程序迁移过程出现难题的问题。

引言

随着业务目标的发展和复杂应用程序的增加,IBM 的 WebSphere Application Server Community Edition 用户可能希望通过将他们的 J2EE™ 应用程序迁移到以下任一产品来获得其他 WebSphere Application Server 产品中的高级功能和操作便利性:

  • WebSphere Application Server(Base 产品)
  • WebSphere Application Server - Express
  • WebSphere Application Server Network Deployment。

Shyam Nagarajan 的迁移文章中讨论了从 WebSphere Application Server Community Edition 迁移到其他 WebSphere Application Server 产品的原则和计划,以及您在迁移任何应用程序前需要了解的大量信息。本文通过介绍将一个示例应用程序从 WebSphere Application Server Community Edition 迁移到 WebSphere Application Server Base 的过程,对一些步骤做更深入的讨论,对每个步骤的详细介绍可以让您将该过程应用到您自己的应用程序迁移中。

示例应用程序

本文中将要提到的应用程序是 DayTrader 应用程序,IBM 在 Apache Geronimo 项目中使用这一示例应用程序来进行功能和性能测试。该应用程序也是 WebSphere Application Server Community Edition 的示例集的一部分,包含在产品下载文件中。

DayTrader 主要用于股票 portfolio 管理。在登录前,用户可以查看一般的市场状况信息。登录后,则可以查看关于该用户的特定股票 portfolio 的更多信息。该用户可以买卖股票、获得其他报价,等等。买入/卖出订单状态和股票价格变动的信息是通过 Java™ Messaging Service (JMS) 传输的。用户和 portfolio 信息存储在一个数据库中,通过 JDBC 或 Enterprise JavaBeans™ (EJB) 进行检索。因为 DayTrader 主要是作为性能测试应用程序设计的,所以会提供配置页面来方便您更改影响应用程序运行方式的参数,例如如何从数据库中检索数据、JMS 调用应该同步还是异步,等等。

DayTrader 是实现迁移演练目的的理想应用程序,因为它使用到 J2EE 功能的大部分:Java ServerPages (JSP)、servlet 和 EJB 组件,以及通过 JMS 的消息传递和使用 JDBC 的数据库访问。本文主要介绍如何将 DayTrader 示例应用程序迁移到 WebSphere Application Server Base。如果您需要了解有关该示例应用程序的更多信息,则可以查看该应用程序中包含的 README 文件,它可以帮助您快速掌握如何在 WebSphere Application Server Community Edition 中部署 DayTrader。

迁移概述

DayTrader 应用程序的迁移过程包含以下步骤:

  1. 安装必备软件
  2. 迁移数据库
  3. 将应用程序导入 IDE
  4. 修复应用程序依赖项
  5. 修复 JMS 消息目的地链接
  6. 创建需要的资源
  7. 创建中间相遇映射(可选)
  8. 部署应用程序
  9. 运行应用程序

本文假设您熟悉 WebSphere Application Server Community Edition 以及如何在其中运行 DayTrader 应用程序。本文其余部分将使用 Community Edition 来指代 WebSphere Application Server Community Edition,使用 WebSphere Application Server 来指代 WebSphere Application Server Base。





回页首


1. 安装必备软件

要迁移 DayTrader 应用程序,您必须安装以下软件:

适当的 Information Center 中提供了帮助您安装这些产品的文档(请参阅参考资料)。





回页首


2. 迁移数据库

在 Community Edition 上运行的 DayTrader 应用程序使用 Apache Derby 数据库。虽然 WebSphere Application Server 也使用 Derby,但 DayTrader 使用的是在 Community Edition 自身中运行的 Derby 数据库。因此,此时不仅应该将应用程序迁移到 WebSphere Application Server,还应该将数据库移到 DB2 上。因为数据库迁移的详细过程不在本文的讨论范围内——而且我们并非真正需要数据库的内容(DayTrader 的数据是动态重新填充的)——所以我们只是简单地在 DB2 上重新创建数据库,而不是从 Derby 迁移:

  1. 从本文中包含的download ZIP file中下载 Table.ddl。

  2. 打开 DB2 命令外壳程序 (db2cmd) 并导航至包含 Table.ddl 的目录。

  3. 运行清单 1 中的命令来创建数据库。


清单 1. 创建 Trade 数据库的命令
				
db2 create db tradedb
db2 connect to tradedb
db2 -tvf Table.ddl
db2 disconnect all





回页首


3. 将应用程序导入 IDE

我们将使用 IBM Rational Application Developer(一个基于 Eclipse 的集成开发环境 (IDE))来处理该应用程序:

  1. 要获得 DayTrader 应用程序,请从 WebSphere Application Server Community Edition 产品文件下载 wasce10_samples.zip 文件,然后将其解压缩到一个已知位置。daytrader-ear-1.0-SNAPSHOT.ear 文件位于 samples/daytrader/bin/ 目录下。

  2. 打开 Rational Application Developer,选择 File => Import...=> EAR file,然后单击 Next。如果向您询问是否启用 Base J2EE Support,则回答 Yes

  3. 对于 EAR file,输入指向daytrader-ear-1.0-SNAPSHOT.ear 的路径,然后选择 Finish

  4. 切换至 J2EE Perspective。

  5. 当应用程序构建完毕时,展开 Project Explorer(图 1)中的 Application Client ProjectsEJB ProjectsDynamic Web Projects 文件夹,查看组成该应用程序的四个模块:

    • 两个应用程序客户机:daytrader-streamer-1_0-SNAPSHOT 和 daytrader-wsappclient-1_0-SNAPSHOT
    • 一个 EJB 项目:daytrader-ejb-1_0-SNAPSHOT
    • 一个动态 Web 项目:daytrader-web-1_0-SNAPSHOT。
    这些是出现在 DayTrader 应用程序的 application.xml 描述符中的模块。(出于演示目的,我们只迁移一个应用程序客户机,streamer 客户机,因为这二者的过程类似。)


图 1. 显示导入项目的 Project Explorer
导入后的 Project Explorer

接下来,我们需要解决出现在 Problems 选项卡下的错误。





回页首


4. 修复应用程序依赖项

Problems 选项卡下列出的许多错误都是由 daytrader-web-1_0-SNAPSHOT Web 模块没有找到的类导致的。这是因为该 Web 模块依赖于来自 daytrader-ejb-1_0-SNAPSHOT EJB 模块的类,但它既不包含这些类,也不具有这些类的明显类路径依赖项。要修复这些错误,我们需要从 Web 模块添加一个依赖项到 EJB 模块上:

  1. 在 Project Explorer(图 1)中的 Dynamic Web Projects 下,展开 daytrader-web-1_0-SNAPSHOT 项目。

  2. 右键单击部署描述符 TradeWeb,并选择 Open With => JAR Dependency Editor

  3. Dependencies 部分,选中 daytrader-ejb-1.0-SNAPSHOT.jar 旁边上的复选框,然后保存文件。

现在,许多错误应该已经消除,因为 Web 模块可以找到它需要的类了。现在已恰当构造了 DayTrader 应用程序,使之可以在 WebSphere Application Server 上运行。





回页首


5. 修复 JMS 消息目的地链接

您在 Problems 中应该会看到的下一个错误是:

Message destination link 'TradeStreamerTopic' for message destination ref 'jms/TradeStreamerTopic' is unresolvable in module 'daytrader-streamer-1_0-SNAPSHOT.jar' and EAR 'dayTrader'

解决此错误的方法是:

  1. 右键单击 daytrader-streamer-1_0-SNAPSHOT.jar 部署描述符,并选择 Open With => Deployment Descriptor Editor

  2. References 选项卡中单击 MessageDestRef jms/TradeStreamerTopic

  3. 请注意,右边的 Link 字段指向 TradeStreamerTopic。问题在于 TradeStreamerTopic 实际上是 daytrader-ejb-1_0-SNAPSHOT 模块而非 daytrader-streamer-1_0-SNAPSHOT中的消息目的地。虽然 Community Edition 允许您在整个 DayTrader 应用程序中使用相同名称作为目的地,但 WebSphere Application Server 对应用程序中(但在该模块外)指向目的地的链接的期望格式是 <modulename.jar>#<destinationname>。Link 字段不能通过此选项卡编辑,因此要切换到 Source 选项卡。

  4. 在 message-destination-ref-name 被设置为 jms/TradeStreamerTopic 的消息目的地中,将 message-destination-link 元素的值更改为 daytrader-ejb-1.0-SNAPSHOT.jar#TradeStreamerTopic(清单 2)。

  5. 保存文件。


清单 2. 已更正的 message-destination-ref 元素
				
<message-destination-ref>
         <message-destination-ref-name>jms/TradeStreamerTopic</message-destination-ref-name>
         <message-destination-type>javax.jms.Topic</message-destination-type>
         <message-destination-usage>Produces</message-destination-usage>
         <message-destination-link>daytrader-ejb-1.0-SNAPSHOT.jar#TradeStreamerTopic</message-destination-link>
      </message-destination-ref>

现在错误应该已经消失了,因为链接现在是以期望的格式给出的。

可能还存在少数 XML 错误和大量警告,但可以放心地忽略它们。

然而,由于我们在部署应用程序时想要使用 WebSphere Application Server 选项来生成缺省绑定,所以我们还有一些步骤要做。让服务器从 EJB 生成缺省绑定和对实际对象的资源引用可以节省大量时间,因为大多数时间缺省绑定就是您所需要的。要让 WebSphere Application Server 为格式是 <modulename.jar>#<destinationname> 的消息目的地链接(就像我们刚定义的那些)生成缺省绑定,可以有两个选择:

  • 在部署前使用 Rational Application Developer 来为消息目的地引用指派绑定,或者
  • 完全删除消息目的地链接元素,因为它只是一个提示,可以改为在部署时生成与这相同的绑定。

在本例中,我们更继续在 Rational Application Developer 中为这些消息目的地链接定义绑定:

  1. 在 daytrader-streamer-1_0-SNAPSHOT.jar 部署描述符中,切换至 References 选项卡,然后 MessageDestRef jms/TradeStreamerTopic

  2. 在右侧的 WebSphere Bindings 下面,输入 JNDI 名称 eis/TradeStreamerTopic (图 2),并保存该部署描述符。(如果您不创建此绑定,则具有缺省绑定的 WebSphere Application Server 会将此引用绑定到 JNDI 名称 eis/daytrader-ejb-1.0-SNAPSHOT.jar#TradeStreamerTopic,这显然是不正确的。在接下来的部分中,我们将创建具有 JNDI 名称为 eis/TradeStreamerTopic 的主题。)


图 2. 为 jms/TradeStreamerTopic 添加一个绑定
为 jms/TradeStreamerTopic 添加一个绑定

我们还有其他两个链接要修复:

  1. 右键单击 daytrader-web-1_0-SNAPSHOT 部署描述符,并选择 Open With => Deployment Descriptor Editor

  2. 切换至 References 选项卡,并单击 MessageDestRef jms/TradeBrokerQueue

  3. 在 WebSphere Bindings 部分输入 JNDI 名称 eis/TradeBrokerQueue

  4. 单击 MessageDestRef jms/TradeStreamerTopic 并输入 JNDI 名称 eis/TradeStreamerTopic

  5. 保存该部署描述符。





回页首


6. 创建需要的资源

资源命名
本这一部分中创建的资源的 JNDI 名称并没有被随意指派。相反,如果您在部署该应用程序时使用 Generate default bindings 选项,则它们是根据 WebSphere Application Server 所期望的名称命名的。有了这一选项,WebSphere Application Server 会根据一组规则将尚未绑定的任何引用映射到实际构件(企业 bean 或资源)中。当然,如果没有使用缺省绑定,则可以手动完成从任何 EJB 或资源引用到任何 JNDI 名称的映射。WebSphere Application Server V6 Information Center 中说明了定义缺省绑定的规则。

接下来,我们需要定义 DayTrader 应用程序所需的 JMS 和 JDBC 资源。我们要定义的资源映射到 dayTrader-plan.xml 文件的 <ext-module> 部分。稍后我们将指出具体的适用部分。

启动管理控制台

我们将首先启动 WebSphere Application Server 的一个实例,这样才可以访问管理控制台。(在本文中我们将使用管理控制台,但 WebSphere Application Server 也提供了扩展脚本能力,它可以帮助您自动完成许多步骤,以便部署更快、更具可重复性。)我们将使用 Rational Application Developer 所包含的 WebSphere Application Server 测试环境。要在 Rational Application Developer 中创建新的应用服务器,请执行以下操作:

  1. 选择 File => New => Other...,然后从 Server 类别中选择 Server。单击 Next

  2. 确认主机名称是否正确,并选择 WebSphere v6.0 Server 作为服务器类型(图 3),然后单击 Finsih


    图 3. 创建新的 WebSphere Application Server V6 实例
    创建新的 WebSphere Application Server V6 实例
  3. 您新定义的服务器将显示在 Servers 选项卡中。右键单击它并选择 Start

  4. 一旦服务器启动完毕,再次右键单击并选择 Run administrative console(图 4)。由于没有启动安全性,所以您可以以任何名字登录。


    图 4. 运行管理控制台。
    运行管理控制台

创建数据源

我们将配置的第一个资源是数据源。此数据源对应于具有名为 TradeDataSource 的连接器的 <ext-module>,如清单 3 所示。当在 Server Community Edition 中配置了一个资源适配器时,您将在 WebSphere Application Server 中直接创建数据源,随后该数据源将使用后台的 WebSphere Relational Resource Adapter。


清单 3. DayTrader-plan.xml 中定义 TradeDataSource 的部分
				
<ext-module>
	<connector>TradeDataSource</connector>
	<external-path>tranql/rars/tranql-connector-derby-embed-xa-1.0.rar</external-path>
	<connector
		xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector"
		configId="TradeDataSource"
		parentId="org/apache/geronimo/Server">
  	...
</ext-module>

由于我们现在使用 DB2 而非 Derby,所以许多信息会有所不同:

  1. 要创建数据源,我们必须创建一个 JDBC 提供程序,它包含 JDBC 驱动程序信息。导航至 Resources => JDBC Providers,然后选择 New

  2. 新建一个具有以下属性的 JDBC 提供程序:

    名称
    数据库类型DB2
    提供程序类型Universal JDBC driver provider
    实现类型XA data source

    当完成时,单击 Next

  3. 请注意,该提供程序的类路径是根据变量 DB2UNIVERSAL_JDBC_DRIVER_PATH 定义的。随后您需要为此变量提供一个值。选择新创建的提供程序,然后单击 Additional properties => Data Sources

  4. 新建一个具有以下属性的数据源(不要修改其他任何属性):

    名称
    名称TradeDataSource
    JNDI 名称jdbc/TradeDataSource
    是否在容器管理的持久性 (CMP) 中使用该数据源Yes(确保该复选框选中)
    数据库名称tradedb
    服务器名称localhost (如果不同,则选择安装 DB2 所在服务器的名称)

    当完成时,单击 OK

  5. 现在已经创建了提供程序和数据源,但还需要定义 DB2UNIVERSAL_JDBC_DRIVER_PATH 变量。导航至 Environment => WebSphere variables,选择 DB2UNIVERSAL_JDBC_DRIVER_PATH。在值输入框中输入指向 DB2 Universal JDBC Driver 的路径。这通常为 <DB2 install root>/Java;例如:C:/Progra~1/IBM/SQLLIB/Java)。单击 OK

  6. 当提示您“Click Save to apply changes to the master configuration”时,单击 Save,然后再次单击 Save

  7. WebSphere Application Server 允许您测试您刚定义的数据源是否可以成功连接到数据库。确保 DB2 正在运行并向后导航至 Resources => JDBC Providers

  8. 选择您前面定义的 Universal Driver Provider,然后选择右边的 Data Sources

  9. 选中 TradeDataSource£并单击 Test Connection。如果一切顺利,您应该会收到一条表明测试成功的消息。

创建 JMS 资源

接下来,我们将定义与具有名为 TradeJMS 的连接器的 <ext-module> 相对应的 JMS 资源,如清单 4 所示。


清单 4. DayTrader-plan.xml 中定义 TradeJMS 的部分
				
<ext-module>
	<connector>TradeJMS</connector>
	<external-path>activemq/rars/activemq-ra-3.2-M1.ibm.rar</external-path>
	<connector
		xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector"
		xmlns:naming="http://geronimo.apache.org/xml/ns/naming"
		configId="TradeJMS"
		parentId="TradeDataSource">
		...
</ext-module>

在 WebSphere Application Server 中定义这些 JMS 资源与在 Community Edition 中定义有很大的差别。WebSphere Application Server V6 使用 Service Integration Bus(SIBus,一种类似 ESB 的方法)作为其缺省消息传递支持的后台。这意味着除了来自 Community Edition 部署策略的 JMS 资源外,您还需要为每个 JMS 目的地定义一个用于支持消息传递的总线、一个总线成员(应用服务器)和一个总线目的地:

  1. 在管理控制台中,导航至 Service Integration => Buses => New,创建一个新的总线。

  2. 将该总线命名为 tradebus,然后单击 OK

  3. 选择该新创建的总线,然后从 Additional Properties 选择 Bus Members

  4. 单击 Add,接着单击 Next(您不需要输入任何值),然后单击 Finish

  5. 单击页面顶部的链接,返回到 tradebus 页面,然后选择 Destinations

  6. 我们需要为以下两个 JMS 目的地分别创建一个目的地:TradeStreamerTopic 和 TradeBrokerQueue。选择 New,选择 Topic Space,然后输入标识符 TradeStreamerTopicDest。选择 Next,然后单击 Finish

  7. 再次单击 New,重复上一步骤,这次选择 Queue 并输入标识符 TradeBrokerQueueDest。对于队列值,接受为该队列指派的缺省总线成员。(我们之前指定的目的地名称是任意指定的,杀后我们将 JMS 目的地名称映射到这些名称中。)

  8. 再次将您的工作保存到主配置上,然后导航至 Resources => JMS Providers => Default Messaging

  9. 现在,我们要创建在 daytrader-plan.xml 中 TradeJMS <ext-module> 的 <connection-factory> 部分中定义的 QueueConnectionFactory 和 TopicConnectionFactory(清单 5)。


    清单 5. DayTrader-plan.xml 中定义连接工厂的部分
    						
    <connection-definition>
    	<connectionfactory-interface>javax.jms.ConnectionFactory</connectionfactory-interface>
    	<connectiondefinition-instance>
    		<name>jms/QueueConnectionFactory</name>
    		<implemented-interface>javax.jms.QueueConnectionFactory</implemented-interface>
        ...
    </connection-definition>
    <connection-definition>
    	<connectionfactory-interface>javax.jms.ConnectionFactory</connectionfactory-interface>
    	<connectiondefinition-instance>
    		<name>jms/TopicConnectionFactory</name>
    		<implemented-interface<javax.jms.TopicConnectionFactory</implemented-interface>
    	...
    </connection-definition>  
    

  10. 新建一个具有以下属性的 JMS Queue Connection Factory:

    名称
    名称QueueConnectionFactory
    JNDI 名称jms/QueueConnectionFactory
    总线名称tradebus

    当完成时,选择 OK

  11. 通过页面顶部的链接返回到 Default Messaging Provider 页面。

  12. 新建一个具有以下属性的 JMS Topic Connection Factory:

    名称
    名称TopicConnectionFactory
    JNDI 名称jms/TopicConnectionFactory
    总线名称tradebus

    当完成时,选择 OK

  13. 将您的工作保存到主配置中。

  14. 接下来,我们需要定义 TradeStreamerTopic 和 TradeBrokerQueue,它们是 daytrader-plan.xml 文件中的管理对象(清单 6)。


    清单 6. daytrader-plan.xml 中的定义 TradeStreamerTopic 和 TradeBrokerQueue 的部分
    						
    <adminobject>
    	<adminobject-interface>javax.jms.Topic</adminobject-interface>
    	<adminobject-class>org.codehaus.activemq.message.ActiveMQTopic</adminobject-class>
    	...
    </adminobject>
    <adminobject>
    	<adminobject-interface>javax.jms.Queue</adminobject-interface>
    	<adminobject-class>org.codehaus.activemq.message.ActiveMQQueue</adminobject-class>
    	...
    </adminobject<       
    

    返回到 Default Messaging Provider 页面并单击 Destinations 下的 JMS Queue。新建一个具有以下属性的队列:

    名称
    名称TradeBrokerQueue
    JNDI 名称eis/TradeBrokerQueue
    总线名称tradebus
    队列名称TradeBrokerQueueDest

    当完成时,单击 OK

  15. 返回到 Default Messaging Provider 页面,选择 Destinations 下的 JMS Topic

  16. 新建一个具有以下属性的主题:

    名称
    名称TradeStreamerTopic
    JNDI 名称eis/TradeStreamerTopic
    总线名称tradebus
    队列名称TradeStreamerTopicDest

    单击 OK,将您的工作保存到主配置中。

  17. 最后,我们将为 DayTrader 应用程序中的每个 MDB 定义激活规范。激活规范在 daytrader-plan.xml 中定义在每个消息驱动 bean 的 <activation-config> 元素中发现的信息(请参见清单 7 中的示例)。


    清单 7. daytrader-plan.xml 中定义一个激活规范的部分
    						
    <activation-config>
    	<activation-config-property>
    		<activation-config-property-name>destinationType</activation-config-property-name>
    		<activation-config-property-value>javax.jms.Queue</activation-config-property-value>
    	</activation-config-property>
    	<activation-config-property>
    		<activation-config-property-name>destination</activation-config-property-name>
    		<activation-config-property-value>TradeStreamerQueue</activation-config-property-value>
    	</activation-config-property>
    	...
    </activation-config>
    

    返回到 Default Messaging Provider 页面,选择 JMS Activation Specification

  18. 新建一个具有以下属性的激活规范:

    名称
    名称TradeStreamerMDB
    JNDI 名称eis/TradeStreamerMDB
    目的地类型Topic
    目的地 JNDI 名称eis/TradeStreamerTopic
    总线名称tradebus

    自动确认的 WebSphere 缺省值和非持久订阅类型与在 daytrader-plan.xml 中指定的部分相匹配,所以您可以保留这些值不动。当完成时,单击 OK

  19. 新建另一个具有这些属性的激活规范:

    名称
    名称TradeBrokerMDB
    JNDI 名称eis/TradeBrokerMDB
    目的地类型Queue
    目的地 JNDI 名称eis/TradeBrokerQueue
    总线名称tradebus

    当完成时,单击 OK,将您的工作保存到主配置中。

现在,我们已经定义了应用程序需要的所有资源。





回页首


7. 创建中间相遇映射

dayTrader-plan.xml 的最大部分是由每个实体 bean 的 CMP 和 CMR 表及字段映射构成的。不必手动指定这些映射,WebSphere Application Server 可以使用以下三种策略之一生成这些映射中的大部分或全部:

  • 自顶向下映射:根据现有的企业 bean 创建一个映射和一个数据库架构。
  • 自底向上映射:从现有的表创建企业 bean。
  • 中间相遇映射:将现有的企业 bean 与现有的数据库表相匹配。

如果您部署一个没有定义映射的 EAR,则 WebSphere Application Server 会自动创建一个自顶向下映射。在我们的例子中,我们已经拥有企业 bean,所以自底向上映射显然是不适合的。由于我们已经拥有数据库表,所以中间相遇映射是最适合的策略。然而,出于我们的目的,创建此映射是可选的,因为我们在一开始创建的表是为使用 WebSphere Application Server 自动创建的自顶向下映射而设计的。因此,如果您愿意,则可以跳过这一步骤。因为如果从现有的数据库迁移,此步骤通常是必需的,所以我们这里将它包含在内。

要创建新的中间相遇映射,请执行以下操作::

  1. 在 Project Navigator 中,右键单击 daytrader-ejb-1_0-SNAPSHOT 项目并选择 EJB to RDB Mapping => Generate Map

  2. 选择创建一个新的后台文件夹,然后单击 Next。每个后台文件夹表示一个不同的数据库供应商或版本的映射,或者一个替代的映射策略。这与 Community Edition 不同,在后者中映射只定义一次,您需要直接编辑映射或者更改 ejb-ql-compiler-factory 之类的内容来生成这些更改的类型。

  3. 选择 Meet-in-the-middle 映射策略,然后单击 Next

  4. 映射工具如果要使用来自我们数据库的信息,就必须能够连接到该数据库,所以要创建一个具有以下信息的新数据库连接:

    名称
    连接名称tradeConn
    数据库tradedb
    用户 ID DB2 用户名,通常为您用于创建数据库和表的用户 id
    密码 DB2 用户名称的密码
    数据库供应商类型DB2 Universal Database v8.2
    JDBC 驱动程序IBM DB2 UNIVERSAL DRIVER
    主机localhost (如果不同,则选择安装 DB2 的服务器)

    当完成时,选择 Next

  5. 选择导入所有表,然后单击 Next

  6. 选择 match by name,然后单击 Finish

过一会儿,会出现一个图形表示的映射。所有与适当数据库表字段具有相同名称的字段都已进行了成功映射(图 5)。


图 5. 中间相遇映射
中间相遇映射

然而,如果您切换至 Problems 选项卡,您将看到仍然有大量字段,特别是关系角色还没有映射。在表单的 QuoteEJB 中存在属性 change 和 open 的两个错误:

The attribute: x in CMP bean y is not mapped in file ...Map.mapxmi

在上半列中,展开 Enterprise Beans 侧的 QuoteEJB 和 Tables 侧的 QUOTEEJB。您将看到,这两个字段没有映射的原因是 open 需要映射为 OPEN1,而 change 需要映射为 CHANGE1。由于 EJB 字段和表字段之间只有名称相同(不区分大小写)才能自动完成映射,因而这些必须手动完成。

  1. 突出显示左边的 open 和右边的 OPEN1。右键单击面板中的任何位置,然后选择 Create Mapping。每个字段旁边会出现小三角图标来表明它已映射。

  2. 对 change 和 CHANGE1 重复此任务。保存映射文件,这两个错误应该会消失。

然而,仍然存在几个关于角色没有映射的错误消息。这些角色的名称与 dayTrader-plan.xml 中的 ejb-relationship-role-name 元素相匹配。从 dayTrader-plan.xml 中的第一个关系 AccountEJB 开始:

  1. 展开左边的 AccountEJB,您将会看到关系 AccountEJB:OrderEJB。因为在此关系中 dayTrader-plan.xml 没有使用 foreign-key-column-on-source 元素,所以外键应该在 OrderEJB 上。没有使用 foreign-key-column-on-source 元素的关系需要一些额外工作才能转换成映射工具,因为映射工具始终期望您映射在源 EJB 上具有外键列的关系,然后它自动为您映射逆向关系。您不能试图映射此关系,而是需要找到逆向关系并映射它。因为此关系是从 AccountEJB 到 OrderEJB 的,所以您需要找到从 OrderEJB 到 AccountEJB 的关系。

  2. 展开左边的 OrderEJB。在 OrderEJB下应该能看到 Order-Has-Account 关系。如果您在 dayTrader-plan.xml 中搜索此关系,则会找不到它,因为它只是 AccountEJB 关系的逆向。

  3. 要创建正确的映射,映射工具必须知道 ACCOUNT_ACCOUNTID 是个外键。右键单击 ORDEREJB 表并选择 Open Table Editor

  4. 切换至 Foreign Keys 选项卡,选择 Add Another

  5. 选择 ACCOUNTEJB 作为 Target Table,并将 ACCOUNT_ACCOUNTID 添加到源列列表中。在本例中,我们将使用名称 C0989623 作为外键的名称(图 6)。


    图 6. 添加一个新的外键
    添加一个新的外键
  6. 保存 open 表编辑器并返回到映射编辑器。

  7. 选择左边的 Order-Has-Account 关系和右边的 C0989623 外键列,然后选择 Create Mapping

如果您查看 AccountEJB,您将看到关系角色 AccountEJB:OrderEJB 也已映射。一旦您映射了一个方向的关系,映射工具会自动完成另一个方向的映射。

对接下来的五个映射重复此过程。请记住,当 foreign-key-column-on-source 没有使用时,您需要自己寻找逆向映射。

源 EJB关系角色名称源上的外键列带外键的表外键的目标表外键列
AccountEJBAccount-Has-AccountProfileACCOUNTEJBACCOUNTPROFILEEJBPROFILE_USERID
AccountEJBAccountEJB否 – 使用 Holding-Has-Account 关系代替HOLDINGEJBACCOUNTEJBACCOUNT_ACCOUNTID
HoldingEJBHolding-Has-QuoteHOLDINGEJBQUOTEEJBQUOTE_SYMBOL
OrderEJBOrder-Has-QuoteORDEREJBQUOTEEJBQUOTE_SYMBOL
OrderEJBOrder-Has-HoldingORDEREJBHOLDINGEJBHOLDING_HOLDINGID




回页首


8. 部署应用程序

在 WebSphere Application Server V6.0.2 上部署
如果您将 DayTrader 应用程序部署在 V6.0.2 WebSphere Application Server 上,而不是部署在本文中使用的 V6.0 服务器上,则需要对部署过程进行几处更改:
  • 如果您在部署前只生成一个映射,则不会看到“Select current backend ID”面板。
  • 在“Provide listener bindings for message-driven beans”面板中,目的地会正确指向 eis/TradeBrokerQueue 和 eis/TradeStreamerTopic,所以不需要更改它们。
  • 在“Provide listener bindings for message-driven beans”面板后,您可能会看到验证警告;可以放心地忽略它们。
  • “Bind message destination references to administered objects”面板不会再显示。

可以有多种方式来部署您刚创建的应用程序。如果您最初已经定义了所有特定于 WebSphere 的绑定(而不是只定义一小部分,就像我们为上述一些 MessageDestRef 所做的那样),则可以从 Rational Application Developer 内部署应用程序,方法是右键单击 EAR 文件并选择 Run on Server。然而,要利用 WebSphere Application Server 生成缺省绑定功能,您必须使用管理控制台或 wsadmin 脚本命令安装应用程序。

要使用管理控制台安装应用程序,请执行以下操作:

  1. 首先,我们必须将应用程序以 EAR 格式导出。在 Project Navigator 中,展开 Enterprise Applications,右键单击 daytrader-ear-1_0-SNAPSHOT 并选择 Export...=> EAR file

  2. 将文件命名为 daytrader-ear-1_0-SNAPSHOT.ear,并保存到您的文件系统的某个已知位置中。

  3. 确保管理控制台正在运行。除了通过右键单击服务器并选择 Run administrative console 来启动管理控制台外,您还可以通过 http://<hostname>:9060/ibm/console 直接访问它。

  4. 导航至 Applications => Install New Application

  5. 输入或浏览至您前面保存的 EAR 文件的位置,然后单击 Next


    图 7. 输入指向 DayTrader EAR 文件的路径
    输入指向 DayTrader EAR 文件的路径
  6. 在下一页中,选中 Generate Default Bindings。这种方式可以让 WebSphere Application Server 为您做大多数工作。由于在本页中不需要更改其他内容,所以选择 Next

虽然我们通常可以跳过这些页中的大部分,但我们这里会对其进行逐一介绍,以便向您显示它们如何映射到 dayTrader-plan.xml 文件中的信息:

  1. 在“Select Installation Options”面板中,确保选中 Deploy enterprise beans。启用这个选项可以让 WebSphere Application Server 生成要在EAR 中运行 EJB 所需要的代码。Community Edition 不需要这一额外的代码生成步骤,因为它使用动态代理生成。除了生成部署代码和运行 RMI 编译器以便生成 stub、skeleton 和 tie 外,如果尚未定义映射,则此选项还会促使 WebSphere Application Server 为 CMP bean 创建一个自顶向下的映射。

  2. “Map modules to servers”面板只应用于将模块部署到多个应用服务器的情况,这里并非这种情况。

  3. 在“Provide options to perform the EJB deploy”面板中,我们可以为部署代码生成器指定任何选项,例如指定一个非缺省数据库的后台数据库。由于我们使用的是 DB2 Universal Edition V8.2,而不是 V8.1,所以要将数据库类型更改为 DB2UDB_V82(图 8)。


    图 8. 更改数据库类型
    更改数据库类型
  4. 如果我们选择在部署应用程序之前生成映射,则在此时会出现另外一个面板“Select currrent backend ID”,如果我们创建了多个映射,则可以通过此面板选择使用其中一个映射。由于我们只有一个映射,所以它是缺省选中的。

  5. 在“Provider listener bindings for message-driven eans”面板中,我们可以将应用程序中的 MDB 绑定到我们前面创建的激活规范中。在 dayTrader-plan.xml 中,激活规范是在每个消息驱动 bean 的定义中指定的,所以不需要绑定。然而,这也意味着在 Community Edition 中,您不能在多个 MDB 之间共享激活规范。缺省绑定生成的目的地名称是不正确的。请将 TradeBrokerMDB 的目的地 JNDI 名称更改为 eis/TradeBrokerQueue,并为 TradeStreamerMDB 添加一个 JNDI 名称 eis/TradeStreamerTopic(图 9)。


    图 9. 新的目的地名称
    新的目的地名称

  6. 在“Provide JNDI Names for Beans”面板中,为每个企业 bean 都分配了一个 JNDI 名称。在 Community Edition 中,只有需要被非 J2EE 客户机访问的 bean 才需要拥有一个 JNDI 名称。相反,在 WebSphere Application Server 中,EJB 的 JNDI 名称用于解析 java:comp/env 名称空间中的所有引用(以及用于远程查找),所以每个 EJB 都需要拥有一个 JNDI 名称。在此面板中接受缺省名称。

  7. 接受“Bind message destination references to administered objects”面板中的缺省值,因为我们就是这样为我们创建的实际消息目的地命名的。

  8. 接下来的两个面板是 WebSphere Application Server 要求您为应用程序完成的仅有的两个面板(用星号标示)。在“Provide default data source mapping for modules containing 2.x entity beans”面板中,滚动至底部并输入 jdbc/TradeDataSource 作为所有 CMP bean 的数据源的 JNDI 名称。这等效于 dayTrader-plan.xml 中的 cmp-connection-factory 元素。

  9. 在“Map data sources for all 2.x CMP beans”面板中,您可以为单个 CMP 重写数据源,但这里不需要这样做。我们需要进行这一必要步骤。

  10. “Map EJB references to beans”面板将所有的 EJB 引用映射为实际的 EJB JNDI 名称。这些引用与在“Provide JNDI Names for Beans”面板中生成的缺省 JNDI 名称相匹配。

  11. 在“Map resource references to resources”面板中,资源引用与实际资源进行映射,由于我们对资源的命名方式十分谨慎,所以这里显示的所有值都是正确的。

  12. 下一个面板可能显示一些验证错误;这些可以安全地忽略掉。

  13. 在“Map virtual hosts for Web modules”面板中,我们应该只有一个虚拟主机,所以这里不需要进行任何更改。

  14. 在 Summary 页面,选择 Finish 将启动应用程序安装。这可能需要几分钟,因为所有部署代码都在这时生成。当它完成时,选择 Save to Master Configuration => Save

图 10. 安装选项一览
安装选项一览




回页首


9. 运行应用程序

在应用程序安装后只启动它是不够的,因为消息总线还未启动。而是需要重新启动服务器,方法是在 Servers 视图中右键单击服务器,选择 Restart => Start。认真查看控制台选项卡是否有任何错误。一旦服务器成功启动后,您就应该能够通过 http://<hostname>:9080/daytrader 访问 DayTrader 应用程序。在使用应用程序之前,您需要通过选择 Configuration => (Re)-populate Trade Database 来填充数据库。当数据库填充完时,您可以通过单击 Go Trade! 来使用该应用程序。您还可以执行一系列测试:单击 Web Primitives 页面中的链接,确保每个链接执行没有错误。





回页首


其他迁移事项

除了本文阐释的事项外,在将应用程序从 Community Edition 迁移到 WebSphere Application Server 时,还应该考虑其他一些情况:

  • WebSphere Application Server 对 web.xml 的验证会比 Community Edition 严格,比如它会验证元素的顺序。

  • 如果将端口硬编码在应用程序中,则可能需要对端口进行更改。例如,Web 容器在 Community Edition 中有一个缺省端口 8080,但在 WebSphere Application Server 中则运行在 9080 上。一开始对这些端口进行硬编码并不是好主意。

  • Community Edition 允许引用格式为 java:/comp/env/myresourceref 的无效资源。然而,只有格式为 java:comp/env/myresourceref 的引用才能在 WebSphere Application Server 上工作。(也就是说,您需要删除“java:”和“comp”之间的/ 字符。





回页首


结束语

在本文中,我们向您介绍了如何将 DayTrader 应用程序从 WebSphere Application Server Community Edition 迁移到 WebSphere Application Server Base。因为 DayTrader 是个非常丰富的应用程序,所以您应该能够将本文作为迁移您自己的应用程序的基础,以及作为理解 WebSphere Application Server Community Edition 和 WebSphere Application Server Base 各个部分之间关系的指南。






回页首


下载

名字大小下载方法
0511_gawor_table.zip1 KB  FTP|HTTP
关于下载方法的信息


参考资料

学习

获得产品和技术


关于作者

Nell Gawor 是 IBM 的一名顾问软件工程师,在北卡罗莱纳州 Research Triangle Park 的 Software Group System House Advanced Technology Group 工作。她获得 University of Illinois(位于 Urbana-Champaign)计算机科学硕士学位。您可以通过 ngawor@us.ibm.com 与她联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款