随笔 - 181, 文章 - 2, 评论 - 85, 引用 - 0
数据加载中……

IBM WebSphere 开发者技术期刊: 使用 Rational Application Developer 和 WebSphere Application Server 来加速基于 XML 的 SOA 的 JSF 开发——第 4 部分

     摘要: 本文是此系列文章的第 4 部分,该系列提出了加快基于 XML 的面向服务体系结构(Service Oriented Architecture,SOA)应用程序表示开发的解决方案。本文重点集中于利用 IBM ® Rational® Application Developer V6 和 IBM Websphere ® Portal 开发 portlet。Portlet 用个人化的、管理的、再次使用的内...  阅读全文

posted @ 2006-04-17 03:30 wsdfsdf 阅读(469) | 评论 (0)编辑 收藏

IBM WebSphere 开发者技术期刊: 使用 Rational Application Developer 和 WebSphere Application Server 来加速基于 XML 的 SOA 的 JSF 开发——第 3 部分

     摘要: 本文是提出了加快基于 XML 的面向服务的体系结构(Service Oriented Architecture,SOA)应用程序表示开发的解决方案系列文章的第 3 部分。这种解决方案包括 Eclipse 功能,可以生成静态类型的用于 XSD Schema 的服务对象数据(Service Data Object,SDO),并提供了在表示元素数据与 XML 数据相互转换中使用 SDO 的运行框架。第三...  阅读全文

posted @ 2006-04-17 03:22 wsdfsdf 阅读(468) | 评论 (0)编辑 收藏

在企业级 SOA 中使用 Web 服务,第 3 部分: 将您的 SOA 合并成三维的整合中心以提高速度和可靠性

将您的 SOA 合并成三维空间的整合中心,以提高 Web 服务的互用性。Judith M. Myerson 给出了四个合并的实例:非共享的 SOA 的二维中心、共享的 SOA 的二维中心、共享的 SOA 的三维中心的两种视图。权衡各种利弊,确定三维空间中的整合中心可以承载的 SOA 的最大数目是非常重要的,使得能够避免中心超负荷。

引言

在企业级 SOA 系列文章的第二篇——“使外部 Web 服务互操作性最优”中,我给出了不会导致多个 SOA 超负荷的服务互用性的实例——从简单的协议共存到复杂的多平台的互用性。我谈论了有关您如何使用 Visual Studio .Net 来开发 Microsoft® .Net 平台上的 Web 服务以及如何在 IBM® WebSphere® Application Server 上运行它们的相关问题。

在本文中,我将谈论如何将 Web 服务及非 Web 服务的多重 SOA 合并成三维的整合中心来连接各种后端企业主机系统,包括:

  • 企业资源规划(Enterprise Resource Planning,ERP)
  • 客户关系管理(Customer Relationship Management,CRM)
  • 供应链管理(Supply Chain Management,SCM)
  • 其它企业应用程序集成(Enterprise Application Integration,EAI)的应用程序
  • 虚拟的数据库管理系统

我也将讨论中心如何接受输入数据——事件和数据——来源于各种资源。我使用 X、Y 和 Z 轴在三维空间中展示图片。







什么是 SOA 整合中心?

SOA 整合中心是 Web 服务与非 Web 服务的合并的 SOA 与后端企业系统的集成。它使得 Web 服务及非 Web 服务能够与运行在不同平台上的服务器、主机和微机上的企业系统交互。

然而,SOA 整合中心不同于面向服务的整合(service-oriented integration,SOI)。SOI 将 Web 服务与运行在不同平台上的主机系统相整合。它使得 Web 服务能够通过网关与主机交互。您需要 ASP.Net 或其它技术获取网关来执行普通的 Web 服务。

SOA 是基于一套业务流程的 Web 服务的交互的体系结构。您可以在第一个 SOA 中获取 Web 服务来在第二个 SOA 中复用代表 Web 服务的服务。Web 服务可能由一些小的 Web 服务组成,它们将服务传递给客户。

您使用描述语言(例如,SOAP)或其它描述交互的方法(例如,REST)来定义交互。每个交互都是独立且松耦合的,以便每个交互都能独立于任何其它交互。这与依赖网关来与 Web 服务集成的紧耦合的主机系统形成对照。







SOA 层

我们看一下二维空间中的 SOA 层。之后,我将向您展示为何三维的整合中心是更好的选择。

SOA 的 IBM 版本的前五层(请见参考资料)是(从下至上):

  • 操作系统
  • 基于组件的(系统)
  • 服务
  • 业务流程
  • 表示层

第六层是集成体系结构(也作为企业集成总线(Enterprise Integration Bus)),它垂直覆盖了前五层。下一层是服务质量、安全、管理及监控层。

显而易见,操作层由 EAI 打包的应用程序、遗留、老式的面向对象及商业智能应用程序组成。它们都可以通过使用 SOI(在项目级或企业级)来同第二层的基于组件的系统相集成。然后,将组件结合或集成到复合应用程序中来提供第三层的服务。

第四层向您展示了那些服务是如何根据一套业务流程从一个流向另一个的。更高一层通过远程门户网站 Web 服务(Web Services for Remote Portlet,WSRP)标准或其它面向人的表示层的方法来将 Web 服务应用于应用程序接口中。

二维静态的 SOA 可能是有问题的。幸好,整合中心的发展意味着 SOA 将变成三维动态的。







可复用的体系结构

我们假设该 Web 服务需要在 .Net 平台上或随后的 WebSphere 平台上运行前从主机系统获取信息。您需要将 Web 服务与执行普通 Web 服务的主机网关相整合。

所有 Web 服务彼此以 XML 传递信息——多个 SOA 中的业务流程应当如何整合及其在提供的服务中如何实现。虽然在多个 SOA 中 Web 服务是可复用的,但是我进一步将 SOA 处理成可复用的体系结构。

我有多个实例,它们关于将可复用的 SOA 合并成与主机系统相连的整合中心,我提出如下四步来创建中心:

  1. 将作为可复用的体系结构的 SOA 数组划分成两个模块。第一模块主要包括整合 Web 服务的机制,而第二个模块重在服务交互。
  2. 为了获得最佳的速度及可靠性,将每个 SOA 优化成更紧凑的形式。检查可能影响性能的磁盘碎片空间。
  3. 将 SOA 按照重要性及复用频率区分优先次序。检查用户对于更改 SOA 优先权的需求。
  4. 将 SOA 合并成连接到一个或更多主机系统的整合中心,这些主机系统运行在不同的平台上。检查先前没有被提出的互用性问题。






模块化的 SOA 库

您可以开发模块化的和优化的 SOA 库,这些 SOA 被分成了不同类别的层次。每个类别可以通过层次最低级别的 Web 服务被进一步划分成 SOA 的子组。

您可以将库用作到 Web 服务应用程序的动态链接。当应用程序需要访问模块化的 SOA 时,它将自己链接到库中。当它不再需要检索到的 SOA 时,将从库中释放自己,当提高速度及性能时节省磁盘空间。

下列是库中模块化的 SOA 的一些实例:

  • 卫生保健 SOA
  • 零售管理 SOA
  • 物流 SOA
  • 无线射频识别(Radio Frequency Identification,RFID)SOA






库用例

假设您使用在库中使用最后三个 SOA(零售管理、物流和 RFID)来开发整合中心并将它们连接到主机网关中。今后,用户的需求改变了——取消零售管理 SOA 并以卫生保健 SOA 代替它。

同时,用新版本更新物流 SOA 使其迎合用户的需求。在 RFID SOA 中包含新的子组之后,将所有子组区分优先次序并将它们优化。







二维非共享的 SOA

我们看一下 Blue Repository 中的三个模块化的 SOA(零售管理、物流和 RFID)的二维中心(请见图 1)。所有都连接到主机网关中。例如,如果您使用 ASP.Net,那么您可以通过网关来执行普通的 Web 服务。


图 1. 非共享的 SOA 的二维中心
非共享的 SOA 的二维中心

如您所见,SOA 不是共享的。您可以将这三者结合成复合应用程序以减少到主机网关的连接器的数目。







二维共享的 SOA

图 2 所示,RFID SOA 与物流 SOA 在一边相交叠。交叠区域用黄色带黑色斜线来显示。它包含 SOA 用于生成一个或两个服务的资源。


图 2. 共享的 SOA 的二维中心
共享的 SOA 的二维中心






代表三维空间中的中心

您怎样在二维计算机屏幕上设想三维的中心?处理该问题的一种方法是在二维平面中画出整合中心的 X、Y 和 Z 轴。另一种方法是使用软件简单地将 2D 图片转换成 3D 的版本。

在三维的中心,您可以在不改变 SOA 的情况下将现有的主机替换成新样式或另一供应商的样式。另外,您可以重新配置或更改 SOA 的优先权以适合新的或已更新的主机系统对于更改用户及组织的需求的响应。







第一个三维中心

考虑如图 3 所示的三维空间中的整合中心。如您所见,RFID SOA 中部分位于物流 SOA 之后。RFID SOA 的隐藏部分用到物流 SOA 的蓝色线画出。


图 3. 第一个共享的 SOA 的三维中心
第一个共享的 SOA 的三维中心

如您所见,连接器从 RFID SOA 通过(而不是环绕)物流 SOA 到主机网关。这意味着从 RFID SOA 而来的连接器与物流 SOA 共享了一些资源。







第二个三维中心

设想 RFID SOA 的重叠部分在物流 SOA 的前面,但是不是从任一侧,如图 4 所示。这给了 RFID SOA 更多的选择来共享物流 SOA 中的大量资源。


图 4. 第二个共享的 SOA 的三维中心
第二个共享的 SOA 的三维中心

如您所见,连接器从 RFID SOA 通过物流 SOA。






有多少共享的 SOA?

在三维中心中您可以共享的 SOA 的数目依赖于项目复杂性、合并问题及业务流程中的利弊。向您避免 SOA 的过量开销一样,您需要确保在开发的整个生命周期中不会在三维空间中发生中心超负荷的问题。您应当在周期的每个时刻都测试超负荷。







结束语

在三维中心中合并 SOA 需要预先规划来设置开发和共享的 SOA 的数目限制。您应当同业务分析师开发组交流有关各种合并问题的信息。您将发现解决合并问题会使您开发三维中心的工作变得非常容易。您可以开发在中心可复用和共享的 SOA。分析师将发现解决该问题会使他们的设计和分析三维空间的中心的工作变得非常容易。他们可以确定在不会导致中心超负荷的前提下哪个主机系统可以连接到中心。

posted @ 2006-04-17 03:19 wsdfsdf 阅读(163) | 评论 (1)编辑 收藏

使用 Rational Application Developer 和 WebSphere Application Server 来加速基于 XML 的 SOA 的 JSF 开发——第 2 部分

     摘要: 本文提出了加快基于 XML 的面向服务的体系结构(Service Oriented Architecture,SOA)应用程序表示开发的解决方案系列文章的第 2 部分。这种解决方案包括 Eclipse 功能,可以生成静态类型的用于 XSD Schema 的服务对象数据(Service Data Object,SDO),并提供了在表示元素数据与 XML 数据相互转换中使用 SDO 的运行框架。第 2...  阅读全文

