Menghe

导航

将 J2EE 项目迁移到 IBM Lotus Expeditor V6.1

menghe@cn.ibm.com

IBM Lotus Expeditor 这种 IBM 产品支持用熟悉的编程模型将 J2EE 应用程序迁移到客户机上。IBM Lotus Expeditor Toolkit 使开发人员不需要为了在 Lotus Expeditor 运行时上运行而重写 J2EE 项目。在本文中,将讲解如何迁移 J2EE 项目。

要想从本文获得最大的收获,您应该熟悉 Java™ 和 J2EE 以及使用 Eclipse 3.x 技术进行插件开发的方法。请记住,J2EE 项目不是插件项目,但 Lotus Expeditor 项目是插件项目。Lotus Expeditor 项目包含插件项目特有的清单文件和 plugin.xml 文件,所以必须了解应该如何处理这些文件。

本文讨论的主题包括:

  • 如何将现有的 J2EE Enterprise JavaBean(EJB)项目迁移到 Lotus Expeditor
  • Lotus Expeditor 不支持哪些 J2EE 特性
  • 如何将迁移后的项目部署在 Lotus Expeditor 运行时上

在开始执行本文中的步骤之前,必须安装 IBM Rational Application Developer V7.0、Lotus Expeditor Toolkit V6.1 和 Lotus Expeditor Client V6.1。可以从 developerWorks 下载 Rational Application Developer for WebSphere Software 的免费试用版。

将现有的 J2EE EJB 项目迁移到 Lotus Expeditor

开发 J2EE 应用程序超出了本文的范围。为了简化开发过程,我们导入一个现有的 J2EE 示例项目并对它进行迁移。在开始学习之前,一定要下载本文 下载 一节中提供的示例代码(sampleJ2EEProject.zip)。

首先将示例 J2EE 项目导入 Rational Application Developer:

  1. 在 Rational Application Developer 中,选择 Window - Open Perspective - Other - J2EE 切换到 J2EE 透视图。
  2. 选择 File - Import 导入 sampleJ2EEProject.zip。
  3. 在 Import 向导中,选择 “Existing projects into workspace”,然后单击 Next。
  4. 在图 1 所示的 Import Projects 向导中,选择 Select archive file 选项,浏览到下载的 ZIP 文件(sampleJ2EEProject.zip),然后单击 Finish。 

    图 1. Import Projects 向导
    Import Projects 向导 

  5. 选择 File - New - Project 打开 New Project 向导。
  6. 在 New Project 对话框中,展开 Client Services。这时出现几个向导,可以用来创建不同类型的 Client Services 项目。选择 “Convert Project to Client Services Project” 选项,然后单击 Next,见图 2。 

    图 2. New Project 向导
    New Project 向导 

  7. 图 3 所示的 Convert Existing Project 向导包含可转换的非 Client Services 项目的列表。注意,在将 J2EE 项目转换为 Client Services 之后,就无法逆转这个步骤,即无法转换回原来的 J2EE 项目状态。Lotus Expeditor Toolkit 提供一个 “Copy project before conversion” 选项,它会为现有的 J2EE 项目生成一个新拷贝,并将新拷贝转换为 Client Services。选择这个选项,如果需要的话,还可以指定新项目拷贝的名称。每次只能选择一个项目进行转换。单击 Next。 

    图 3. Convert Existing Project 向导
    Convert Existing Project 向导 

  8. 在图 4 所示的 Target Definition 面板中,可以看到附加服务的列表,例如 Java Message Service(JMS)API、Managed Settings 和 MQ Everyplace。保持这些服务的默认设置,因为我们不使用这些附加服务。单击 Finish 将选择的 EJB 项目转换为 Client Services 项目。 

    图 4. Convert Existing Project:Target Definition 面板
    Convert Existing Project:Target Definition 面板 

  9. 在单击 Finish 之后,向导执行转换前测试,并根据在 Lotus Expeditor 运行时上运行时可能需要修改现有 EJB 的哪些元素,显示相应的错误和警告。如果找到了任何错误或警告情况,就显示一个对话框,询问是应该继续进行转换,还是取消转换。单击 OK 继续转换,见图 5。 

    图 5. Convert Existing Project:警告
    Convert Existing Project:警告 

转换为 Client Services 的 EJB 项目称为 Client Services 嵌入式事务容器(embedded transaction container,ETC)项目。

按照相同步骤将示例 Web 项目 BankWeb 转换为 Client Services 项目。转换为 Client Services 的 Web 项目称为 Client Services Web 项目。

回页首

开发嵌入式事务容器逻辑

嵌入式事务容器针对比典型 J2EE EJB 服务器/容器限制更多的设备。尽管两者的编程模型非常相似,但是嵌入式事务容器还有一些独特的考虑事项。下面几节描述涉及嵌入式事务特有问题的任务。

