科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道在 WebSphere ESB 和 DB2 Version 9 pureXML 中使用行业标准数据格式

在 WebSphere ESB 和 DB2 Version 9 pureXML 中使用行业标准数据格式

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在面向服务的环境中,使用标准化消息格式正在受到越来越多的关注。消息格式在许多行业已得到标准化,这些行业包括保险、金融贸易、联邦政府以及其他一些行业。

作者:ibm 来源:ibm 2007年10月6日

关键字: WEBSPHERE DB2 IBM 中间件

  • 评论
  • 分享微博
  • 分享邮件

引言

许多行业在努力实现更高级别的标准化,以促进公司之间及其外部业务合作伙伴之间的相互交互和数据交换。为实现这一目标,各行各业都制定了特定于各自业务的标准,以保证各方之间信息的一致性,并确保遵守任何适用的法律和法规。例如,行业标准数据格式包括保险业的 ACORD、金融衍生行业 (financial derivative) 的 FpMLfinancial、金融贸易业的 FIXML、抵押业的 MISMO以及联邦政府应用的 GJXDM 及其他。制药业也在努力进行多方面的标准化工作,其中包括 Health Level 7 (HL7) 标准。HL7 的目标定位在多个领域和场景,每个标准在整个工作中都表示一个单独的构件。其中的一个示例是“结构化产品标记”标准,它是在本文中使用的示例标准。

业务场景

在美国,每种处方药都必须经过食品与药物管理局 (FDA) 的批准。在审批过程中,必须将有关药品的详细信息提供给食品与药物管理局,还必须提供所有可能的分销商信息,如药房、医院等。必须提供的确切信息在一个名为 HL7 结构化产品标记 (SPL) 的标准 XML 模式中描述,它是 HL7 标准的一部分。

该标准最初是以 PDF 文档格式进行描述的,该标准的当前版本定义了一个完整描述药物的 XML 模式,其中包括商标名称、类属名、剂量表、活性成分和非活性成分等等。包括的信息主要供医药公司向食品与药物管理局提出申请,以便得到对处方药的批准,食品与药物管理局要求必须以标准格式提供这些信息。后来公众可以通过注册获得这些信息,但各国的提供方式又各不相同。在美国,SPL 信息可以通过 National Library of Medicine 获得。因此,该标准除了作为一种有用的工具便于信息交换外,法律也强制要求遵守此标准,这也是该标准受到广泛支持的重要原因。

本文描述一个虚构的医药公司,介绍如何设置可供客户和食品与药物管理局访问的 Web 服务,以便获得其药品的 SPL 文档。符合 SPL 的实际数据存储在 DB2 Version 9 pureXML 数据库中。Web 服务通过企业服务总线 (ESB) 公开,后者使用 WebSphere ESB 产品实现。将这两种产品集成在一起有助于提供这样一个解决方案,即通过标准 Web 服务接口公开 SPL 服务。

尽管本文中的示例基于卫生保健行业的标准,但这种方法同样适用于所有基于 XML 的其他特定行业标准。





回页首


使用企业服务总线构建解决方案

ESB 可以向公司内部企业网络的内部和外部使用者公开一些虚拟的服务接口。这些接口之所以是虚拟的,是因为它们向服务请求程序提供的数据和功能与实际的服务提供程序所提供的不相同,无论是在协议、位置方面还是在数据格式方面都不相同。ESB 可以将服务提供程序提供的数据格式映射到请求程序,具体方法是通过直接转换实现(例如,使用 XSLT 样式表),或者使用从其他数据源检索的数据进行增补。如果必须向一些新的使用者提供现有功能或数据(可能需要支持某种标准),ESB 可以进行必要的处理而不会影响现有的应用程序。

在此虚拟的场景中,医药公司希望将其药品信息以上文描述的标准化 SPL 格式公开。此公司使用 DB2 Version 9 pureXML 存储实际数据,利用产品的内置支持来处理 XML 数据。该信息是通过 ESB 进行访问的,ESB 接收对 SPL 信息的请求,并将这些信息转发到内部服务,内部服务本身不处理这些信息,而是返回技术信息,使 ESB 能够从数据库中检索符合 SPL 的文档。图 1 显示了解决方案的体系结构。


图 1. ESB 体系结构
图 1. ESB 体系结构