posted @ 2006-04-17 03:17 wsdfsdf 阅读(277) | 评论 (0)编辑 收藏

在企业级 SOA 中使用 Web 服务,第 2 部分: 使外部 Web 服务互操作性最优

外部和内部 Web 服务之间多个面向服务的体系结构 (Service-Oriented Architectures,SOA) 中的外部 Web 服务的互操作性最优。Judith Myerson 展示了如何更改服务的类型、位置以及每个 Web 服务的平台,以便实现原始应用程序的业务流程。

引言

在关于企业级面向服务的体系结构 (SOA) 系列我的第一篇文章,“使用多重 SOA 来消除企业系统之间的差异”(参阅参考资料)中,通过说明如何重用一个或多个 SOA 中的 Web 服务(以数据为中心 (data-centric) 和业务逻辑),然后将他们联合到一个受组织控制的组合应用程序中,讨论了使用 SOA 缩小企业系统差异的方案。

当 Web 服务不受组织所控制时,需要确保它们在外部可以彼此互操作,来共享语义和契约职责。语义的误解(例如所有权)和契约漏洞(例如多平台间的区别)会影响外部企业 Web 服务之间的互操作性问题。

在本文中,我展示了四个实现制造资源规划 (Manufacturing Resource Planning,MRP) 和客户关系管理 (Customer Relationship Management,CRM) 服务的实例,如下所示:

  1. 企业以前的应用程序
  2. 到外部 Web 服务的动态链接
  3. 请求外部 Web 服务的 REpresentational State Transfer/Simple Object Access Protocol (REST/SOAP) 共存
  4. 使用 IBM® WebSphere® Application Server 和 Microsoft® Visual Studio .Net 的 Web 服务互操作性

考虑各种交易时,确定系统可以负载的可互操作的 SOA 的数量非常重要,这样可以避免 SOA 过载。







企业以前的应用程序

假设企业以前的应用程序(参见图 1)被分成业务流程的模块化组件。该应用程序的两个重要组件(MRP 和 CRM)要求不断发生变化且重新编译长期运行的应用程序。


图 1. 企业以前的应用程序
企业以前的应用程序






动态服务链接

为增加运行效率,从应用程序中提取出这些组件并将其重新构建为外部 Web 服务更有意义。通过这种方式,您可以更改两个 Web 服务的代码,而不用重新编译庞大的、复杂的长期运行的应用程序。

在第一个 SOA(参见图 2)中以更加紧凑的形式重新设计的应用程序可以动态链接到第二个 SOA 中的外部企业 MRP Web 服务,依次的,指向第三个 SOA 中的外部企业 CRM Web 服务。一旦收到请求,CRM Web 服务将请求和信息发送给应用程序来进行进一步处理。


图 2. 到 Web 服务的动态链接
动态链接

每个链接机制都是以发送请求或消息,接收响应,或执行 SQL 或 HTTP 操作的形式出现的。还可以封装没有 MRP 组件的应用程序,这样就可以向 MRP Web 服务发送请求。







软件架构

需要牢记,在从一个协议转换到另一个,或者从一个软件架构转换到另一个时,可能会引起平台间的互操作性问题。一些实例包括 SOAP、REST、.Net 架构、企业 Java Bean (Enterprise Java Beans,EJB) 以及 Java 消息服务 (Java Messaging Service,JMS)。

运行在 HTTP 上的 .Net Web 服务可以以三种不同的方式调用:HTTP GET 操作、HTTP POST 操作和 SOAP。如果需要快速的调用 Web 服务且没有 SOAP 客户端的话,GET 和 POST 操作都是非常有用的。可以通过 Perl 脚本在 HTTP 上使用 REST 来执行 GET、POST、PUT 和 DELETE 操作。在这个脚本中,您可以指定 SQL 查询和简单的消息队列。

如果 SOAP 客户端可用,下面是如何在 REST 和 SOAP 之间进行简单的选择。如果应用程序是 基于资源的,选择 REST。如果应用程序是 基于行为的,选择 SOAP。在 REST 中,客户端可以通过 HTTP 请求执行在一系列资源上的多个操作。对于基于 SOAP 的请求,可能需要执行请求的每个面向活动的客户端可能仅需要一个调用操作。







调用框架

要构建 SOAP 请求,需要使用 Web 服务描述语言 (Web Services Description Language,WSDL),这是一种描述如何访问 Web 服务以及将执行什么操作的语言。您可以指定服务的类型,而不用自定义 Web 服务的代码,也不用重新编译以前的应用程序。

为确保 WSDL 文件能在各种软件架构中工作,您可以利用 IBM Web Services Invocation Framework (WSIF),它让您可以将 WSDL 作为不同软件标准来描述。这表明您可以通过描述语言周围的 API 以独立于协议和位置的方式访问 WSDL。还意味着您可以通过 WSDL 将 Web 服务结合复合成应用程序,在 WSDL 中您可以在各种条件和异常情况下切换协议和位置。

为构建 WSIF,无论您打算使用什么提供商,您都需要满足最低需求,该选项包括如下:

  • JAXP XML 解析器
  • Java API 的 WSDL
  • Apache SOAP
  • Apache Axis。






REST 和 SOAP 共存

虽然 REST 请求不像 SOAP 请求那样依赖 WSDL,您仍需要 XML Schema 来验证 REST 操作。既然 WSDL 支持 schema 规范,REST 和 SOAP 可以作为从一个合成的 Web 服务应用程序到外部应用程序的请求而共存。

例如,SOA #1(参阅图 3)中的应用程序首先发送 SOAP 请求调用 SOA #2 的 MRP Web 服务中调用基于活动的服务,接下来发送一个 REST 请求来操作相同 MRP Web 服务中的面向行为的服务。所有基于 SOAP 的请求都是基于 IBM WSIF 的。


图 3. REST 和 SOAP 共存
REST 和 SOAP 共存

正如您所见到的,第一个 SOA 里面的应用程序运行在 Unix 或者 Linux 服务器上,而第二个 SOA 中的 MRP Web 服务运行在 IBM WebSphere Application Server (Application Server) 中。您可以使用 WSIF 来更改基于 SOAP 的请求的规范版本中的服务类型和位置。







WebSphere 和 .Net 产品的互操作性

如果您希望开发更加复杂的 Web 服务,作为 Linux 或者 Window 平台上的较大企业系统开发项目的一部分,可以考虑使用用于 WebSphere 软件的 IBM Rational® Application Developer。它同用于 Java™ 和 EJB 的统一建模语言 (Universal Modeling Language,UML) Visual Editor 一起提供,并且运行在 Eclipse 源码开放平台上,允许您扩展您的开发环境。还可以使用 Microsoft Visual Studio.Net。

您可以使用软件来将应用程序逻辑分割成模块化的多业务流程 Web 服务组件。IBM 通过提供 Web Services Navigator(Rational Application Developer 插件) 更前进了一步,让您直观地同 Web 服务事务交互。

如果您正在使用 Visual Studio.Net 在 Microsoft .Net 平台上开发 Web 服务,可以在 Application Server 中运行它们。这意味着使两个平台之间的 Web 服务互操作(参阅参考资料),您所要做的只是开发与两种平台公用的 WSDL。

例如,运行在 Unix 或者 Linux 服务器上的应用程序(参见图 4)首先发送 SOAP 请求来调用运行在 Application Server 上的 MRP Web 服务的基于活动的服务。接下来,该应用程序发送一个 REST 请求来执行同样 MRP Web 服务上的一系列基于资源的服务。一旦收到请求,SOA #3 中的 CRM Web 服务向原始应用程序发送一个请求或者信息。


图 4. 多平台外部 Web 服务
多平台外部 Web 服务

正如您所看到的,第三个 SOA 中的 CRM Web 服务运行在 .Net 平台上并且访问 Application Server。CRM Web 服务向第一个 SOA 中的应用程序发送请求或者信息。您可以为 Visual Studio.NET 添加一个 Visual Perl 插件。您还可以使用用于 Unix 到 Windows 移植的命令行级别的基于 REST 的脚本,并且使其适应 Visual Perl 环境,这取决于简本的复杂性。







Visual Studio

对于您来说,使用 Visual Studio .Net 比 Visual Basic、C++、Java、Kornshell 来封装 Unix 应用程序为 COM 组件要更加容易。同样,如果您正在开发应用程序,使用 Unix shell 脚本来运行 Window 应用程序,或者如果您将 Unix 应用程序移植到 Window 平台下来链接到外部 Web 服务,使用它也非常容易。

这里有一些您应该了解的提示。首先,您应该将自己的 WSDL 文件发布到一个公共的位置来解决互操作性的差别。您可以跳过 Rational Application Developer's 自底向上的方法或者 Visual Studio .Net 的 WSDL First 方法中的自动生成 WSDL 文件。可以使用 Rational Application Developer 的 Skeleton 或者自顶向下的方法 来启动您的 WSDL 文件并填充 Java Class 实现。或者,还可以禁用 Visual Studio 的 WDSL First 方法中的自动生成 WSDL 文件选项并且发布您自己的 WSDL。

第二,要为自己提供一个可以使用的 WSDL 模板,可以考虑 Rational Application Developer 的自底向上的方法(从 Java Bean 开始),Rational XDE(基于类模型生成模板代码),或者 Visual Studio 的 Implementation First Approach(在通过编写 Web 服务代码开始后生成模板代码)。然而 Rational Application Developer 提供了 WSDL,Visual Studio.Net 可能没有提供。







需要多少 SOA?

用来连接 EAI 应用程序的 SOA 的数量取决于项目、互操作性问题、业务流程和负载性能问题之间复杂性的平衡。如果您避免了 SOAP 超标,您需要确保 SOAP 在开发的整个生命周期不会超载。您应该在周期的每一点上测试超载。







结束语

使多平台 SOA 之间的外部 Web 服务互操作性最优需要事先计划好可以开发多少 SOA。您应该与业务分析团队和 IT 专家在各种性能问题上进行交流。您会发现解决互操作性问题将使您的开发工作变得更加得容易。您可以开发外部 Web 服务,每个服务可以使用不同的平台和请求协议。分析师将发现解决该问题将使设计和分析多个 SOA 系统的工作更加容易。他们可以确定 Web 服务可以运行在什么平台上,而不用导致 SOA 超载。

posted @ 2006-04-17 03:13 wsdfsdf 阅读(130) | 评论 (1)编辑 收藏

在企业级 SOA 中使用 Web 服务,第 1 部分: 使用多重 SOA 来消除企业系统之间的差异

