|
|
利用J2EE连接器架构和SOAP构建“Web服务就绪”的企业级应用,第一部分 作者 Venkat
Amirisetty 和 Marina Sum 翻译:王锦全 Java2企业版的连接器架构与简单对象访问协议(SOAP)技术的结合为通过SOAP编码的可扩展标记语言(XML)来与遗留系统交互提供了一种标准的方法。同时,你还可以利用J2EE平台提供的高效的资源管理能力。 本文描述了如何在J2EE环境里使用连接器和SOAP,同时提供了实现它的三种建议方法。 本文包含5个部分: 本文假定读者熟悉以下内容 企业应用集成(EAI)与连接器:作为设计中心的J2EE应用服务器你可以使用最新的J2EE应用服务器,比如Sun[tm] ONE Application Server 7,以标准的方式来创建和发布J2EE连接器。根据J2EE连接器架构规范 的解释,一个J2EE连接器是一个允许J2EE应用利用一个特定的后台系统的系统组件。这些后台系统可以是企业资源管理系统(ERP),客户关系管理系统(CRM)等。该架构简化了在J2EE平台上的企业应用集成(EAI),并为在后台系统上创建更为复杂且有附加值的客户层应用铺平了道路。 J2EE1.3规范 包含了J2EE连接器1.0规范,该规范提供了在一个与J2EE平台兼容的应用服务器上使用和发布连接器的标准。目前J2EE 连接器规范1.5 正由Java Community Process[sm]组织审议并有一个公共最终草案新近被推出。本文仅讨论与J2EE连接器规范1.0兼容的连接器和其使用时的可能情形。 以下三种有趣的情形展示了客户端应用如何与连接器交互:
不仅如此,在这种方式下,客户端应用还可以把事务的发生和事务与安全要求同资源适配器功能相集成,从而充分利用应用服务器和连接器的功能。由于应用同连接器处在相同的地址空间,这种方式可以使系统获得更好的性能和并发效果
在所有上述三种情形中,连接器都会使用高效的资源管理功能,比如由应用服务器提供的缓冲池。在上述紧耦合的交互方式下,客户端使用连接器提供的容器管理的安全和事务功能。在松耦合的交互方式下,SOAP服务端依然使用这些特色。详情参看“实现方法”部分。 注意—在所有上述三种情形中,不论是连接器源还是连接器与应用服务器交互的能力都不会有任何方式的变化。唯一会发生的是根据应用的不同需求在连接器使用上的变化。这种方式保证了为了不直接把后台系统展现出来供XML或SOAP交互而创建或采用连接器所进行的投资。 用于远程过程调用(RPC)的SOAPSOAP是用于在一个非集中式、分布的环境里交换信息的轻量的、基于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展示了利用连接器来实现一个紧耦合交互的情形。
图1使用一个JIO对象与连接器进行紧耦合交互 在上图中,JIO是连接器交互层的一部分,它可以包含一组对与连接器交互进行建模的JIO对象。该情形示例了以下内容:
客户端组件利用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服务方式,因此,它通常被认为是一个运行时系统。
图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年,大多在技术领域。 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||