实现 finder 方法

ETC 使用不同的方式实现定制的 finder 方法。对于主接口中声明的每个 finder 方法(findByPrimaryKey 除外),必须提供构建对应的集合所需的业务逻辑。这个运行时不支持 bean 类中的 EJB finder 方法实现。这个工具要求将这一逻辑打包在一个扩展 BaseJDBCFinder 的抽象 finder helper 类中,工具会在一个具体的 JDBC finder helper 实现类中扩展这个抽象类。

配置数据源

Client Services 为使用声明式 JNDI 提供三个 ObjectFactory 实现。这个工厂提供一个 Eclipse 扩展点(由一个模式定义文件描述),可以在进行客户机 JNDI 查找时将 Java 对象的描述绑定到 JNDI。

添加一个扩展点来实例化一个 IBM DB2 Everyplace 数据源对象,见清单 1。


清单 1. 添加扩展点
<extension          point="com.ibm.pvc.jndi.provider.java.genericobject">          <object           	jndi-name="BANKING"           	class="com.ibm.db2e.jdbc.DB2eDataSource">          	<method name="setUrl"> 		  		<method-parameter	type="String" 		    		value="jdbc:db2e:${_workspace}\\ejb\\BANKDb\"> 		  		</method-parameter> 	       </method>          </object> </extension> 

在连接 Container Managed Persistence(CMP)的数据库时,嵌入式事务容器要求使用一个特定的数据源 TxnDataSource。这个数据源是用 TxnDataSourceFactory 创建的。TxnDataSource 只用于访问 CMP 数据库。其他所有数据库访问应该使用一个数据源。

对厂商特有的 DataSource 的包装可以在 JNDI 绑定之前进行,也可以在查找之后进行。在 JNDI 绑定之前进行包装是最好的做法,因为只需要执行一次,而不需要在每次查找之后都进行包装。可以像清单 2 那样添加一个扩展点来进行包装。


清单 2. 添加用于包装的扩展点
<extension           point="com.ibm.pvc.jndi.provider.java.binding">    <binding jndi-name="BANKING"     objectFactory-id="com.ibm.pvc.txncontainer.TxnDataSourceObjectFactory">    </binding> </extension> 

提供定制的 bundle 激活器

ETC 工具创建的项目引用默认的 bundle 激活器 com.ibm.pvc.txncontainer.GenericActivator。这个激活器注册 EJB 的主接口。要想为现有的项目创建定制的 bundle 激活器,必须创建一个扩展 com.ibm.pvc.txncontainer.GenericActivator 类的类,这个类应该在自己的 start() 和 stop() 方法中调用 GenericActivator 的 start() 和 stop() 方法。在 bundle 的清单文件中更新这个类名,见图 6。这个步骤更新 EJB 清单文件 META-INF/MANIFEST.MF,将 Bundle-Activator 属性设置为定制的 bundle 激活器类。


图 6. BankEJB:MANIFEST.MF
BankEJB:MANIFEST.MF 

创建本地数据库和表

在调用实体 bean 之前,一定要为它们创建一个本地数据库和表。对于添加创建数据库和表时的逻辑,最好的位置是 ETC 项目的 bundle 激活器的 start() 方法。

支持关系

在实体之间支持符合 EJB 规范的容器管理的关系(container-managed relationship,CMR)。ETC 使用链接表方式实现容器管理的关系。假设有两个 EJB(A 和 B),在它们上面定义一个关系 R,所以在 A 和/或 B 之上定义一个 CMR 字段。在部署这些 EJB 时,为 A 和 B 提供持久化 CMP 状态的数据库表中没有相关联的持久化 CMR 状态。而是在一个单独的关系数据库链接表中维护持久化 CMR 状态(每个关系一个链接表)。

关系数据存储在一个单独的数据库表(链接表)中。链接表的每一行表示两个实体之间的关系。在链接表中,一些列是第一个实体的主键,另一些列是第二个实体的主键,还有一个可选的识别器(discriminator)列。链接表的列名必须符合对应 CMP 主键列的定制部署信息所指定的命名模式,但是每个列要加前缀 r1_ 或 r2_(取决于列是与 role 1 EJB 还是与 role 2 EJB 相关联)。在调用实体 bean 之前,一定要为每个 EJB 关系创建这些链接表。

回页首

开发 Web 项目逻辑