使用多重面向服务的体系结构(Service-Oriented Architectures,SOA)可以消除企业系统之间的差异。Judith M. Myerson 向您展示了四种场景,它们将 Web 服务结合到复合应用程序中,该应用程序由独立 SOA、多重 SOA、具备多重 EAI 应用程序的独立 SOA 以及具备 EAI 应用程序的多重 SOA 复合而成。然而仍旧要考虑各种权衡,确定系统可以携带的 SOA 的最大数目可以使您避免 SOA 的超载。

引言

在服务级协议(Service-Level Agreements,SLA)系列的第三篇文章(“在 Web 服务上下文中使用 SLA”,请见参考资料)中,我谈论了 Web 服务是如何作为 EAI 限制来补充 Enterprise Application Integration(EAI)应用程序的。我进一步讨论了使用 SOA 来消除企业系统之间的差异的场景,向您展示了如何执行获取 EAI 应用程序所有权的 Web 服务的业务逻辑。我向您展示了如何复用以数据为中心的 Web 服务以及来源于一个或更多 SOA 的业务逻辑并将它们结合进复合应用程序中。







EAI 差异

我重在研究 EAI 解决方案的三个主要的局限:所有权、有限的集成以及缺少开放行业标准。在公司的 EAI 应用程序之间存在信息传递的差异,例如:

  • 客户关系管理(Customer relationship management,CRM)
  • 投资关系管理(Investor relationship management,IRM)
  • 供应链管理(Supply-chain management,SCM)
  • 企业资源规划(Enterprise resource planning,ERP)

EAI 应用程序的所有权性质受到公司应用于 EAI 应用程序中的业务流程类型和公司经营的业务类型的限制。EAI 解决方案限制了使用外部应用程序来集成 EAI 系统的范围。对于在 EAI 系统及外部应用程序之间映射业务逻辑的计划的定制是浪费时间并且代价昂贵的。

实现 EAI 的标准事实上是不存在的。没有标准,在互联网上整合多商家的 EAI 应用程序是非常困难的。与 EAI 不同,Web 服务提供了广泛的标准,为应用程序与外部的服务提供者之间搭建了桥梁。然而,EAI 比 Web 服务更加安全,IT 行业联合起来创建并改善了现有的标准(WS-Security)为 Web 服务提供了更加安全的机制。







消除差异

各种窗体的中间件技术已经被用于消除 EAI 差异。Web 服务是使得 EAI 应用程序能够互相传递信息的最好的中间件。它们提供了开放的行业标准,为独立平台的 EAI 系统搭建了桥梁。一些附加的 EAI 应用程序承担了开放行业业务流程的提供者或客户的职责,EAI 应用程序不能在封闭环境下采用该流程。

事实上,在独立 SOA 中不是所有 Web 服务都可用。您可以将 Web 服务与基本功能相结合形成复合的 Web 服务应用程序。相反,您可以将这些应用程序同其它的 Web 服务或其它 SOA 中的复合业务相结合来建立新的或更高级的业务服务。这意味着您可以使用多重 SOA 来消除 EAI 应用程序之间的或系统之间的差异。







编制 Web 服务

在 SOA 中,使用一系列高级业务服务的业务流程来编制多重 Web 服务的执行。以数据为中心的 Web 服务很少自我执行。编制的目标是使得 Web 服务能够消除 EAI 的差异,以便具有所有权的 EAI 应用程序可以通过整合的集线器来互相交流。

在编制过程中,您可以扩大或缩小编制的范围和性质,通过复用代码来改变复合应用程序的业务流程逻辑。基于个人提出的功能,SOA 中的 Web 服务可被复用并结合到高级服务的复合应用程序中来创建新的业务服务,反之,该业务服务可被复用并结合到另一个 SOA 的业务服务的高级复合应用程序中。







避免错误

我想到了当开发 Web 服务或将 Web 服务结合进复合应用程序时可能发生的四个错误,您应当避免:

  1. 简单对象访问协议(Simple Object Access Protocol,SOAP)的开销
  2. SOAP 互用性问题
  3. 紧密结合的业务服务
  4. 处理繁重事务的环境。

在每个地方都建立 Web 服务并且将它们结合到所有 Web 服务的应用程序中是不太实际的,即使 Web 服务是基于日益扩大的开放行业标准的(EAI 应用程序缺少这些标准)。当处理 Web 服务时企业可能会产生大量的 SOAP 开销,这样就减慢了完成业务流程的速度。

企业也可能遇到 Web 服务中的 SOAP 互用性的问题。虽然已经完成了大量的工作,使 SOAP 的互用性得到了提高,但是还没有实现行业级的完全互用。

一些具备所有权的 EAI 应用程序可以在紧耦合的环境下很好地执行某些业务功能,在复合应用程序中的 Web 服务不能在松耦合的环境下很好地执行。一个紧耦合的业务服务的实例是客户将卡插入读卡机中,确认卡的金额,指定取出的现金并收到自动地从他的帐户中取款的确认。

在短时间内一些 Web 服务连同其它的 Web 服务(包括长期运行的基于一套复合业务规则的应用程序)一起完成了业务流程,在整合这样的 Web 服务的过程中您可能会发现问题。Web 服务非常适合于短时间运行的应用程序,而不适合于处理繁重事务的环境,因为在这样的环境下需要很长时间才能完成业务流程。







独立的 SOA 场景

现在我们来看一下您怎样才能使 Web 服务同基本功能相结合来构建复合的 Web 服务应用程序,假设装载的性能是令人满意的。考虑下面的 Web 服务,每个都来自于完全互用的系统:

  • 零售商的标识符
  • 零售商的名称
  • 零售商的地址
  • 定购的数量
  • 价格
  • 税务

图 1 所示,前四种 Web 服务仅包含基本功能的数据,而最后两个主要使用业务逻辑来达到向零售商发送帐单的目的。我将所有的都结合到复合的具备帐单功能的应用程序中,也就是在结帐应用程序中进行处理。


图 1. 独立 SOA 的场景
独立 SOA 的场景

我使用零售商标识符的 Web 服务来启动流程,该服务向零售商名称的 Web 服务发出请求来获得与零售商标识符相匹配的名称。当确认信息的时候,零售商名称的 Web 服务与零售商地址的 Web 服务、定购数量的 Web 服务、价格的 Web 服务和税务的 Web 服务相结合来建立具备零售商帐单功能的复合应用程序。随后,在基于服务的业务逻辑的结帐应用程序中处理了该复合应用程序。







多重 SOA 的场景

我们假设小公司缺乏内部的 Tax Service 部门。对于更新、维护的业务有外来的税务服务并且管理外来税务的 Web 服务。对于该公司,我将第一个场景中的前五种 Web 服务结合进具有帐单功能的复合应用程序中,同时假设装载流程的性能是令人满意的。

我们假设 Web 服务发出了请求——将第二个 SOA 中外来的 Web 服务与第一个 SOA 中的复合应用程序相结合。如果接受并实现了该请求,那么在基于价格和税务服务的业务逻辑的结帐应用程序中将处理高级的复合应用程序。如图 2 所示,第二个 SOA 与第一个 SOA 交叠,该交叠的部分可能包含 SOA 中普遍的 Web 服务和非 Web 服务。


图 2. 多重 SOA 的场景
多重 SOA 的场景






独立 SOA 调用 EAI 应用程序

重在关联、链式管理,资源规划的 Web 服务有不同的整合规则(或虚拟的整合集线器),即使它们在整合企业之间的应用程序的过程中可以互相合作。相反,EAI 系统的组件可以通过中间件技术的整合集线器来互相传递信息使得 EAI 应用程序能够同遗留系统、数据库、Web 服务及非 Web 服务进行交互。

我们将 SOA 作为实现多重 EAI 应用程序(在防火墙内部及防火墙外部)的业务功能的主要的中间件技术。为了避免 SOAP 开销,限制 Web 服务的数量。同时,避免降低装载由 Web 服务调用的 EAI 应用程序的速度。

在独立 SOA 调用多重 EAI 应用程序的场景中,零售商标识符的 Web 服务首先调用了 Retail Management System(请见图 3)。在成功地装载了所应调用的应用程序之后,Web 服务发出了将标识符与名称及地址相链接的请求。


图 3. 调用多重 EAI 应用程序的独立 SOA
调用多重 EAI 应用程序的独立 SOA

然后 EAI 应用程序在数据库中搜索请求的项目。如果找到了名称及地址,那么它就向 SOA 发出信息来将定购数量及价格的 Web 服务添加到复合应用程序中。同时卸载 Retail Management System 来为今后调用其它 EAI 应用程序提供空间。

接下来,复合应用程序调用了 Finance Management System,该系统维护 Tax Service 流程规则的数据库。在成功地装载了该 EAI 应用程序之后,定购的数量及价格的应用程序与其相连。高级复合帐单功能就形成了。同时卸载 Finance Management System。







多重 SOA 调用 EAI 应用程序

现在,我们假设需要两个 SOA 连接两个 EAI 应用程序。在该场景中,我将 Order Quantity 和 Order Description Web Services 结合到第一个 SOA 中。我重复了第三个场景中的流程,调用并装载了零售商标识符的 Web 服务,并且向 Retail Management System(请见图 4)发出搜索请求。在成功搜索完之后,该 EAI 应用程序向 SOA 发出信息来将其添加到复合应用程序中。


图 4. 多重 SOA 调用多重 EAI 应用程序
多重 SOA 调用多重 EAI 应用程序

接下来,复合应用程序调用并向 Order Management System 发出请求来搜索 Pricing Policies 数据库。在成功搜索之后,Order Management System 将其本身与第二个 SOA 中的税务 Web 服务相连接。然后,税务 Web 服务被并入了第一个 SOA 的复合帐单功能中。所有装载及卸载的流程都成功地完成了,没有出现 SOAP 开销问题。







有多少 SOA?

您用于链接 EAI 应用程序的可用的 SOA 的数量依赖于对项目的复杂性、互用性问题、业务流程及装载性能问题的权衡。同您避免 SOAP 的开销一样,您需确保在整个开发周期中不会出现 SOA 超载问题。您应当在开发的每个阶段都进行超载测试。







结束语

使用 SOA 来消除企业系统之间的差异需要提前规划,设置需开发的 SOA 的数量限制。您应当同业务分析师及 IT 专家小组对于各种性能问题进行交流。您会发现使用 SOA 来消除 EAI 差异这种方法使您开发应用程序的工作变得更加容易。您可以将来源于一个或更多 SOA 的 Web 服务的业务逻辑结合成一个或更多的复合应用程序。分析师将会发现消除差异使得他们设计及分析 SOA 系统的工作变得更加容易。他们可以确定结合哪些 Web 服务能够达到最佳的性能,并且不会发生 SOAP 超载的问题。

posted @ 2006-04-17 03:09 wsdfsdf 阅读(146) | 评论 (1)编辑 收藏

在可用的分布式 SOA 中管理及发布服务引用和元数据

在分布式应用程序中正确的管理、发布引用及配置数据总是具有挑战性。面向服务的体系结构 (SOA)、实时及事件驱动处理 (7x24) 的使用使得这项任务成为主要的问题。在接下来的部分当中,Richard Whyte 将向您解释如何从您自己的策略管理解决方案的实现的关键设计点中受益。他也从提炼为最终建议的简单设计开始,为策略管理服务的一个版本勾勒了框架,并使其成为可能的解决方案。

