很多客户已经在其环境中集成了 IBM Lotus Domino 和 IBM WebSphere。本文介绍了如何利用 Domino 和 WebSphere 各自的相对优势创建应用程序。
对于很多人来说,集成是这个新的世纪中应用过滥的一个词,但它到底意味着什么,又该如何利用它来满足应用程序开发的需要呢?IBM WebSphere 技术及其集成解决方案可以解决业务、组织和技术方面的问题。但要做到这一点,那些参与解决方案的架构、计划和实现的人员必须在项目的目标和实现这一目标的方法上取得一致。本文介绍了集成 WebSphere 和 Lotus Domino 所涉及的几个问题。我们简要地介绍了如何实现 WebSphere/Domino 集成,以及如何最大限度地利用这两种不同系统的优势。本文假设您是一位精通 Domino 和/或 WebSphere 的开发人员。
J2EE(Java 2 Enterprise Edition)是用于开发和主管可重用组件的标准平台的规范。可以用这些组件来提供多层的、基于客户机和服务器的企业应用程序。J2EE 有多种实现,其中包括 Sun Microsystems 最初提供的参考实现、IBM 的 WebSphere Application Server、BEA 的 WebLogic、Macromedia 的 JRun 和开放源代码的 J2EE 兼容服务器 JBoss。本文主要讨论 WebSphere,但是本文内容也适用于在上述任何一种 J2EE 兼容平台上开发的应用程序。(本文的描述同时也适用于 WebSphere v4 和 v5,虽然 IBM WebSphere v4.0.x 是 J2EE 1.2 兼容的,但它也包含很多 J2EE 1.3 特性。)
WebSphere 采用的方法是把应用程序中所有的执行部分分解到组件中,由这些组件处理整个应用程序的不同方面。对于 Domino 开发人员而言,这种分解与 Domino 应用程序的开发和设计有着明显的不同。比方说,Domino 中没有分离 UI 和业务逻辑。可以直接在窗体中进行编码,使用活动(action)或者代理执行需要的任务(尽管可以断开 Domino 应用程序与 RDBMS 或遗留系统的连接,比方说,使用 Lotus Enterprise Integrator)。让一个 Domino 组件只负责处理 UI,而另一个组件专门处理业务逻辑几乎是不可能的。
WebSphere 采用了完全不同的方法。图 1 展示了 WebSphere 从一个 J2EE 应用程序中分解出来的 4 个组件(客户、用户组件、服务器组件和遗留组件)。
J2EE 标准规范进一步详细规定了组件之间的交互:
用户组件与服务器组件的交互
其中包括:
- 登录(Logging)
- 实例化(Instantiation)
- 终止(Termination)
- 与后端组件的交互:
o 发现服务(Finding services)
o 注册服务(Registering services)
o 访问服务(Accessing services)客户机与服务器组件的交互
其中包括:
- 协议(Protocols)
这些协议用于后端访问,包括 RMI/IIOP (Remote Method Invocation/Internet Inter-ORB Protocol) 和 RMI/JRMP,或者带有不同类型驱动程序的 JDBC (Java Database Connectivity)。- 事务(Transactions)
不应从客户机启动事务,建议事务对客户机完全透明,所以,应该在 EJB (Enterprise JavaBean) 中使用事务。- 安全性(Security)
遗留组件与服务器组件的交互
其中包括与外部资源的集成:
- 事务(Transactions)
- 发现、注册和访问服务
- Java 服务
o JDBC
o JMS(Java 消息服务,Java Message Service)
o JavaMail 等- 连接器(Connector)体系结构
o EIS (Enterprise Information Systems)
o JCA (Java Connection Architecture)
这在 WebSphere Application Server Express 中不受支持。在构建 J2EE 应用程序时,必须要知道如何定义向用户显示页面的基础信息、如何处理输入、如何实现业务逻辑,以及如何连接到不同的数据源。这种分解是按照 J2EE 规范进行的,因此每个 J2EE 兼容的系统都负责整个解决方案中的一部分。
J2EE 体系结构是以一个 4 层模型为基础而建立的,该模型刻划了 J2EE 兼容的企业应用程序的特征。这 4 个层分别是:应用层(Application)、表示层(Presentation)、业务逻辑层(Business Logic)和数据层(Data)。
- 应用程序层包括在应用程序客户机容器(Application Client Container)中运行的应用程序,后者本身是 Java 程序。应用程序层也包括 applet,即在 Web 浏览器中执行的 GUI 组件。
- 表示层包括 servlet。它们与 applet 类似,但运行在服务器上而不是运行客户机上。这一层也包括 JSP。它们运行在服务器上,以便提供响应。
- 业务逻辑层包括 EJB(Enterprise Java Beans),EJB 运行在服务器上,以便管理业务逻辑。
- 数据层包括数据库系统(如 DB2 或者 Oracle),以便保留各种类型的数据。
这 4 个层共同包含了表示完整的企业应用程序的组件。应用程序的每个组件都是在容器中运行的。容器本身由 J2EE 平台提供者提供。容器向组件提供特定的部署和运行时服务(生命期、安全、事务等)。提供何种服务取决于容器。
表示层和业务逻辑层可以位于不同机器上,也可以由不同的 J2EE 平台供应商提供。比方说,表示层(Web 容器)可以由 Tomcat提供,同时,业务逻辑层(EJB 容器)可以运行在 WebSphere 上。这说明解决方案并不依赖单个平台供应商,规范要求每一个 J2EE 兼容系统都必须支持一个表示层和一个业务逻辑层。
在现代 J2EE 体系结构中,关注点主要集中在可伸缩性和高可靠性上。因此,可以将这 4 个“传统”层次拆分成其他层,其中包括客户机、Web 和中间件等。分布式的概念也进一步得到了延伸。比如,有可能每个 EJB 分别位于不同的机器上。(在这种情况下,可以使用本地访问的会话 Bean 代替 EJB,减少远程访问的次数,从而提高效率。)此外,数据源也可以保存在不同的机器上。
如果您熟悉 Domino 开发,那么您可能知道有很多应用程序都非常适合用 Domino 开发(比如协作、处理非结构化数据和一般表示),有些则不那么合适(如事务处理和非常复杂的业务逻辑)。另一方面,WebSphere 在复杂的事务处理、分布式处理和连接器、可伸缩性和高可靠性方面都表现得非常出色。通过集成 Domino 和 WebSphere,就可以充分利用每种产品的长处,创造出与单个平台相比能提供更多功能的应用程序。
典型的 Domino/WebSphere 集成环境,如图 2 所示。
Domino 到 WebSphere 的集成有两种方式:Domino 到 Web 容器和 Domino 到 EJB 容器,下面分别介绍。
有三种不同的将 Domino 连接到 Web 容器的方法。在第一种方法中,Domino 充当的是 Web 浏览器或客户机。这种方法可以通过套接字实现,套接字非常灵活,但需要做大量的工作,该方法也可以通过 URL 或 URL Connection 类来实现。
Domino 连接到 Web 容器的其他两种方法都要用到 HTTP 编程模型。HTTP 是一种请求-响应式的应用程序协议,必须在请求发送之前设置请求参数。有两种通过 HTTP 服务器向 servlet 发送数据的方法:GET 和 POST。这两个方法决定了将数据发送给服务器的方式。
对于 GET 方法,输入值被作为 URL 的一部分放在 QUERY_STRING 环境变量中发送。当使用 HTTP GET 时,安全性(输入变量作为 URL 的一部分发送)和可以发送的数据量(过多的输入数据会使 URL 变得很长)受到一定的限制。大小限制没有直接定义,其范围是从 255 字节到 8KB 字节。如果超出这个限制,服务器将发出错误 414(请求 URL 过长,Request-URI Too Large)。此外,必须在请求 URL 上对数据进行编码。这种编码可能很简单(将单个字符转化成其他字符,比如空格转化成“ ”),也可能很复杂(将特殊字符转化成三个字符 % hex hex 等)。比方说,如果采用 UTF-8 编码方案,字符串“The umlaut ü@foo-bar”将被转化成“The+umlaut+ü@foo-bar”,因为在 UTF-8 中,字符 ü 被编码为两个字节: C3(十六进制)和 BC (hex),而字符 @ 被编码为一个字节 40 (hex)。可以在 LotusScript 中使用 HTTP GET,也可以通过 Java 代理使用它。
对于 POST 方法,数据是作为数据流发送的,数据的长度由变量 CONTENT_LENGTH 设置。由于数据不是作为 URL 的一部分而是作为输入流在 HTTP 正文中发送的,因此数据长度不受限制,所以,用 POST 方法可以发送更多的数据。此外,数据也不必像在 GET 方法中那样必须是普通文本。与 GET 方法不同,数据和编码的类型由“内容类型”定义,只能通过 Java 代理使用。发送给 WebSphere 时,应该将字段格式化为不可分割的字段(类似 GET),发送串行化的 Java 对象(Beans)。
Web 设计要点
将 Domino 连接到 Web 容器时,需要获得身份验证证书。(客户验证数据可以从服务器或者消息头中提取。)在 GET 请求中,LotusScript 不能设置 cookies,但是可以设置用户名/口令信息,将它们作为基本的验证数据发送给 Web 服务器。在通信开始之前用户证书(SSO 标记)有可能超期(如果采用保存/排队的方式)。如果服务器出故障怎么办呢?LotusScript 可以直接调用 WebSphere 并作出响应,但是 Java 代理不能访问 UI 中的文档。这意味着您必须能够读取数据库中的文档、请求进行排队、触发问题,并以用户友好的方式查询 Java 代理的状态。至少成批处理多个请求的效率更高,也能处理更多的数据!
要记住每个文档都是它自己的 HTTP 连接/请求/响应,无论代理是否正在处理多个记录(文档)。在访问一个富文本(rich text) Notes 项目之前,您必须先保存它。
Domino 设计要点
当然,Domino 必须运行 LotusScript 的 Web 任务。该任务捕获请求并添加惟一的后缀来获得新的响应。LotusScript 和 Java 代理都支持基本的验证(浏览器窗口中的登录对话框要求用户输入合法的用户名和口令),但是只有 Java 代理支持 SSO 标记。为了将 Domino 连接到 WebSphere 上的 EJB 容器,必须使用 RMI/IIOP 通信。必须使用 InitialContext 通过 JNDI(Java 命名和目录接口,Java Naming and Directory Interface)访问 EHB 主页引用(home reference)。
Domino R5
IBM WebSphere Application Server Enterprise Edition 是支持标准 CORBA 的惟一版本,Domino R5 不具备这个条件,因此,它必须使用中介服务器。中介服务器是一个“普通的” EJB 客户程序,符合 WebSphere 的所有要求,起着 Domino 的代理的作用。Domino R5 通过(到 Web 容器的)HTTP、RMI 和套接字与中介服务器进行通信:
图 3. Domino 5/WebSphere 服务器体系结构
但是这种配置对 WebSphere 有一些限制。J2EE 规范规定 servlet 不能是 RMI 服务器,只能是 RMI 客户机。此外,EJB 不能启动自己的线程,也不能是 RMI 服务器。但是,WebSphere 允许使用“一般的”服务器。servlet 可以是通过控制台(虽然不能在 WebSphere Application Server Single Server Edition 中)启动和停止的任何程序。我们建议在每台 WebSphere 服务器上都运行中介服务器。
从 Domino R5 到终结服务器的通信可以使用任何协议,不过,对于 Java 代理,最好使用 RMI。通信也需要有到多服务器的引用,中介服务器应该有到所有 EJB 容器的引用。如果必须与防火墙后的服务器对话,则应该使用 RMI/IIOP 代替 RMI/JRMP。
中介服务器应该和 WebSphere 位于同一节点上。每个 EJB 应用程序都应该运行一个副本,可以将该副本定义为 WebSphere Apllication Server 域中的通用服务器。允许远程启动和停止中介服务器。
Domino 6
连接 Domino 6.x 和 WebSphere Application Server 5 时不需要中介服务器:这是因为 Domino 6.x 和 WebSphere Application Server 5 支持 Java 虚拟机(JVM) 1.3。(WebSphere Application Server 5 包含一些 JVM 1.4 特性,但是只有 JVM 1.3 得到完全支持。)
从 WebSphere 连接到 Domino 的方法有两种:HTTP(类似到 WebSphere 的 Java 代理)和 Java/CORBA。
可以使用 URL 和 URL Connection 类将 WebSphere 连接到 Domino HTTP。这意味着 WebSphere 可以模仿浏览器或者使用 Domino servlet 引擎(而且可以在响应中传输任何内容的 Domino servlet)。另一方面,Domino 只能接受提交的表单。这里必须避免使用按钮或者活动链接,因为很难模仿它们的提交行为。这些表单必须转发/处理请求到另一个表单/页面/视图,中间的视图中必须选择表单属性“Treat document content as HTML”。然后必须创建一个显示选定文档的视图,并在表单中添加一个 $$Return 字段,其公式为“[“ + @SubSet(@DbName; -1) + ViewName + “/" + docID + “?OpenDocument]"。
您可以使用标准 Domino 类和技术(导入到您的代码“lotus.domino.*”中)。Domino 本身将这些类和技术视作独立的 Java 程序。可以从 NotesFactory 创建会话对象(“Static public Session create Session (String host, String user, String passwd)”),但不要使用 NotesThread。
在 Notes 会话中,需要为每个请求建立单独的会话。您可以使用 Web 容器,但它需要自己的同步和限制线程数量的方式。EJB 是单线程的,线程池中的每个线程都有自己的连接。(通常,J2EE 1.3 不允许线程具有“所有权”,如果需要该特性,可以使用 WebSphere Application Server 5.x 中的异步 bean 来获得它。) Domino 5 和更早的版本不能处理很高速度的 CORBA 连接,这会造成连接中断。但是,Domino 6 的 CORBA 实现得到了很大改进。如果希望避免因为内存不足而造成 Domino 服务器崩溃,则必须使用 Java 回收对象。
如您所见,有多种不同的连接 Lotus Domino 和 IBM WebSphere 的方法,采用何种方法取决于您要建立的解决方案。因此,将您的应用程序设计成完全满足所有的需求是绝对有必要的。如果 Domino 是您的核心体系结构,就让 Domino 服务器作为 HTTP 服务器、应用程序服务器和数据存储。如果 Domino 是 J2EE 环境的一部分,那么就将 Domino 服务器视作数据存储的一部分,并通过 Domino 对象使用它。
| 第1页: 第1页 |