在图 1 中,ESB 使用内部服务提供程序和 Web 服务接口在 DB2 pureXML 上检索 SPL 信息,然后将检索到的信息以 XML 文档的形式返回给请求程序。此外,ESB 还可以作为 Web 服务直接公开数据库的 XQuery 功能,而不必使用任何其他内部服务提供程序。内部服务的具体利用方式对请求程序是完全透明的,因为请求程序仅使用 ESB 提供的虚拟服务接口。

本文的其余部分将介绍如何构建此类解决方案,在该解决方案中,当 WebSphere ESB 中运行的中介模块从内部服务提供程序获得所需的 UUID 信息后,将显式调用 DB2 pureXML 提供的 XQuery 功能。





回页首


具体示例

图 2 中描述的示例是在 Industry Formats and Services with pureXML technology demonstration 的基础上构建的,该演示提供了一个 Web 服务包装,用于访问存储在 DB2 pureXML 中的 HL7 示例文档。我们将利用 alphaWorks Web 服务包装,并从 ESB 中介模块访问它。若要在存储于 DB2 pureXML 中的 HL7 文档上组合 XQuery,并将其传递到 alphaWorks Web 服务包装,您需要有一个药品 UUID。由于不能确定用户是否知道药品 UUID,因此另一个内部 Web 服务使用药品名作为输入并返回其相应的 UUID。这样,通过中介模块按顺序调用两个服务实现了以药品名作为输入的单个用户请求。通过这种方式,ESB 公开的服务接口隐藏了该解决方案的内部复杂性,其中包括在调用 alphaWorks 服务之前 XQuery 的组合方式。清单 1 显示了由 ESB 导出到使用者的服务的 WSDL 接口。(这里没有包括内部服务接口;它是一个相当简单的 Web 服务,该服务返回带有药品 UUID 的字符串。)


图 2. 具体的示例体系结构
图 2. 具体的示例体系结构

清单 1. ESB 导出的服务的 WSDL 接口

                
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions …>
  <wsdl:types>
    <xsd:schema …>
      <xsd:element name="getSPLInfo">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="medicationName" nillable="true"
		type="xsd:string"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="getSPLInfoResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="SPLDocument" nillable="true"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </wsdl:types>
    <wsdl:message name="getSPLInfoRequestMsg">
    <wsdl:part element="tns:getSPLInfo" name="getSPLInfoParameters"/>
  </wsdl:message>
    <wsdl:message name="getSPLInfoResponseMsg">
    <wsdl:part element="tns:getSPLInfoResponse" name="getSPLInfoResult"/>
  </wsdl:message>
    <wsdl:portType name="MedicationSPL">
    <wsdl:operation name="getSPLInfo">
      <wsdl:input message="tns:getSPLInfoRequestMsg" name="getSPLInfoRequest"/>
      <wsdl:output message="tns:getSPLInfoResponseMsg" name="getSPLInfoResponse"/>
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>

alphaWorks demo 演示了如何通过简单的方式(不使用映射)在 pureXML 数据库中存储和查询 XML(特别是行业格式,如 HL7)。还介绍如何通过 Web 服务、RESTful 服务、Atom Feed 和 Xform 来检索数据。本文仅使用 Web 服务选项。

alphaWorks 演示和举例说明如何创建一个通用服务层,以便通过公开一组简单的 CRUD(创建、替换、更新和删除)和查询服务来访问存储的消息。该演示使用 DB2 pureXML 列(XML 集合)来存储 XML 文档。如果 XML 格式的结构得到了改进,它仍可以继续存储在相同的表格中,而不用进行任何显著的修改,如重新映射。

alphaWorks Web 服务接口提供了多个检索方法。其中的两个检索方法是:

  • getXMLDocumentByKey:返回特定的 XML 文档
  • runxquery:在表中的 XML 文档上执行 XQuery 查询

本例使用后一个方法,该方法使用 DB2 pureXML 功能在数据库的 XML 列上执行 XQuery 查询。在中介模块中,此 XQuery 使用药品的 UUID 表示,并调用 Web 服务方法来检索匹配的药品文档。

清单 2 显示了 alphaWorks HL7 服务接口的部分内容。其中显示了要在 alphaWorks SPL 数据服务上调用的 runxquery 操作的定义。