引言

各公司也正在寻找他们使用及控制技术的方式的改进。业务流程管理(BPM)及面向服务的体系结构 (SOA) 是使得业务灵活、增强业务控制及风险管理的关键,并在业务完成主要功能的方式上创建新的机会。

端对端或直接处理 (straight-through-processing,STP) 体系结构在其边界接收工作条目并在不影响控制的情况下控制其完成流程。这样的体系结构可以跨越单一部门、多业务线 (LOB) 或商业组的成员。新的挑战迫使业务及技术优势被部分的偏移。

关键的挑战是在大型的、高可用性的 SOA 实现中有效的引用及配置数据发布。可以通过调查工作量的性质来突出这一点。例如,SOA 需要供给多业务流程。SOA 为不同阶段(秒、日、周或年)控制每个流程实例(工作条目),并需要各种资源来完成。条目流由必需使用通用规则及参考数据处理的组工作条目来创建。

本文讨论配置、引用及业务规则发布的解决方案。策略管理是确保策略的服务能被正确、及时及准确通知的动作。它是一种系统开销,所以必需要操作简单、高效和经济的。

术语策略数据 (policy data)指做业务或技术决定的所有数据类型。在某些情况下错误的、过时的或不完全的数据是可以接受的但在其他情况下则不可以接受。策略设置的可见性是严格的。例如,没有时区的时间戳在单一地区的情况下可以接受,但在多地区环境中却不能。

为达到本文的目的,策略是由单一单元管理及检索的一套指定的数据条目(设置)。设置名在策略中是唯一的但可能存在于多个策略中。

策略是确定的路线或从选择物中选择动作的方法,并在给定条件的指引下指导及确定决策。例如,业务策略规定报酬低于 5,000 USD 不作为舞弊检查的对象。这里的规则及值(5,000 USD)就是策略数据。例如,如果 USD(<Item.Value>) 大于 <Policy.Value>,那么 Do-Fraud-Check







策略管理显示

策略管理解决方案(PMS)显示为 SOA 提供中央管理策略数据服务。该解决方案负责 SOA 中所有元数据。它提供:

  • 单点控制
  • 相容接口
  • 检测及保护数据恶化
  • 准确的、完全的及同步的(及时的)为需要它的任何服务发布策略数据
解决方案的主要原则是:
  • 服务保留响应性和对其策略的控制,但是将管理和保留的职责委托给了专用的 PMS。这将可以确保不用复杂的配置改变而向 SOA 中添加或从其中移除服务。由于服务总可以从策略服务中恢复策略,所以他们可以存在于非错误容忍的硬件设备上。元件失效并不导致需要恢复配置信息,以及个性化服务组建可以安全的聚焦于业务及当前工作上而不是策略上。
  • 工作条目“请求”使用策略的版本而不是服务拥有版本。这确保服务可以确信他们使用正确的策略,而不需要进行远程版本检查。 可以在任何给定时间激活策略的新老版本,并可以保证任何服务分别为工作条目选择正确的策略。这也支持服务使用不同的策略需求同时处理不同工作流中的工作条目(隔离工作流)。
  • 不变策略版本及检查策略数据完整性的能力支持分布及响应环境的优化。它也允许服务的所有实例应用策略版本,而不用考虑其周围环境。
  • 通过实现责任的明确划分及清除的、明确的所有权保存,解决方案陈列出一致的策略语法及语义、查看跨多服务策略的能力、简化的实现及保管成本。
  • PMS 负责管理及分发策略信息,但并不拥有所有策略数据,它只保留个别(客户端)服务的属性信息。集中管理允许对策略进行测试、控制改变及将其作为单独单元移植到产品中。IT 简化了启动新服务实例的配置步骤并保证那个服务使用一致的名字及类型管理模式。结果是使用专一的、简单的管理接口。
  • PMS 应当将它本身及客户端应用程序间的代码或操作连接最小化且不能损害独立性或封装性(如,Java™ 对象版本)。它也不能创建操作依赖性,如争用或单独点故障。
  • PMS 提供了可调用的管理接口。这创建了分层的解决方案,它可以权衡 SOA 用户交互解决方案(浏览器、门户及 Eclipse)。这个方法让 SOA 为所有服务提供一致的用户接口。要简化最初的开发及部署,可能要提供简单的控制台,在公布的管理应用程序编程接口(API)中使用服务。此方法不向服务中添加任何限制。







开发解决方案

解决方案开发开始于数据结构及创建操作、维护及分发策略数据的软件。这个解决方案从一个简单的解决方案发展而来,调整以适合新的问题并根据需要添加功能。结果是该解决方案在不损害 SOA 或导致额外操作成本的情况下满足需求。


图 1. 策略管理开始于软件的编码
策略管理开始于软件的编码

以结构及灵活性为代价换来了最佳性能。由于环境变得很复杂,识别及改变策略的工作也变得费力甚至是冒险。在没有改变软件的情况下不能改变策略,并且没有源代码时也策略也不可见。嵌入式策略不能被共享,不支持引用数据,不适合封装解决方案。


图 2. 配置库中的策略设置
配置库中的策略设置

将策略设置放置在软件本地的配置库中使得他们更加可见并更容易更改及共享。本地存储很可能会提供合理的性能且不创建复杂的访问性及所有权问题。这解决了嵌入式策略的许多限制。本地库方法当应用程序想通过网络并彼此依赖来提供及时并准确的服务时会失败。在无权使用运行时环境或不了解特定主机上是如何存储及管理策略时,本地配置是不可见的。一般的问题是使用深奥的语法及语义表示配置,需要专门的控制台或简单的文本编辑器进行管理,或者是本地配置文件或数据库不是很容易的能支持企业级范围的引用数据。


图 3. 多实例服务及互关联分布系统
多实例服务及互关联分布系统

多实例服务及互关联分布式系统创建过多的所有本地配置的同步。共享库通常是发布的模式数据库。引用及配置数据使用复制技术存储于数据库中。应用程序使用 SQL 查询访问数据。

这个解决方案在策略库与使用它的应用程序之间有很强的依赖性。在没有改变的情况下,模式不能改变且数据库不能移植到所有的应用程序中。用户名及密码经常存储于各自的应用程序中,但不能在常规基础上进行改变并且也不安全。

数据所有权、性能问题及单点故障还有更多普遍的问题都存在于这个解决方案中。性能及可用性方面可以通过创建多的、同步的库映像来解决。然后需要通过负载均衡避免争用。

复制从一个库将数据操作(插入、更新、删除)复制到另一个仓库。使用从数据库日志文件或数据库触发器触发的存储并发送 (store-and-forward) 技术将操作发送给复制。标准的复制模型是可升级的且提供使用异步传输的“某时”仓库的同步。它不保证“时间点 (point-in-time)”同步。

这个 PMS 版本需要所有服务在任意时刻都使用正确的策略,作为解决方案放弃复制其自身。

同步复制使用分布式事务处理管理复制数据操作,(几乎)同时的作为工作单点,将操作应用到所有复件。一个的失败导致所有的失败。不幸的是,这项技术操作费事且不可划分。错误修正、添加、移除及初始化同步复制都是费事的,且相关操作创建实例间的紧耦合。

轻量级目录访问协议 (LDAP)是正式的目录访问协议。实现一般地提供内建的分布式系统,它可以通过跨企业及网络来实现。LDAP 提供基于标准的层次数据结构,它允许非安全认证应用程序访问,或通过提供存储于他们自己目标记录中的认证访问。这个基本的模型对 PMS 发布显示很有用处。它没有依赖于简单数据库方法的用户名及密码的依赖,而是提供可扩充的文档模式。LDAP 使用复制将数据入栈到它的复件中,它不支持服务选择特定的记录的修正。

事件驱动发布是一种解决方案,它依赖于更新记录的组件登记。这个解决方案不适合那些需要旧策略并将责任推给应用程序的工作条目。入栈技术本身可能不提供显示需要的准确度。

数据发布检查点

没有从最终容器返回有意义反馈的数据入栈的复制不能保证每个服务应用正确给定工作条目的策略版本。服务依赖他们本地库的更新速度,分布式库及高性能 SOA 增强同步延迟及错误策略应用程序的水平。仍留有问题:解决方案如何保证每个服务每次都使用正确的策略修正?解决方案如何保证它包括所有新的及以前的策略版本,并且它能在发布及响应环境中进行操作么?

PMS 需要工作条目请求特定的版本以允许服务检查其是否有正确的版本。这个方法可以为旧的及非常新的策略工作。

现在服务可以显式请求正确的版本。可以使用复制将其重新移入分布缓存中,策略修正请求保证服务使用正确的版本。

第一个结构原则是:将每个工作条目标记上正确的策略修正







标记工作条目


图 4. 标记工作条目
标记工作条目

原则没有说明如何完成正确策略修正每个标记工作条目。操作是使用需要运算法则来确定正确版本的一般标签来标记,或使用显式的策略修正信息来标记。

常规标签是从信息的固有数据或从为策略管理的单独目的而添加的专用的标签中创建的。

固有标签使用现有数据(例如,日期及时间)并向属性添加含意。添加的含意对维护工程师及操作人员不会立即变得明确。使用这个方法,就会限制额外内容的灵活性,操作(如,改变已应用的策略版本)也会受到损害。

专用(非固有)标签经常从生成器容易获得的信息中生成。这简化标签的生成,但需要查找算法来找出正确的修正或版本。查找可能确定最新的修正,在这之前一天的,两天之间的或后一天的。这些算法实现起来复杂,当需要的实际修正不在库中或不符合应用的算法时,查找就会失败。算法会脱节于从任何特定修正的显式请求,他们销毁需要的及不适合的反馈。

显式标签描述对单一显式策略修正的直接连接。添加他们只是为策略管理的目的。

SOA 包含许多服务,每个服务中都定义有一个或多个策略且以不同的级别修正。如果解决方案列出工作条目需要的所有策略修正对,那么该解决方案就会变得臃肿且易于出错和变得混淆。这个方法强制这个标记类型假设每个工作条目需要每个服务及策略。

通过创建及存储指定的共同工作的策略修正列表,您可以在 SOA 中创建所有策略的一套相应的特定的修正。然后就有可能用这套策略修正的名字作为显式标签而不是作为列表本身。第一个实现原则是:使用策略集合在结构的入口处分别标记每个工作条目。

策略集合


图 5. 映射到策略的策略集合
映射到策略的策略集合

将每个策略的一个版本放置在指定的集合中创建策略集合。标记为策略集合的工作条目与那些策略修正有直接的关系。没有必要将每个修正都列入工作条目中,需要的标签的数目减少到一个。标记为相同策略集合的工作条目(工作流)组以一致的及可预测的方式使用相同的策略及流程。

