当连接器发布在一个J2EE服务器实例上而客户端应用组件发布在一个非J2EE服务器实例上时的松耦合交互方式——在这种方式下, 前一种情形中描述的一些情况依然存在。而且在这种情形下,一个非Java客户端和一个运行在Java虚拟机上的Java客户端还必须要与后台系统交互。
在所有上述三种情形中,连接器都会使用高效的资源管理功能,比如由应用服务器提供的缓冲池。在上述紧耦合的交互方式下,客户端使用连接器提供的容器管理的安全和事务功能。在松耦合的交互方式下,SOAP服务端依然使用这些特色。详情参看“实现方法”部分。
注意—在所有上述三种情形中,不论是连接器源还是连接器与应用服务器交互的能力都不会有任何方式的变化。唯一会发生的是根据应用的不同需求在连接器使用上的变化。这种方式保证了为了不直接把后台系统展现出来供XML或SOAP交互而创建或采用连接器所进行的投资。
用于远程过程调用(RPC)的SOAP
SOAP是用于在一个非集中式、分布的环境里交换信息的轻量的、基于XML的协议。它包含三部分:
一个定义了一个框架的包,该框架描述一个消息所包含的内容和如何来处理它。
用于表示由具体应用程序定义的数据类型数据的一套编码规则。
一套用于表示远程过程调用和响应的约定。
实际上,你可以把很多不同的协议与SOAP结合来使用。但目前唯一流行的是SOAP与超文本传输协议的绑定。用于远程过程调用的SOAP定义了一套统一的处理远程调用和响应的规则,而用SOAP进行远程调用是与SOAP的协议绑定相交叉的。如果你使用HTTP协议作为SOAP绑定协议,那么,一个RPC调用会映射到一个HTTP请求而一个RPC响应会映射为一个HTTP响应,详情请参见W3C 关于SOAP的注释。
用于基于XML的RPC的Java API(JAX-RPC)定义了在Java平台上支持基于XML的RPC的API。JAX-RPC定义的一个关键的协议绑定就是SOAP协议绑定。同样的,JAX-RPC规范还规定兼容的运行时系统必须支持作为传输协议的HTTP。详情参见 JAX-RPC网站。
实现方法
这一部分将集中描述创建服务端服务的方法和如何使连接器能与基于HTTP协议的SOAP消息交互(要了解如何发布Web服务的详情,请参见 Sun ONE Studio 4 开发者资源 )。这些方法并不相互排斥,他们具有如下通用的组件:
后台系统——需要与之交互的系统,如 ERP、CRM 或客户遗留应用。该系统或运行在一个不同的地址空间里,或运行在一个单独的物理系统中。
连接器——一个专门开发出来用于连接后台系统并与之交互的系统。它通常是建立在由后台系统提供的一组客户端 API 上。
交互对象(JIO)——一个 Java 工具类,它封装了相对复杂的连接器交互 API 并为客户端展现一个更简单的 API ,从而优化代码结构并使维护更加方便。你可以为一个特定的业务函数或一组通用的业务函数创建 JIO 对象,然后客户端应用就可以直接使用这些 JIO 对象或把他们作为服务端服务来使用。你还可以在连接器之上建立 JIO 对象层来把与连接器的交互操作同应用程序相隔离。代码示例 1 包含了一个JIO 代码例子。
客户端——一个客户端是对与连接器交互感兴趣的一个 J2EE 组件、非 J2EE 组件或非 Java 组件。
紧耦合交互模式
图1展示了利用连接器来实现一个紧耦合交互的情形。
|
图例
|
|
ex
|
例子
|
|
EJB
|
企业级JavaBean (EJB[tm]) 组件
|
图1使用一个JIO对象与连接器进行紧耦合交互
在上图中,JIO是连接器交互层的一部分,它可以包含一组对与连接器交互进行建模的JIO对象。该情形示例了以下内容:
- 如何为与一个假想的客户订单跟踪应用系统(COTS)进行交互的连接器创建一个 JIO 对象。
- 如何封装 GetCustomer 和 UpdateCustome 业务函数。
客户端组件利用COTS JIO类来与连接器交互。
以下是一个JIO类的代码示例。
public class COTSJIO implements COTSServiceEndPoints{
private Connection connection;
// Default constructor.
public COTSJIO(){
// Initialize instance variables.
}
public void acquireConnection(String jndiName)
throws ResourceException{
// Use jndiName to acquire Connection handle.
// Cache the Connection handle.
}
public COTSGetCustomerOutputRecord executeGetCustomer
(COTSGetCustomerInputRecord inputRecord) throws
ResourceException{
// Execute 'GetCustomer' business function,
using connector-provided API.
}
public COTSUpdateCustomerOutputRecord
executeUpdateCustomer(COTSUpdateCustomerInputRecord
inputRecord) throws ResourceException{
// Execute 'UpdateCustomer' business function,
using connector-provided API.
}
public void closeConnection() throws ResourceException{
// Close the Connection.
}
public COTSGetCustomerOutputRecord getCustomerEndPoint
(String jndiName, COTSGetCustomerInputRecord inputRecord)
throws RemoteException, ResourceException{
// Call to acquireConnection with jndiName as parameter.
// Call to executeGetCustomer with inputRecord as parameter.
// Call to closeConnection.
// Return executeGetCustomer output.
}
public COTSUpdateCustomerOutputRecord updateCustomerEndPoint
(String jndiName, COTSUpdateCustomerInputRecord inputRecord)
throws RemoteException, ResourceException{
// Call to acquireConnection with jndiName as parameter.
// Call to executeUpdateCustomer with inputRecord as parameter.
// Call to closeConnection.
// Return executeUpdateCustomer output.
}
}
代码示例1
COTSJIO.java:一个与COTS连接器交互的JIO的例子
松耦合交互模式
图2显示了涉及松耦合交互情形的组件关系。在这里,JIO对象扮演了服务端服务的角色,它以不同的具体实现方式展现为SOAP服务,比如通过JAX-RPC或者以Apache SOAP服务方式,因此,它通常被认为是一个运行时系统。
|
图例
|
|
ex
|
例子
|
|
EJB
|
企业级JavaBeans (EJB) 组件
|
图2利用JIO和SOAP与连接器的松耦合交互
代码示例1中的JIO对象实现了一个被称为 COTSServiceEndPoints 的接口,该接口展现的方法是供一个SOAP RPC来调用的。代码示例2是这种服务端服务定义的一个例子,它可以通过一个由运行时系统提供的传输驱动器(Transport Driver)来访问。SOAP要求输入输出参数必须是基本数据类型或bean。如果提供的数据类型不是上述二者,你就必须向运行时系统提供一个序列化/反序列化器(serializer and deserializer)。
public interface COTSServiceEndPoints extends Remote{
public COTSGetCustomerOutputRecord getCustomerEndPoint(String
jndiName, COTSGetCustomerInputRecord inputRecord) throws
RemoteException, ResourceException;
public COTSUpdateCustomerOutputRecord updateCustomerEndPoint
(String jndiName, COTSUpdateCustomerInputRecord inputRecord) throws
RemoteException, ResourceException;
}
示例代码2
COTSServiceEndPoints.java:一组由JIO对象实现的服务端服务的例子
在上述情形中,JIO对象仅限于与某一个特定的连接器进行交互。某些应用或许会要求与多个连接器实行交互;你可以通过在服务端服务应用程序中使用多个连接器依赖的JIO对象并把该应用展现为可进行SOAP访问的服务来满足这一要求。图3显示了这种应用的体系结构。
图3通过JIO和SOAP与多个连接器实现松耦合交互
总结
通过遵照J2EE连接器规范,你可以在J2EE应用服务器中简化企业级应用系统集成的过程。但必须注意多种不同的驱动器对连接器使用模式的影响。不论你采用上述哪种模式,请务必利用由应用服务器及在其上建立的任何访问层提供的各种功能特点。
同样要记住的是,你不仅可以将访问层上的JIO对象展现为服务端的服务,应用程序还可以直接通过它们与连接器进行交互。
参考资料
本系列文章的第二部分不久就会出来,在第二部分中我们将描述如何利用Sun Java System连接器构建器来实现紧耦合和松耦合的交互,还将描述如何创建基于HTTPS协议的SOAP和支持附件的SOAP。
关于作者
Venkat Amirisetty是Sun微系统公司的一名资深工程师,已经在Sun公司工作了6年。他目前正在为应用系统集成开发技术产品,同时他还是Sun Java System连接器构建器项目的工程领导。Venkat 还和J2EE连接器体系架构1.5版(JSR-112)的专家组有紧密的协作。
Marina Sum 是Sun Java System 开发者网站的一名资深作家. 她差不多已经为Sun公司写作了14年,大多在技术领域。