清单 2. alphaWorks HL7 SPL 数据服务的 WSDL 接口演示

                
...
      <element name="runxqueryResponse">
        <complexType>
          <sequence>
            <element name="queryresult">
              <complexType>
                <sequence>
                  <element ref="tns:runXQuery"/>
                </sequence>
              </complexType>
            </element>
          </sequence>
        </complexType>
      </element>
      <element name="runxquery">
        <complexType>
          <sequence>
            <element name="query" type="string"/>
          </sequence>
        </complexType>
      </element>

  <message name="runxquerySoapInput">
    <part element="xsd1:runxquery" name="request"/>
  </message>
  <message name="runxquerySoapOutput">
    <part element="xsd1:runxqueryResponse" name="response"/>
  </message>

<portType name="theSoapPortType">
	…
    <operation name="runxquery">
      <input message="tns:runxquerySoapInput"/>
      <output message="tns:runxquerySoapOutput"/>
    </operation>
	...
</portType>
...

中介模块

您可以按名为 MedicationProjects.zip 的项目交换文件导入完整的示例,该文件可在本文的下载部分找到。下面介绍了部署和运行该示例的说明。

我们的实现依赖于 WebSphere ESB 中介功能来实现中介流,该中介流可实现描述的场景。中介流负责接口转换和服务调用;它调用内部服务来获得药品 UUID,然后使用药品 UUID 来调用 alphaWorks 服务,并向调用方返回结果 HL7 文档。


图 3. 中介模块
图 3. 中介模块

中介模块包含一个名为 MedicationSPLExport 的导出,并带有一个 Web 服务绑定和一个简单的接口。该模块还有两个导入,这两个导入都具有 Web 服务绑定:

  • MedicationServiceImport:此导入绑定到内部服务,以检索将用于执行 XQuery 的所需药品的唯一 ID。
  • HL7ServiceImport:此导入绑定到 alphaWorks SPL 数据服务,用来检索药品的 XML 描述(给定了唯一 ID)。

如图 3 中的组装图所示,中介模块还包含一个名为 InvokeHL7Service 的 Java Service Component Architecture (SCA) 组件,该组件表示用于调用 HL7 数据服务的自定义中介元素中包含的代码。下文还将谈到这一点。

元素的相互连接非常简单。需要说明的唯一连接是 InvokeHL7Service 和 HL7ServiceImport 之间的连接。此连接可让自定义中介在查找中使用服务合作伙伴的符号名称来调用相应的服务。换句话说,我们不必将被调用服务的端点地址硬编码到自定义中介中。

简言之,中介流的目标是调用请求路径上的一个内部 Web 服务,并使用从该服务获得的信息作为响应路径的一部分来调用另一 Web 服务。图 4 显示了中介流组件的请求路径。


图 4. 中介流组件的请求路径
图 4. 中介流组件的请求路径

XSLTranformation1 的目标是将 MedicationSPL 接口(中介模块向其客户端公开的接口)转换为中介接口(即内部 Web 服务的接口)。在转换中使用了一个常规 XSLT 样式表。在请求路径中,使用 MedicationSPL 中提供的名称调用内部服务来获得 UUID。返回的值为 UUID。然后将 UUID(为进行演示已对其进行硬编码)插入到要在响应路径中使用的服务消息对象,以便调用 HL7 SPL 数据服务。


图 5. 中介流组件的响应路径
图 5. 中介流组件的响应路径

中介流组件的响应路径如图 5 所示。此流程的目标是使用从内部服务返回的数据形成 XQuery 并调用 HL7 服务(使用自定义代码中介元素执行此操作)。此自定义中介元素的目的是获取内部 Web 服务(存储于 SMO 中)返回的值,使用该值构建 XQuery,并将其传递到 HL7 Web 服务。清单 3 描述了自定义中介元素的实现。