服务可以使用策略集合及策略名显式的请求他们需要处理的这个工作条目的策略版本。

策略的一个版本可以存在于许多策略集合中,但一旦它被部署在一个集合中就不能再对其进行修改。对策略的“更新”导致生成及更新了一个新的策略版本。.

通过使用检查或数字签名,易于区分 key-not-found(缓存不完全)与 invalid-key(不进行远程请求,他们就不会知道彼此)之间的不同,您可以检查改变及策略的完整性。例如,使用排序代码和银行账户号码访问客户的简介。如果没有找到,使用排序代码取得该客户的默认信息。

成功的策略及策略集合部署确保取得的使用策略名及策略集合的策略总是正确的,没有过多的开销或当缓存时没有缓存合法性问题。

策略所有权及域

策略是特定服务的独有职责及属性,但可能被那个服务的所有实例所使用。这个限制保护执行的独立性及简化变更管理。要保护这个清楚的划分,PMS 需要提供防止其他小组对策略更新的控制。属于重实现或不赞成的服务的策略可以被废弃以保护解决方案的长期合法性。

一个服务需要用其他服务注册的情况确实存在(例如,使用报告执行服务注册报告)。有利的方面是,所有权限制澄清了事件的状态。首先,报告清楚的保留第一个服务的属性及职责并被放置在服务的策略当中。PMS 需要报告执行服务访问那个策略设置的机制。

域是类或类型并表示数据的规则、语法及语义(例如,它必需是整型、浮点型、图片类型等等)。域是分配给规则及格式的名字。

将域添加进策略设置使得策略管理员依据值并识别那个值属于已知的特定的域来增强那些域规则及格式。策略管理员可以使域允许服务定义新的域。名字及合法性规则是策略设置,域是,例如,PMS$DOMAIN

取得策略设置的通常的方式是从特定的策略集合中请求策略,并从特定的策略修正中产生所有的设置。PMS 可以通过允许客户端服务通过域名访问策略集合中的多个策略取得策略设置来实现一个服务通知另一个策略的能力。例如,Name = My ReportValue = "Report file + instructions."Domain= REPORT

由域来获取可以保留正确的所有权规则并可以防止不同服务策略间的交叉。它为服务提供简单的机制使用其他服务在保留所有权情况下注册构件。







实现意见

对已部署策略的更改会导致在新的策略集合中创建新的策略修正。新策略集合需要被显式的部署以供产品服务所使用。显式部署允许更改进行测试、控制及授权。部署检查所有策略及策略集合,标记他们为不可变。

服务连接 SOA 在接收工作前取得他们的技术策略,但从工作条目中取得策略集合。新服务不需要显式策略同步。

工作条目使用正确的策略集合单独标记。服务可以支持多并发策略且可以为每个工作条目准确的应用正确的策略。

当策略集合进入体系结构中,它就被分配给每个工作条目。策略集合是最新的集合、名字集或策略集合分配给特定的工作流。如果策略管理员支持策略集合请求,例如,允许 PolicySet = ""PolicySet = "WS$<Name>"PolicySet = "PolicySetName",处理相同工作流的不同网关不需要相互同步。

空白策略集合的工作条目被分配给指定的策略集合,通过第一个服务请求该信息。使用最新策略集合的名字,工作条目也被从那一点向前被标记。

以一个工作流标识符标记的工作条目,使用与命名策略集合相同的方式用工作流 ID 分解。如果工作流 ID 别名已经分配给了策略集合,请求可能会得到本地缓存的回绝。否则,请求救会被送到策略管理服务。服务为策略集合分配别名,以集合及影射作为回应。

如果不可变约束不合适,必需允许在任意时刻改变策略。如果由数据过期来管理刷新,就像 Web 页面情况一样,那么可以使用策略或策略集合内部的关键字,来通知任意的缓存,告诉他们数据可以保持多长时间的方式来实现。例如,PolicyCacheDirty 被设置为 "REALTIME",显示如果策略过期每次都使用 DateTime / DeltaTime 检查策略的改变。

当使用过期机制时,可以告知 PMS 使用另外一个关键字。例如 PolicyVersionChange 设置为“On Change”显示改变或新值的增加都会导致策略新版本的产生。







结束语

策略被组织为策略集合而发布。策略集合由许多属于单独服务的策略组成。每个策略都被命名并归属到版本控制中。不能改变已部署的策略,而且都使用了数字签以允许任何服务检查它的可靠性和完整性。工作条目通过指定策略集合指示活动策略。三个重要的方面包括:

  1. 可以使用不同的策略处理不同线程处理的多条目。
  2. 策略数据可以被复制或缓存,而且没有使用过期数据的风险。
  3. 工作条目为其自身请求正确的策略。

这确保工作条目取得他们需要的策略,并去除对同步服务策略缓存复杂模式的需要。

策略通过其单独的、专用服务、强制唯一的、一致的语法及域控制语义来构造、维护及部署。应用到工作条目的策略的预测为企业提供了强大的诊断及管理工具。

解决方案为业务提供了以受控及可追踪方式改变策略的能力,及在工业及联邦法律的约束下实现其公司的管理需要(Sarbanes-Oxley Act 2002)。

posted @ 2006-04-17 03:06 wsdfsdf 阅读(116) | 评论 (0)编辑 收藏

使用 Rational Application Developer 和 WebSphere Application Server 来加速基于 XML 的 SOA 的 JSF 开发——第 1 部分

本系列文章提出了加快基于 XML 的面向服务的体系结构(Service Oriented Architecture,SOA)应用程序表示开发的解决方案。这种解决方案包括 Eclipse 功能,可以生成静态类型的用于 XSD Schema 的服务对象数据(Service Data Object,SDO),并提供了在表示元素数据与 XML 数据相互转换中使用 SDO 的运行框架。

引言

松耦合、粗粒度的面向服务的体系结构(Service Oriented Architecture,SOA)应用程序围绕着 XML 数据交换(XML Data Interchange)开发,它常需要一些表示层的开发。这样的体系结构的基本需求是表示的绑定控制数据对象以及数据对象与 XML 数据的相互转换。用于表示开发的现有的框架(如 JavaServer™ Faces,JSF)使得数据能够在属性的表示元素与 Java™ bean 类的引用之间进行转换。在 XML 与数据对象转换实现的过程中最乏味的工作留给了开发者,通过使用第三方指定的框架或编写代码来实现。

这个包含五部分的系列文章提出了加快基于 XML 的 SOA 应用程序表示开发的解决方案,并包括 Eclipse 功能使得可以生成静态类型的用于 XSD Schema 的服务对象数据(service data object,SDO),以及使用 SDO 实现表示元素数据与 XML 数据之间相互转换的运行框架。

在该系列文章的第 1 部分中,我们将经历通过使用提供的插件集来向每个指定的 XML schema 中的服务传递信息的简单 JSF 应用程序的整个开发过程。本文中的应用程序场景进行了一次服务调用——发出一个 XML 请求及收到一个 XML 响应。这个应用程序说明了主从复合结构的数据对象视图,连同分页及分类的能力。本文还描述了应用程序在设计时和运行时的体系结构。

Rational® Application Developer V6 以及 Websphere® Application Server V6 需要利用这种转换功能。本文假定读者是精通 Rational Application Developer 的 JSF 页面设计师。







安装 XSD SDO 转换功能

  1. 下载文件xsdsdotransform-feature.zip 解压缩到您的 Rational Application Developer 安装的 rad\eclipse 目录下(例如,D:\IBM\RSDP\6.0\rad\eclipse)。
  2. 启动 Rational Application Developer(以下简称为 Application Developer)。
  3. 选取 Help => Software Updates => Manage Configuration(如图 1 所示)。
    图 1. 功能安装
    图 1. 功能安装
  4. 如图 2 所示使得 XSD SDO 转换功能生效,然后重启 Application Developer。
    图 2. 功能安装
    图 2. 功能安装
    您可以用 -clean 命令行参数启动 Application Developer 来确保该功能的配置更新。






XSD SDO 转换功能的内容

XSD SDO 转换功能包括用于从 XSD schema 中生成 SDO 包的工件,以及用于将 SDO 包实例转换到 XML 实例文件中或从 XML 实例文件中转换出 SDO 包实例的框架组件:

  1. 创建 SDO 包的动作
    在 XSD 资源中的这个动作从 XSD schema 中生成了 SDO 包(如图 3 所示)。
    图 3. 创建 SDO 包
    图 3. 创建 SDO 包
  2. dw.ibm.etools.xsd.sdo.xmltransformservice.XMLTransformServiceFactory 类
    该类提供了 API 用于将 SDO 包实例转换到 XML 实例文件中或从 XML 实例文件中转换出 SDO 包实例。(可利用 xsd_sdo_soa_part1_listings.zip 下载文件中的 XMLTransformServiceFactory.java 代码。)







场景

我们将要开发一个简单的保险应用程序场景,来说明主从复合结构的视图、分类以及分页功能。在该场景中:

  • 我们假设 XYZ 保险公司有许多已注册的代理人。
  • 每个代理人都有许多客户,并且每个客户都同代理人签订了许多策略。
  • 保险公司通过标准的 BrokerService 方案来展示代理人的服务。
  • 任何来源于代理人的信息都是按照清单 1 中定义的方案传递的 XML 请求或响应。(可利用 xsd_sdo_soa_part1_listings.zip下载文件中的 BrokerService.xsd 代码。)

清单 1. BrokerService.xsd

												
														<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http:///xyz.brokerservice.ecore"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
	targetNamespace="http:///xyz.brokerservice.ecore">
	<xsd:annotation>
		<xsd:documentation xml:lang="en">
   			Broker Service Schema for xyz.com.
   			Copyright 2004 ibm.com. All rights reserved.
  		</xsd:documentation>
	</xsd:annotation>
	<xsd:element name="brokerService" type="brokerServiceType"/>
	<xsd:complexType name="brokerServiceType">
		<xsd:sequence>
			<xsd:element minOccurs="0" name="broker" type="brokerType"/>
			<xsd:element minOccurs="0" name="error" type="errorType"/>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="brokerType">
		<xsd:sequence>
			<xsd:element minOccurs="0" ref="firstName"/>
			<xsd:element minOccurs="0" ref="lastName"/>
			<xsd:element minOccurs="0" name="loginName" type="xsd:string"/>
			<xsd:element minOccurs="0" name="loginPassword" type="xsd:string"/>
			<xsd:element maxOccurs="unbounded" minOccurs="0" name="client" type="clientType"/>
		</xsd:sequence>
		<xsd:attribute name="brokerId" type="xsd:string" use="required"/>
	</xsd:complexType>
	<xsd:complexType name="clientType">
		<xsd:sequence>
			<xsd:element minOccurs="0" ref="firstName"/>
			<xsd:element minOccurs="0" ref="lastName"/>
			<xsd:element minOccurs="0" name="dateOfBirth" type="xsd:date"/>
			<xsd:element minOccurs="0" name="currentAddress" type="addressType"/>
			<xsd:element minOccurs="0" name="permanentAddress" type="addressType"/>
			<xsd:element maxOccurs="unbounded" minOccurs="0" name="policy" type="policyType"/>
		</xsd:sequence>
		<xsd:attribute name="clientId" type="xsd:string" use="required"/>
	</xsd:complexType>
	<xsd:complexType name="addressType">
		<xsd:sequence>
			<xsd:element name="street" type="xsd:string"/>
			<xsd:element name="city" type="xsd:string"/>
			<xsd:element name="state" type="xsd:string"/>
			<xsd:element name="zip" type="xsd:string"/>
			<xsd:element name="country" type="xsd:string"/>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="policyType">
		<xsd:sequence>
			<xsd:element name="policyName" type="xsd:string"/>
			<xsd:element name="policyStartDate" type="xsd:date"/>
			<xsd:element name="policyEndDate" type="xsd:date"/>
			<xsd:element name="policyAmount" type="xsd:string"/>
			<xsd:element name="policyDescription" type="xsd:string"/>
		</xsd:sequence>
		<xsd:attribute name="policyId" type="xsd:string" use="required"/>
	</xsd:complexType>
	<xsd:complexType name="errorType">
		<xsd:sequence>
			<xsd:element name="errorCode" type="xsd:string"/>
			<xsd:element name="errorDescription" type="xsd:string"/>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:element name="firstName" type="xsd:string"/>
	<xsd:element name="lastName" type="xsd:string"/>