下面是 Client Services Web 项目特有的一些任务;在从 J2EE 项目迁移到 Client Services Web 项目时需要执行这些步骤:

  • 提供必需的库。jclDesktop 运行时没有提供 java.rmi 包,所以对 PortableRemoteObject.narrow() 的引用被认为是一个错误。ETC 不允许访问其他服务器上的 EJB,所以可以用简单的 JNDI 查找替代 PortableRemoteObject.narrow()。
  • 提供一个快捷菜单,用来在 Lotus Expeditor 运行时中启动 Web 应用程序。在 BankWeb 项目的 plugin.xml 中添加一个扩展点(见清单 3),以便用快捷菜单在 Lotus Expeditor 运行时中启动它。

清单 3. 在项目的 plugin.xml 中添加扩展点
<extension id="kw4qri0g1j4t" point="com.ibm.eswe.workbench.WctWebApplication">       <WEBApplication DisplayName="XYZ Banking">          <WebApplicationUrl local="true" secured="false" url="/BankWeb/Banking.html">          </WebApplicationUrl>          <BrowserConfiguration showAddressbar="true" showToolbar="false">          </BrowserConfiguration>       </WEBApplication>    </extension> 

回页首

Lotus Expeditor 中不支持的 J2EE 特性

Lotus Expeditor 不支持以下 J2EE 特性:

  • 有状态会话 bean。
  • 在单一地址空间中运行时,易变的可序列化对象的 Pass-by-copy 语义。
  • 对于 EJB 1.1,嵌入式事务容器不对 EJB 远程或远程主接口的引用进行持久化。注意,EJB 2.1 不需要这个功能。
  • 消息驱动 bean。
  • Java 安全支持。
  • EJB Query Language。
  • 主方法。
  • 选择方法。
  • bean 管理的事务。
  • finder 的枚举返回类型。支持集合返回类型。
  • 指定事务隔离级别。
  • 在创建集合和迭代器的事务之外支持集合和迭代器。
  • setTransactionTimeOut() 方法。
  • BigDecimal,在 J2ME(JSR169)中不支持 BigDecimal。

回页首

把迁移后的项目部署到 Client Services Lotus Expeditor 运行时平台上

Client Services 应用程序在 Lotus Expeditor 运行时上运行。Lotus Expeditor Toolkit 会自动处理与 bundle 相关的细节;因此,对于针对 Lotus Expeditor 运行时或依赖于其他 OSGi 服务的项目,建议通过 Client Services Project Creation 向导来开发。Lotus Expeditor 运行时不支持通过 EAR 文件部署企业应用程序。应用程序是直接部署到运行时中的。

既然已经将 J2EE 项目迁移到了 Client Services,现在就可以把迁移后的项目部署到 Lotus Expeditor 运行时。按照以下步骤部署迁移后的项目:

  1. 在 Project Explorer 中,右击 BankWeb 项目,然后选择 Run - Run on Server。
  2. 在图 8 所示的 Run On Server 对话框中,执行以下操作: 
    • 选择 “Manually define a new server” 选项。
    • 选择 Client Services v6.1。
    • 单击 Next。
    • 保持 Client Services Server 的默认设置并单击 Next。
    • 将 BankEJB 项目添加到配置的项目列表中。
    • 单击 Finish 启动 Client Services Lotus Expeditor 运行时。

图 8. 定义服务器
定义服务器 

在本文 下载 一节中可以找到迁移后的项目(migratedSampleJ2EEProject.zip)。

回页首

测试应用程序

现在已经部署了 J2EE 项目,我们来测试一下。在启动 Lotus Expeditor 运行时之后,选择左边的 Open 图标,然后选择 XYZ Banking。这时会显示银行页面,见图 9。


图 9. XYZ Banking 页面
XYZ Banking 页面 

单击 Submit,就会看到结果页面,见图 10。


图 10. XYZ Banking 结果页面
XYZ Banking 结果页面 

回页首

结束语

借助 Lotus Expeditor,可以使用标准 API 和服务将应用程序的关键组件从服务器迁移到桌面、笔记本计算机、tablet 和手持客户机。将应用程序组件迁移到客户机上运行,会对业务产生重大影响。应用程序在客户机本地执行业务操作,所以会大大改进应用程序的响应时间。另外,会减少客户机和服务器之间的网络流量,并减少服务器的负载。而且,即使在无法连接网络的地方,移动用户仍然可以有效地使用客户机上的应用程序。

本文讲解了如何将 J2EE 项目迁移到 Client Services 项目。我们把一个 EJB 项目和一个动态 Web 项目转换成了 Client Services。将 J2EE 应用程序迁移到 Lotus Expeditor,然后就可以在任何时间任何地点访问应用程序 —— 无论有没有网络连接。


回页首

下载

名字大小下载方法
migratedSampleJ2EEProject.zip51KBHTTP
sampleJ2EEProject.zip33KBHTTP

关于下载方法的信息


参考资料

学习

 

posted on 2012-01-26 21:20  孟和  阅读(217)  评论(0编辑  收藏  举报