清单 3. 自定义中介实现

                
public DataObject mediate(DataObject input1) {

	System.out.println("In Response Mediation");
	System.out.println("invoke service and extract response payload");
	ServiceManager serviceManager = ServiceManager.INSTANCE;
	BOFactory bofactory = (BOFactory) serviceManager
			.locateService("com/ibm/websphere/bo/BOFactory");

	System.out.println("Before Locating Service After Getting Object");

	//(1) Building XPath while extracting the payload from the
	// incoming SMO input1.getString("body/GetStringResponse/GetStringReturn")

	String query = "XQUERY declare default element namespace \"urn:hl7-org:v3\";for 
		$doc in db2-fn:xmlcolumn('DB2INST1.HL7.DOCUMENT')/PORP_IN000001
		where $doc/receiver/device/id/@root=\""
			+ input1.getString("body/GetStringResponse/GetStringReturn")
			+ "\" return $doc";
		
		
	//(2) Creating Elements for HL7 Service and setting it's payload to the Built Xquery
	DataObject runXquery = bofactory.createByElement(
			"http://schemas.ibm.com/hl7/hl7/hl7.dadx", "runxquery");
	runXquery.setString("query", query);
	System.out.println("After Setting Object");

	System.out.println("invoke HL7 service ");

	//(3) invoking the webservice by locating the service providing the operation name  
	// and passing in the newly created DataObject as the input Parameters 
		
	Service myService = (Service) ServiceManager.INSTANCE
	.locateService("theSoapPortTypePartner");
	DataObject Hl7Response = (DataObject) myService.invoke("runxquery",
			runXquery);
		
	System.out.println("Getting returned from HL7");

	DataObject Hl7ResponseOutPut = Hl7Response.getDataObject("queryresult");
		

	// (4)Adjusting Return Values for Polocies External
	DataObject message = bofactory.createByMessage(
			"http://MedicationSPLModule/MedicationSPL",
			"getSPLInfoResponseMsg");
	DataObject myRes = bofactory.createByElement(
			"http://MedicationSPLModule/MedicationSPL",
			"getSPLInfoResponse");

	myRes.setDataObject("SPLDocument", hl7ResponseOutPut);
	System.out.println("2");
	System.out.println(message);
	message.setDataObject("getSPLInfoResult", myRes);
	input1.setDataObject("body", message);
	System.out.println("leaving Response");

	return input1;
}

下面是对清单 3 中内容的解释:标为 (1) 的代码部分从内部 Web 服务返回的负载中解析 ID。然后使用该 ID 构建 XQuery 语句,该语句随后将用作 HL7 服务的输入。在代码部分 (2) 中,创建了 HL7 服务调用所需的元素,并设置负载以构建 XQuery。代码部分 (3) 使用中介的参考名来定位服务。这可以通过在中介模块的组装(上文已描述)中连接 InvokeHL7Service 和 HL7ServiceImport 来实现。此连接可以让自定义中介元素使用被调用服务的符号名。实际调用返回符合 HL7 的文档,我们将把该文档发送回整个中介的客户端,这在部分 (4) 中发生,在该部分中,我们将负载从 HL7 Web 服务的响应插入到中介的响应消息结构中。该代码然后将传入 SMO 中的请求消息替换为响应消息,使标头上下文中的任何信息都可以通过,而且省去了重新创建所有这些信息的工作。

实际运用

若要运行和测试应用程序,请从本文的下载部分导入 MedicationProjects.zip 项目交换文件。请确保导入了该文件中包括的所有项目;该文件中包含内部 Web 服务的一个实现以及与中介模块相关的项目。

本示例假定您的测试服务器运行于端口 9081。如果不是这种情况,则在将这些项目部署到服务器之前必须先更新相应的文件,使其指向正确的地址。

在导入项目并且更新了端点地址(如果需要)后,便可以启动测试服务器和添加新的 MedicationSPLModuleApp 和 MedicationWSEAR 项目(使用在右键单击服务器时出现的 Add and remove projects... 菜单选项)。

若要测试中介模块,请右键单击 MedicationSPLModule 项目中的 MedicationSPLExport_MedicationSPLHttp_Service.wsdl 文件(这必须在 J2EE 透视图中),并选择 Web Services => Test with Web Services Explorer。在 Explorer 中,输入任意字符串作为药品名来调用 getSPLInfo 操作(上文已提到,您输入的字符串将被测试实现忽略)。

图 6 显示了在运行本示例后的 Web Services Explorer。若要运行测试,您的系统必须连接到 Internet,因为中介将调用位于 alphaWorks 网站上的 HL7 服务。请注意,收到的响应文档包含一个完全符合 HL7 的 SPL 记录。


图 6. 测试完整的示例
图 6. 测试完整的示例




回页首


结束语

本文介绍了如何合并 WebSphere ESB 和 DB2 pureXML,以简化对根据特定行业标准存储的 XML 文档的访问。尽管本文中的示例使用的是基于 Health Level 7 (HL7) 的卫生保健标准,但描述的方法适用于其他所有基于 XML 的特定行业标准,如 ACORD(保险业)、FpML(金融衍生行业)、FIXML(金融贸易)、MISMO(抵押)以及其他行业。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章