</xsd:schema>

												
										


图 4. BrokerService 方案模式
图 4. BrokerService 方案模式

在该场景中,我们开发了一个 brokerdetail.jsp JavaServer Faces JSP 页面。该页面发出代理人请求的详细信息(brokerDetailRequest.xml,如清单 2 所示),并收到包含所有代理人的客户及他们策略的响应(brokerDetailResponse.xml,如清单 3 所示)。每页显示一个客户的详细信息并且按名将他们的策略分类。


图 5. BrokerDetail 请求及响应消息流
图 5. BrokerDetail 请求及响应消息流

(代码如清单 2 和 3 所示,可 xsd_sdo_soa_part1_listings.zip 下载文件中获得。)

清单 2. brokerDetailRequest.xml

												
														<brokerService xmlns="http:///xyz.brokerservice.ecore" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<broker  brokerId="099-99-9999">
<loginName>narinder</loginName>
<loginPassword>makin</loginPassword>
</broker>
</brokerService>

												
										

清单 3. brokerDetailResponse.xml

												
														<brokerService xmlns="http:///xyz.brokerservice.ecore" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<broker brokerId="000-00-9999">
	<firstName>Narinder</firstName>
	<lastName>Makin</lastName>
	<client clientId="001-00-9999">
		<firstName>Dan</firstName>
		<lastName>Moore</lastName>
		<dateOfBirth>1967-08-13</dateOfBirth>
		<currentAddress>
			<street>113 Oak Pine St.</street>
			<city>Santa Clara</city>
			<state>LA</state>
			<zip>91929</zip>
			<country>US</country>
		</currentAddress>
		<permanentAddress>
			<street>123 Demi Lane</street>
			<city>Cary</city>
			<state>NC</state>
			<zip>22999</zip>
			<country>US</country>
		</permanentAddress>
		<policy policyId="L000000000">
			<policyName>Life</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>100000.00</policyAmount>
			<policyDescription>Life Insurance policy includes any 
				accidental damages.</policyDescription>
		</policy>
		<policy policyId="H000000000">
			<policyName>House</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>50000.00</policyAmount>
			<policyDescription>Home Insurance</policyDescription>
		</policy>
		<policy policyId="C000000001">
			<policyName>Car 1</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>15000.00</policyAmount>
			<policyDescription>Car Insurance - Ferrari 2004 - Primary 
				Car </policyDescription>
		</policy>
		<policy policyId="C000000002">
			<policyName>Car 2</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>5000.00</policyAmount>
			<policyDescription>Car Insurance - Lexus 2003 - Secondary 
				Car </policyDescription>
		</policy>
		<policy policyId="B000000002">
			<policyName>Restaurant</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>25000.00</policyAmount>
			<policyDescription>Business Insurance - Restaurant
				</policyDescription>
		</policy>
	</client>
	<client clientId="002-00-9999">
		<firstName>Tom</firstName>
		<lastName>Cross</lastName>
		<dateOfBirth>1970-11-11</dateOfBirth>
		<currentAddress>
			<street>113 Duke St.</street>
			<city>Shelton</city>
			<state>CT</state>
			<zip>08989</zip>
			<country>US</country>
		</currentAddress>
		<permanentAddress>
			<street>123 Lex Lane</street>
			<city>Fairfield</city>
			<state>NY</state>
			<zip>09833</zip>
			<country>US</country>
		</permanentAddress>
		<policy policyId="H100000000">
			<policyName>House</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>2000.00</policyAmount>
			<policyDescription>Home Insurance</policyDescription>
		</policy>
		<policy policyId="L100000000">
			<policyName>Life</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>100000.00</policyAmount>
			<policyDescription>Life Insurance</policyDescription>
		</policy>
		<policy policyId="C100000001">
			<policyName>Car 1</policyName>
			<policyStartDate>2004-01-01</policyStartDate>
			<policyEndDate>2005-01-01</policyEndDate>
			<policyAmount>2000.00</policyAmount>
			<policyDescription>Car Insurance - Camry 2004 - Primary 
				Car </policyDescription>
		</policy>
	</client>
</broker>
</brokerService>

												
										







应用程序设计流程

图 6 描述了该场景的应用程序设计流程。


图 6. 应用程序设计流程
图 6. 应用程序设计流程






运行时的体系结构

页面请求时,将发生(如图 7 所示):

  1. JSF 运行时调用 BrokerDetailRoot bean。
  2. BrokerDetailRoot 通过将 brokerDetailRequest.xml 发送到 BrokerService 来预载数据。
  3. BrokerService 发回响应作为 brokerDetailResponse.xml
  4. 收到的来自于代理服务调用的响应(作为 brokerDetailResponse.xml)被传递到 XMLTransformServiceFactory。
  5. XML 被转换成了包装在 BrokerDetailRoot bean 中的 SDO。
  6. bean 在 JSF 运行时被处理。
  7. JSF 运行时通过组合的数据给予控制。


图 7. 运行时的体系结构
图 7. 运行时的体系结构






实现解决方案

在下面的部分中详细地描述了实现这种解决方案的步骤:

  1. 引入项目转换
  2. 从 XSD schema 创建 SDO 包
  3. 创建基本的根 Java bean
  4. 创建代理服务根 Java bean
  5. 创建 JSF JSP
  6. 向页面数据中添加页面 BrokerDetailRoot bean
  7. 向页面代码中添加命令方法
  8. 创建页面上的控制并绑定到页面数据的 SDO 类型上
  9. 运行 brokerdetail.jsp

  1. 引入项目转换

    将项目转换 xsd_sdo_soa_xml_tutorial.zip 下载文件引入到 Application Developer 工作中。结果,下列文件将被引入(如图 8 所示):

    • XYZInsuranceEAR:企业应用程序项目,它包括作为模版或实用程序的所有其他项目。
    • XYZInsuranceWeb:动态 Web 项目用于所有能够创建 JSF JSP 页面的应用程序。该项目的 WebContent 文件夹包括 BrokerService.xsd schema 并且在 Schema 文件夹中含有实例数据文件。为了简单起见,本实例中 schema 以及 SDO 包都作为 WebProject 的部分。如果需要在多个 Web 项目中共享同一个 SDO,那么您可以为 SDO 包创建独立的 Java 项目。这个 SDO 包被构建在 XML Schema 所在的同一个项目中。
    • XYZInsuranceService:包括实现代理服务的 Java 类。该服务装载并发出了与服务方法请求相应的 XML 响应。提供这个基本的实现来模拟服务行为。它的实现超出了文章介绍的范围。
    • XYZInsuranceServiceProxy:包括用于调用代理服务的 ServiceProxy 的基本的实现。
    下面的部分描述了 XYZInsuranceWeb 项目的额外内容。


    图 8. 引入的指导项目转换
    图 8. 引入的指导项目转换
  2. 从 XSD schema 中创建 SDO 包

    在 Application Developer 中,右键单击 BrokerService.xsd,然后选择 Create SDO Package(如图 9 所示)。


    图 9. 创建 SDO 包
    图 9. 创建 SDO 包

    结果,将生成下面的工件(如图 10 所示):

    • xyz.brokerservicexyz.brokerservice.impl,以及 xyz.brokerservice.util 包括 SDO 及为了适合于 XSD schema 中定义的类型而构建的相关工具的 Java 包。
    • 框架 JAR 文件——xsdsdotransform.jar,它被添加到 EAR 项目并且 Web 项目的 JAR 依赖被相应地更新来建立运行时的类路径。


    图 10. 生成的 SDO 包
    图 10. 生成的 SDO 包

    包名来源于 XSD 中声明的定义在 schema 中的 targetNamespace(如图 11 所示)。


    图 11. TargetNamespace 声明
    图 11. TargetNamespace 声明
  3. 创建基础的根 Java bean

    brokerservice.root 包中创建 BaseBrokerServiceRoot.java(可从 xsd_sdo_soa_part1_listings.zip 下载文件中获得)Java 类作为所有页面根 bean 包装器的基本类。SDO 包的 schema 命名空间的注册工作在静态块中完成。运行时,检查 XML 实例文档的命名空间来在这个注册表中定位相关的 SDO 包:

    static{
    	EPackage.Registry.INSTANCE.put(
    		BrokerservicePackage.eINSTANCE.getNsURI()
    		, BrokerservicePackage.eINSTANCE);
    }
    

  4. 创建代理服务根 Java bean

    创建 BrokerDetailRoot.java(可从 xsd_sdo_soa_part1_listings.zip 下载文件中获得)Java 类,使其作为 BrokerDetail.jsp 页面的 bean 包装器。这个 bean 包装了 SDO 包,并使得 SDO 包的用法如同页面数据中的 Java bean。它也包括通过对请求的服务调用的响应来预载 bean 的方法:

    1. 创建方法
      在此实例中,该方法只是简单地返回了 XML 请求字符串,然而将其编码用来调用请求创建者服务(例如,由于需要审核的服务,所以向 XML 请求中添加适宜的头信息,等等)。

      protected String createBrokerDetailRequest(){
      	String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
      		<brokerService mlns=\"http:///xyz.brokerservice.ecore\"
      		xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
      		<broker brokerId=\"099-99-9999\"><loginName>narinder</loginName>
      		<loginPassword>makin</loginPassword></broker></brokerService>";
      	//you may also use the create/convert API to create a new request string
      	/*DocumentRoot docRoot = (DocumentRoot)
      		XMLTransformServiceFactory.INSTANCE.create(BrokerservicePackage.eINSTANCE.getNsURI());
      	BrokerServiceType bs = docRoot.createBrokerService();
      	xyz.brokerservice.BrokerType b = bs.createBroker();
      	b.setBrokerId("099-99-9999");
      	b.setLoginName("narinder");
      	b.setLoginPassword("makin");
      	request = XMLTransformServiceFactory.INSTANCE.convert((DataObject)b);
      	*/
      	return request;
      }



    2. 加载方法
      调用 XMLTransformServiceFactory 方法将代理的详细的响应 XML 转换成 SDO。

      protected void loadBrokerDetailResponse(String response){
      
      	DocumentRoot docRoot=
      	  (DocumentRoot) XMLTransformServiceFactory.INSTANCE.load(response);
      	brokerServiceRoot =  docRoot.getBrokerService();
      }
      



    3. 预载方法
      调用请求及处理响应的服务。

      protected void preLoadBrokerDetail(){
          String xmlData = createBrokerDetailRequest();
          String response =
          	BrokerServiceFactory.invoke(xmlData,
      		BrokerServiceFactory.BROKERDETAIL_REQUEST);
          loadBrokerDetailResponse(response);
      }
      



    4. sortByPolicyName 方法
      通过使用策略集中的名称将策略分类。

      public void sortByPolicyName(List listPolicies){
      	ObjectUtil.INSTANCE.sort(listPolicies,
      		BrokerserviceFactory.eINSTANCE,
      		BrokerservicePackage.eINSTANCE.getPolicyType_PolicyName(),
      		true);
      }
      



    5. dw.ibm.etools.xsd.sdo.xmltransform.util.ObjectUtil 助手类
      提供了框架代码来将列表分类。

      /**
       * Sorts the Objects in the list
       * @param list the instance of the EList containing EObjects
       * @param eFactory the instance of the SDO factory
       * @param sortBy the EAttribute to be used for sorting
       * @param desc true for descending sort, false for ascending
       * @return true if the order of objects in list is changed
       */
      public  boolean sort(List list, EFactory eFactory
      	, EAttribute sortBy, boolean desc);
      

  5. 创建 JSF JSP

    创建 JavaServer Faces JSP 文件作为 brokerdetail.jsp

    1. 在 Application Developer 中,打开 Web 站点向导,从面板中抛出新的页面,并将其重命名成 brokerdetail.jsp
      图 12. Web 站点向导
      图 12. Web 站点向导
    2. 在页面上双击并作为 Faces JSP 来实现它。
      图 13 brokerdetail.jsp
      图 13 brokerdetail.jsp

  6. 将页面 BrokerDetailRoot bean 添加到页面数据中

    BrokerDetailRoot bean 包装了由 XSD 生成的 SDO 类。该 Java bean 是自省的,并且页面数据以树的形式展示了 SDO 类型、属性及引用。下面的步骤用于将根 bean 添加到页面数据中:

    1. 在页面数据视图中单击右键,并通过选取 New => JavaBean 来添加新的 Java Bean(如图 14 所示)。
      图 14. 在页面数据视图中的新 java bean 菜单
      图 14. 在页面数据视图中的新 java bean 菜单
    2. 在 Add JavaBean 对话框(如图 15 所示)中输入 JavaBean 实例的名称作为变量——varBrokerDetailRootBean
      图 15. Java bean 属性
      图 15. Java bean 属性
    3. 选择 Finish。新创建的 bean 将显示在页面数据视图(如图 16 所示)中。
      图 16. BrokerServiceRoot java bean
      图 16. BrokerServiceRoot java bean

  7. 为页面代码添加命令方法

    编辑 BrokerDetail.java 页面代码文件并将下面的方法用作命令动作的方法。这个动作调用了页面根 bean 中的 sortByPolicyName 方法通过名称来为策略的显示数据分类。(被访问的 table2 控制被加到了下面的部分中。)您可以创建一个用于策略列表的参数变量,并且使用它而非通过 table 控制来访问该列表。

    public String doSortByPolicyNameAction(){
    	//table2 is the policy data table
    	//you may choose to add a param scope variable
    	//for policy list, instead of using the table control
    	getVarBrokerDetailRootBean().sortByPolicyName
    		((java.util.List)getTable2().getValue());
    	// returning empty string re-displays the same page with same data binding
    	return "";
    }

  8. 创建页面上的控制并绑定到页面数据的 SDO 类型上

    您可以设计页面的根数据并且使得页面编辑器为您创建基于已设计好的数据类型的控制,或者您也可以放弃个人控制并亲自绑定数据元素。为了简单起见,我们将使用页面编辑器来创建这些控制。创建数据表并与每个 SDO 类型绑定,创建输出文字字段并将其与每个属性及在这些类型中的单一值的引用相绑定。对于每个多值引用而言,需要创建并绑定嵌套的数据表。

    1. 从页面数据视图中拖动 broker SDO 并将其交付给页面编辑器(如图 17 和 18 所示)。
      图 17. Broker SDO
      图 17. Broker SDO

      图 18. 页面设计器
      图 18. 页面设计器
    2. Depth 属性决定了嵌套表格控制创建的深度。将深度设置为 5 可以自定义表格属性(如图 19 所示)。
      图 19. 数据表格属性
      图 19. 数据表格属性
    3. 为“客户”列表指定数据类型(如图 20 所示)。如果您希望将列表属性绑定到页面上的任何控制中去,就需要提供每个列表属性的数据类型。
      图 20. 客户集的对象类型
      图 20. 客户集的对象类型
    4. 通过取消选定 clientAsArray 属性来定制代理的设计属性(如图 21 所示)。
      图 21. 定制代理设计
      图 21. 定制代理设计
    5. 单击...,它显示在客户属性之后(如图 21 所示)并为“策略”列表指定数据类型(如图 22 所示)。
      图 22. 策略集的对象类型
      图 22. 策略集的对象类型
    6. 自定义“客户”设计属性并取消选定 policyAsArray 属性(如图 23 所示)。
      图 23. 自定义客户设计
      图 23. 自定义客户设计
    7. 选择 Finish。创建页面控制并将其绑定到根 bean 的元素中去(如图 24 所示)。
      图 24. 建立控制
      图 24. 建立控制
    8. 将您选择的页面控制添加到客户表中,并且设定每页显示 1 行(如图 25 和 26 所示)。
      图 25. 显示选项
      图 25. 显示选项

      图 26. 附加的页面控制
      图 26. 附加的页面控制
    9. 为政策数据表格添加命令按钮并将按钮的标签改成 SortByPolicyName(如图 27 所示)。显示政策数据表格的页脚,使您能够放置命令按钮(如图 28 所示)。
      图 27. 命令按钮
      图 27. 命令按钮

      图 28. 附加的命令按钮
      图 28. 附加的命令按钮
    10. 将命令按钮绑定到 doSortByPolicyNameAction 上(如图 29 所示)。如果没有显示“action”属性,那么将显示数据表格的所有属性。
      图 29. 将命令绑定到动作上
      图 29. 将命令绑定到动作上
      这里展示的分类机制是服务器端通过调用命令动作来分类的。基于您的需求,您可以选择在客户端实现这个分类。

  9. 运行 brokerdetail.jsp

    1. 在 Application Developer 中,右键单击 brokerdetail.jsp 并选择 Run On Server。(如果没有提示您启动服务器,那么先启动服务器,然后在运行页面之前向服务器中添加 XYZInsuranceEAR 项目。)
    2. 测试容器中页面的 URL 是(或者类似于):http://localhost:9080/XYZInsuranceWeb/faces/brokerdetail.jsp
      图 30. brokerdetail.jsp
      图 30. brokerdetail.jsp
    3. 对于客户而言,使用页面控制来控制页面。
    4. 选择 SortByPolicyName 命令通过名称来将政策分类。







结束语

在本系列文章的第 1 部分中,我们提出了加快 JSF 开发的解决方案用于基于 XML 的 SOA 应用程序。这个解决方案提供了 Eclipse 功能以及框架工具,在设计时可用其将 XML Schema 转换成包括静态服务数据对象的 Java 包,在运行时可用其将 XML 实例文件与这些 SDO 相互转化。SDO 包装成 JavaBean,连同 JavaServer Faces 一起被用于表示开发。本文也提供了对于基本的保险应用程序的场景开发 JSF 表示的通用步骤,包括主从复合结构的视图、分类及分页能力。

在该系类文章中的第 2 部分,扩展了第 1 部分中开发的解决方案,包括新建、更新以及删除的功能,包括用本地附加的变量及基本的转换来自定义生成 SDO。该文章将举例说明多 schema 模型、对于单一页面中多个请求及响应的场景,并且说明绑定 XML 数据的 JSF 下拉式控制。

在该系列文章中将介绍:

  • 第 3 部分将描述操作已生成的 SDO 以及自定义 XML-SDO 转换器的高级技术。它也提供了聚集方法(sun、mean、average 等)的工具,这些方法是对SDO 对象及集合的一般操作。
  • 第 4 部分重在使用 XSDO SDO 转换功能进行基于 XML 的 SOA 的 portlet 开发,为 JSR 168 portlet 新建的对象寻址、portlet 的参数传递,以及在任何其他 portlet 中的 portlet 动作上动态地设置对象 portlet 视图。
  • 第 5 部分将讨论使用 XSDO SDO 转换功能使 JSF 及基于 XML 的 SOA 的 portlet 应用程序局部化,并且提出基于首选地点显示的静态及动态内容。








下载

描述 名字 大小 下载方法
Download file 1 xsd_sdo_soa_xml_sample.zip 727 KB  FTP|HTTP
Download file 2 xsd_sdo_soa_xml_tutorial.zip 685 KB  FTP|HTTP
Download file 3 xsdsdotransform-feature.zip 727 KB  FTP|HTTP
Download file 4 XYZInsuranceEAR.zip 725 KB  FTP|HTTP
Download file 5 xsd sdo soa part1 listings.zip 8 KB  FTP|HTTP

posted @ 2006-04-17 03:04 wsdfsdf 阅读(429) | 评论 (0)编辑 收藏

SOA助企业激活传统应用

本文说明 SOA 如何帮助企业将遗留的软件和信息资产应用在新的业务系统中。

不知道您是如何定义将企业遗留的软件和信息资产应用在新的业务系统中这个过程的?我已经听过好几个说法了,包括:企业现代化(enterprise modernization)、旧资产转换(legacy transformation)、旧资产激活(legacy enablement)、旧资产现代化(legacy modernization)等等。我怀疑您听到的甚至更多种说法,但都是这些词语的排列组合,当然也许还有一些新词。在我列出的描述中,我喜欢第三个:旧资产激活(legacy enablement)。虽然对于某些人来说,"旧资产"(legacy)这个词有负面内涵,但实际上不应当是这样的。

旧资产软件是以前安装的软件以及十多年以前就有的软件。该软件很有可能正在运行关键的业务过程。它可能是企业在合并或并购之后进来的。当一个有没什么经验的厂商告诉您需要替换该软件时,可能正是这个过时的软件使您开怀大笑。

基本上来说,"旧资产"是指部署在基础结构中的现有IT资产。通常,它对业务有重要的价值。要想认识旧资产软件的重要性,请看这样的事实:据估计,目前存在2000亿行COBOL代码,而全世界70 %的业务数据是由COBOL应用程序处理的,并且每天要处理300亿个基于COBOL的交易。显然,这些程序都是可以利用的、非常有价值的资产。

在维护旧资产系统方面,存在成本和竞争力问题。大型部署大都是昂贵的,并且对新的或替换解决方案进行投资也会同样昂贵。这意味着,为了同时维护旧的和新的系统,可能有不必要的重复,而且从事开发任务的员工必须具备异常广泛的技能。

从业务和竞争力角度,我们可以用一个词来概括其要求:速度。业务需要迅速响应市场机会,并第一个推向市场。同时,业务需要可缩放、可靠和安全的生产性应用程序。单独依靠旧的或新的技术不可能获得成本有效、完整或足够灵活的解决方案,也就无法向客户交付所需的服务质量。在新旧技术之间需要有一座桥梁,它可以不断扩展现有资产,同时还能提供像Web服务这样的新技术。幸运的是,现在已经有了这样的桥梁,它称为"面向服务体系结构"(SOA)。

在SOA世界里,完成业务任务的方式是执行一系列"服务"以及具有良好定义的与服务的交谈方式的作业,还有良好定义的交谈取消方式。只要服务按期望的方式做出响应,并提供了他或她所需要的服务质量,那么,对用户来说,服务是如何实现的并不重要。这意味着,服务必须足够安全、可靠和快速。这样,在部署了多个厂商的软件和硬件的IT环境中,或者在一个现有资产与新的应用程序、集成技术或数据源混合在一起的企业中,SOA成为近乎理想的方式。

有很多企业和IT得益于使用SOA实现的旧资产激活。在业务方面第一位的需要是从现有资产和系统创造新的价值,通常这需要利用新的业务过程和复合的应用程序(例如,门户应用程序)来实现。SOA可以帮助客户实时地访问先前的批处理事务,由此提高做出业务决定的速度和准确性。通过SOA来重复使用关键业务数据和应用程序有助于提供更好的客户服务,从而提高这些客户保持率。

另一方面,SOA允许在重新确定关键过程和数据的方向时利用优异的服务质量。此外,SOA可以帮助您扩展并保护现有的旧资产投资和开发人员技能,同时帮助您与您的企业以及客户、伙伴和提供商所使用的其他系统建立更好的互操作性。

您可以更好地利用旧的和新的世界,以便在继续利用现有资产的同时利用新的技术进步。当您开始这样做时,您将逐步使您的企业更灵活、能够更好响应机会,更好地服务于您的客户,并改进您的操作。这就是我们称为按需生产型企业的内涵,并且SOA可以使您的旧资产基础结构以新的和更好的方式,继续为您工作。

posted @ 2006-04-17 02:54 wsdfsdf 阅读(99) | 评论 (0)编辑 收藏

七问 SOA

对于SOA,尤其是像开发人员和CIO等仍有若干关键问题需要回答。

Web 服务以及越来越多的面向服务架构(Service Oriented Architecture,SOA)已经在市场上投放了大量广告。两者都可以给企业带来广泛的短期和长期利益。但对于SOA,尤其是像开发人员和CIO等仍有若干关键问题需要回答。

问:SOA的前提是能够使应用程序像服务那样工作。软件如何像服务一样工作呢?

答:没有SOA,软件包是被编写为独立的(self-contained)软件,即在一个完整的软件包中将许多应用程序功能整合在一起。实现整合应用程序功能的代码通常与功能本身的代码混合在一起。我们将这种方式称作软件设计"单一应用程序"。与此密切相关的是,更改一部分代码将对使用该代码的代码具有重大影响,这会造成系统的复杂性,并增加维护系统的成本。而且还使重新使用应用程序功能变得较困难,因为这些功能不是为了重新使用而打的包。

SOA旨在将单个应用程序功能彼此分开,以便这些功能可以单独用作单个的应用程序功能或"组件"。这些组件可以用于在企业内部创建各种其他的应用程序,或者如有需要,对外向合作伙伴公开,以便用于合作伙伴的应用程序。

"服务"的概念是要使用与实施细节无关的标准化接口来构建这些"组件"。针对一套应用程序服务的Web服务描述语言文档,描述需要作为请求特殊服务(例如,"检查库存"功能可能需要零件数)输入来传输的数据名称和类型,并描述服务响应的细节(它可能返回表示库存中零件数量的一个整数)。

这些详细信息看上去好像与 Java、C++、COBOL 等中实施的功能相同,因此,服务的请求程序无需知道使用的何种语言,而且可以使用任何语言来编写请求程序。这就使一个平台上的服务可以和为另一个平台编写的应用程序集成。互操作性的关键是请求和响应消息,例如,使用SOAP消息发送,其消息使用 XML 编写代码。

问:请举例说明 SOA 如何使企业受益。

答:关键的优势是互操作性,可以使用任何平台之间的功能,而与编程的语言、操作系统和计算机类型等等无关。在上述示例中,"检查库存"功能可能已经编写为一个应用程序要求的服务,例如,监控库存并在需要时自动重新定购的服务,但我们后来发现,同样的服务无需修改即可用于支持由员工使用的基于 Web 的库存监控工具。

就内部而言,应用程序的重复使用是一项关键优势,因为它可以降低开发成本。服务的重复使用,其长期作用在于减少企业中冗余的功能,简化基础架构,从而降低维护代码的成本。通过按服务的使用者来组织应用程序,与传统的编程技术相比,我们获得一个要灵活敏捷得多的集成模型,使我们可以迅速修改业务流程模型。

就外部而言,为服务交互而详细定义的"合同"使业务合作伙伴之间的交互"自由联合",提供集成所必需的稳定性,并提供更改基层软件(underlying software)问题的一个解决方案。当保留了相同的消息格式时,支持该格式的软件只要仍然支持消息合同,则可以按需进行更改。只要它支持相同的消息格式,甚至可以使用另一种编程语言的实施来完全替换系统,请求程序无需更改。当消息合同不断发展而必须更改时,与相当困难的任务,即支持多个版本的程序 API 和文件格式相比,它使用版本控制(versioning),更容易作为过渡策略支持多个版本的应用程序。

这些是部分关键益处,还有许多其他益处。

问:SOA与Web服务以及SOA和网格计算之间是何关系。

答:SOA是一种面向业务应用程序系统的体系架构设计风格,但可以应用于其他系统,包括中间件技术,例如网格计算。

Web服务是可以用于创建SOA的一套标准。尽管没有Web服务标准也可能创建SOA(例如,在SOAP之前,人们已经在HTTP或JMS上使用XML来实现相似的结果),但运用Web服务标准却是我们目前针对与外部软件交互的最佳方法。

网格计算是一种系统管理策略,其目标是最大限度地减少硬件资源的使用。例如,当突然的需求溢出指定的服务器时,它可能临时将一些请求转向相对没那么繁忙的服务器。网格计算设计为一种面向服务架构(用于调整网格计算的服务叫做网格服务)。

随着我们转向SOA,我们将看到该方法用于支持各种其他新的系统功能。另外一个示例是自主计算伙子管理系统。事实上,SOA是Web服务高级功能的基础,例如WS-Trust和联合身份识别管理规范。

问:因为还没有通用互操作性标准,SOA最大的问题不仍然是供应商中心性(vendor-centricity)吗?

答:有一些基本标准正好适用于Web服务,它们可以用于实施面向服务架构。XML和XML方案分别自1998年和2001年就已成为标准。SOAP 1.2自2003年6月成为标准。UDDI在2003年夏天标准化。WS-Security在2004年4月成为标准。

除了著名标准机构(例如W3C和OASIS)支持的这些正式标准以外,许多"技术建议书规范"也被广泛接受,并作为事实标准得到充分支持。例如,直到 W3C完成WSDL 2.0为止,要求在其产品中支持Web服务的大多数供应商都支持WSDL 1.1规范。

事实上,目前大部分软件供应商对Web服务标准的支持,已导致使用Web服务来广泛实施SOA。

问:SOA如何影响SLA?而您如何让SLA适合您的SOA?

答:当前企业之间的SOA实施通常侧重于改善合作伙伴之间现有业务的效率。同样,性能保证的概念并不是像方便的互操作性和自由联合集成那样的问题,它们可以借助Web服务标准来实现。

当服务成为企业付费的产品时,对特定水平的性能或可用性的保证,以及其它服务质量注意事项具有更为重要的作用。我们可以想象这在将来会成为一个常见要求,正在进行这方面的工作以支持该模型。

问:我如何着手构建 SOA?

答:最佳的方法时开始构建较小的SOA,侧重于提高当前缺乏效率的交互性。例如,假设使用一个系统上需要重新键入到另一个系统的打印报告,将两个计算机系统紧密联系在一起,这会消耗时间、浪费成本,导致出错,而且数据无法保持罪行。可以设计一个简单的基于Web服务SOA项目,直接链接信息,将含更新的SOAP消息发送到合作伙伴系统,而不是打印报告。

开始简单的SOA使企业可以在作出大投资之前先衡量ROI,并在出现大的问题之前获得小改善的经验。

CIO在购买软件时应该询问供应商关于对Web服务和SOA的支持,作为一个重要的注意事项。应该检查新应用程序的开发,以便考虑是否某些应用程序功能可能需要用于其他目的,以及可以嵌入对Web服务标准的支持以支持重复使用。

最终要完成大规模的企业转型,可能需要通过建立企业服务总线(形成SOA的骨干网或神经系统)来开始该工作。然后以企业合理的节奏,将服务提供商何服务请求程序逐渐添加到ESB。随着IT的SOA的增长,ESB成为在服务水平上连接应用程序,并调节消息流量以提高效率和可靠性的一种有力方式。

问:管理SOA需要哪些新的服务管理技能?

答:在运用Web服务之前,因缺乏标准和自由联合的策略,合作伙伴整合受到严重限制。随着我们开始使用Web服务和SOA来整合合作伙伴,我们可以发现,使用业务合作伙伴所提供的功能的IT系统已经开始依赖于这些功能的可用性。我们从内部管理我们自己服务的可用性转向要求监视和管理(可能有许多)企业之间的可用性。这明显大大增加了管理IT系统的复杂性,但它也带来了巨大的价值,这就是为什么许多企业要转到这个方向的原因。

Web应用程序系统正在不断发展以支持Web服务标准。"Web服务分布式管理"或WSDM标准正在由OASIS开发,对Web服务管理提供标准化的支持,通过使用Web服务来实现对不同平台的管理,满足涉及独立业务实体的大规模SOA对分布式管理的要求。

posted @ 2006-04-17 02:53 wsdfsdf 阅读(112) | 评论 (0)编辑 收藏

仅列出标题
共19页: First 11 12 13 14 15 16 17 18 19