集成医疗保健服务,第 2 部分: 使用 Apache ServiceMix 作为 Healthcare Service Bus

互相连接托管医疗保健应用程序的多个 JBI 服务器

Healthcare Service Bus (HSB) 使各种医疗保健应用程序互连和互操作从而交付高效的服务。本文由两部分组成,其中 第 1 部分 讨论了通过使用 Java™ Business Integration (JBI) 体系结构对医疗保健服务进行聚合。第 2 部分将为您显示如何使用一个开源 JBI 实现 — Apache ServiceMix — 作为一个 HSB。您将配置应用程序作为已托管的 ServiceMix 内部服务、学习如何互连多个 JBI 环境、并了解如何集成医疗保健互操作性的行业标准到 ServiceMix。

Bilal Siddiqui, 顾问

Bilal Siddiqui 是一名电子工程师、XML 顾问,以及 WaxSys 公司的联合创始人之一,该公司专注于简化电子商务。自 1995年从巴基斯坦拉合尔工程技术大学毕业获得电子工程学位后,他就开始设计工业控制系统的软件解决方案。后来,他转向 XML 并运用在 C++ 方面的的编程经验构建基于 Web 和 WAP 的 XML 处理工具、服务器端解析方案以及服务应用程序。Bilal 还是一位技术推广者,常撰写技术书籍并出版。



2010 年 8 月 02 日

通过连接各种医疗保健应用程序到 Java Business Integration (JBI) 服务器,你可以为医疗保健构建一个企业服务总线(Healthcare Service Bus,HSB)。本文由两部分组成,其中 第 1 部分 介绍了 JBI、解释其构架、并讨论了它如何被用作一个聚合诸如 Prescription 应用程序、 Radiology-Department 应用程序和 Donor-Group 应用程序的 HSB。

第 2 部分将演示如何配置这些服务使 JBI 服务器可以作为 HSB 启动。我将向您展示如何使用 Apache ServiceMix(一个流行的 JBI 开源实现)作为 HSB。首先我将介绍 ServiceMix 和其重要组件之一。然后将描述如何使用该组件来配置应用程序作为已托管在 Apache ServiceMix 上的内部服务。第三部分将介绍如何互连两个 JBI 环境,以便连接到其中一个 JBI 环境的应用程序可与连接到另一个 JBI 环境的应用程序互连和互操作。最后一部分将提供一些有关如何集成 HL7(Healthcare Level 7,在 第 1 部分 中介绍的通用的医疗保健标准)功能到 JBI 的窍门。

介绍 Apache ServiceMix

Apache ServiceMix 可承载 JBI 应用程序,如图 第 1 部分 的图 4567 所示。为了实现 JBI 环境组件,ServiceMix 使用了流行的开源 Spring 框架(参见 参考资料)。您可以使用 Spring XML 配置在 JBI 环境内配置服务,这使得需要实例化的 Java 类简单明了。

除了实现 JBI 规范以外,ServiceMix 捆绑了一些有用的预配置组件,可直接在您的 JBI 应用程序中使用。回想第 1 部分中的 将内部和外部服务混合到 JBI 中,为了实现 Radiology Department 应用程序之类的内部服务,您需要 Service Engine (SE)。ServiceMix 提供各种可重复使用的 SE,您可以用它们来建立您的内部服务。对于本文,您将使用一个称为 CXF Service Engine (CXFSE)的 ServiceMix SE。

CXFSE 是一个开源 Apache CXF Web 服务框架的包装器。它使得您可以在 ServiceMix 应用程序中使用 Apache CXF 的功能。Apache CXF 允许您建立完全与内部业务逻辑集成的 Web 服务应用程序。CXFSE 有许多功能,使其适用于 HSB 之类的应用程序。

Apache CXF 使用了拦截器 的概念来与 Web 服务的业务逻辑集成 Web 服务前端(也就是说,在 Web 服务描述语言 [WSDL] 文件中定义接口)。CXF 提供几种随时可用的拦截器并允许您添加您自己的拦截器。拦截器从事特定的工作,您可以配置一系列拦截器来具体处理您的业务逻辑需求。例如,您可以配置以下的拦截器链:

  1. 拦截器从服务客户处接收服务请求并将其转换为另一种格式。
  2. 另一个拦截器根据请求创建 Java 对象。
  3. 第三个拦截器调用业务逻辑并同请求调用一起传递 Java 对象。
  4. 另一个或少数拦截器可包含实际的业务逻辑。
  5. 第五个拦截器从业务逻辑应用程序处提取新的 Java 对象。
  6. 第六个拦截器将 Java 对象转换为 XML 格式并向服务客户发回响应。

我将不在本文中讨论建立或配置 CXF 拦截器的具体细节。相反,我将使用一个简单默认的现成的拦截器组合,该组合可调用 Radiology Department 应用程序。要了解有关 Apache CXF 的更多信息,请查看 参考资料

CXFSE 是一个可配置的包装器,这意味着通过编写一个 XML 文件您可以控制您的 SE 的行为。接下来我将演示如何为 Radiology Department 应用程序的 CXFSE 编写 XML 配置。但首先,我将为所有需要在 ServiceMix 上托管内部应用程序(或服务)的操作提供一个高级计划。


托管 Radiology Department 应用程序为一个内部服务

在 ServiceMix 上托管内部服务的过程需要一些配置,我将这些配置分成以下五步:

  1. 为 Radiology Department 应用程序编写并编译包含业务逻辑的 Java 类,并公开该类作为一个 Web 服务。
  2. 在 Spring 框架上配置 Radiology Department 应用程序的 Java 类,以便框架根据应用程序需求实例化这些类并使它们可用。
  3. 为 Radiology Department 应用程序编写一个 WSDL 接口。JBI 规范使用 WSDL 2.0 来定义通过内部和外部服务提供商公开的服务接口。
  4. 为服务提供商(Radiology Department 应用程序)和服务客户编写 JBI 配置。(回忆在第 1 部分的 图 6 上的 Prescription 应用程序,是一个服务客户发送服务请求给 Radiology Department 应用程序。)
  5. 将 Radiology Department 应用程序打包为一个 JBI 服务程序集并将其复制到 ServiceMix 中。

在执行第 5 步之后,通过从 Prescription 应用程序(服务客户)发送消息到 Radiology Department 应用程序您将看到您的 HSB 在活动。

现在我将描述并演示每一步。

Radiology Department 应用程序作为一个简单的 Java 类

清单 1 显示一个名为 RadiologyDepartment 的简单 Java 类,其只有一个名为 performTest() 的方法:

清单 1. RadiologyDepartment
package com.hsb;

import javax.jws.WebService;
import javax.xml.ws.Holder;

import com.hsb.Radiology;

@WebService(serviceName="RadiologyService", 
   targetNamespace="http://hsb.org/radiology-department", 
   endpointInterface="com.hsb.Radiology")

public class RadiologyDepartment implements Radiology {

    public void performTest (Holder<String> testDetails, Holder<String> testResults)
    {
       System.out.println ("
           RadiologyDepartment.performTest()- > TestDetails:"+testDetails.value);
       System.out.println ("
           RadiologyDepartment.performTest()- > TestResults:"+testResults.value);
    }
}

performTest() 方法有两个参数:testDetailstestResults。正如您看到的,它们是 Holder <String> 类型。Holder 是一个通过基于 XML 的 Web 服务(XML-Based Web Services,JAX-WS)定义的类。CXFSE 使用 JAX-WS,可以方便地使用此类的实例来与您的 Java 类交换信息。Holder 类有一些插入数据到其实例并从其实例中提取数据的方法。CXF 框架在内部将来自 XML 请求消息的数据填充到 Holder 对象并传递 Holder 对象到 Radiology Department 应用程序的 Java 类。

严格地说,为了简便起见我将 performTest() 方法留为空(除了少数 System.out 语句外)。在实际应用程序中,performTest() 方法将被挂接到 Radiology Department 应用程序的业务逻辑上。

您需要编译 RadiologyDepartment 类。本文的 下载 中包含一个名为 sample1\RadiologyService 的文件夹,在这里您将发现 RadiologyDepartment 类的代码和一个已编译的类表。

您也需要生成适用于 XML 绑定的 Java API(Java API for XML Binding,JAXB)文件以对应 RadiologyDepartment 类。这些 JAXB 通过 JAX-WS API 使用,因为 Apache CXF 需要它们以便公开您的 RadiologyDepartment 类为一个 Web 服务。您可以使用一个名为 wsgen 的方便的工具来从您的 RadiologyDepartment 类中生成所有需要的文件。您将在 JDK1.6 安装的 ..\jdk1.6.0_12\bin 文件夹中找到 wsgen。(请查看 参考资料 来了解有关 wsgen 工具的更多信息。)

就本文而言,我已经在 下载 中提供了一个 ws.bat 文件。您可以运行 ws.bat 来生成所需的 JAXB 文件。也可以在 sample1\RadiologyService 文件夹中的资源和已编译的表中找到这些文件。

在 Spring 框架上配置 RadiologyDepartment

清单 2 显示了 RadiologyDepartment 类的 Spring XML 配置文件:

清单 2. Radiology Department 服务的 Spring XML 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:cxfse="http://servicemix.apache.org/cxfse/1.0">
    <cxfse:endpoint>
        <cxfse:pojo>
          <bean class="com.hsb.RadiologyDepartment" />
        </cxfse:pojo>
    </cxfse:endpoint>
</beans>

请注意 清单 2 上的根标记是 <beans>,是 Spring 的 XML 命名空间的一部分。<beans> 标记的作用是保持您应用程序的不同 Java beans (或 Java 类的实例)。在 <beans> 标记内您可以配置您的特定应用程序的 Java beans。Spring 操作 Java 类的实例并使这些类可用于需要使用它们的应用程序。您无需担心谁将实例化您的 Java 类和实例将如何彼此可用。这一切都是 Spring 要面对的烦恼。您只需在 Spring 中编写这些类并配置它们。

清单 2 中的 <beans> 标记包含 http://servicemix.apache.org/cxfse/1.0 命名空间的一个命名空间声明。ServiceMix 定义此命名空间,其目的是根据您的应用程序需求来指定 CXFSE 的行为。我将把这个命名空间称为 cxfse 命名空间。

cxfse 命名空间包含标记以准确地指定您想使用 CXFSE 做什么。有几种选择。您可以从 清单 2 中看到根 <beans> 标记包含一个属于 cxfse 命名空间的 <endpoint> 标记。<endpoint> 标记是一个通信通道的开始或结束。

为了对端点有一个全面的了解,可以参考第 1 部分的 图 6,在那里 Prescription 应用程序发送消息给 Radiology Department 应用程序。Prescription 应用程序和 Radiology Department 应用程序都是端点。消息源于 Prescription 应用程序,通过各种 JBI 环境组件 — 如 Binding Component (BC)、Normalized Message Router (NMR) 和 SE — 最终结束于 Radiology Department 应用程序。

您正在 清单 2 中配置 Radiology Department 应用程序,因为您直接在 <beans> 标记内使用 <endpoint> 标记。这将告诉 ServiceMix 您正在配置一个端点。

端点可以有几种类型。例如,一个端点可以是在一个序列中从事几项工作的一系列拦截器(如您在 介绍 Apache ServiceMix 部分中看到拦截器链)。但为了简单起见,在本文中我使用的是一个简单的 Java 类(RadiologyDepartment 类)。简单 Java 类的实例通常被称作 Plain Old Java Object (POJO)。cxfse 命名空间包含一个名为 <pojo> 的标记,位于 <endpoint> 标记内以指出此端点只是一个简单 Java 类的实例。

最终在 清单 2 上,您可以看到一个 <bean> 标记,是 Spring 命名空间的一部分且指定充当端点的 bean (一个 Java 类的实例)。<bean> 标记有一个名为 class 的属性,指定完全合格的类名(即,com.hsb.RadiologyDepartment),这些类名的实例将成为端点。

您将发现在 清单 2 中显示的 Spring XML 配置文件与 下载 中 sample1\RadiologyService\ 文件夹内的 xbean.xml 文件一样。

为 Radiology 应用程序编写 WSDL 文件

清单 3 显示 Radiology Department 应用程序的 WSDL 接口:

清单 3. Radiology Department 应用程序的 WSDL 接口
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://hsb.com/" xmlns="http://schemas.xmlsoap.org/wsdl/" 
xmlns:tns="http://hsb.com/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://hsb.com/"
          schemaLocation="Radiology_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="performTest">
    <part name="parameters" element="tns:performTest"/>
  </message>
  <message name="performTestResponse">
    <part name="parameters" element="tns:performTestResponse"/>
  </message>
  <portType name="Radiology">
    <operation name="performTest">
      <input message="tns:performTest"/>
      <output message="tns:performTestResponse"/>
    </operation>
  </portType>
</definitions>

清单 4 显示 Radiology Department 应用程序的 WSDL 绑定:

清单 4. Radiology Department 应用程序的 WSDL 绑定
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://hsb.org/radiology-department" 
     name="RadiologyService" 
     xmlns="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:tns="http://hsb.org/radiology-department" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <import namespace="http://hsb.com/" location="Radiology.wsdl"/>
  <binding name="RadiologyDepartmentPortBinding" 
    type="ns1:Radiology" xmlns:ns1="http://hsb.com/">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" 
        style="document"/>
    <operation name="performTest">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="RadiologyService">
    <port name="RadiologyDepartmentPort" 
         binding="tns:RadiologyDepartmentPortBinding">
      <soap:address location="http://localhost:8092/RadiologyService/ "/>
    </port>
  </service>
</definitions>

您可以看到 Web 服务是简单的;其只包含一个带有一对参数的名为 performTest 的操作。WSDL 接口和绑定的详细信息都超出了本文范围。为链接到可详细解释 WSDL 的 developerWorks 文章请查看 参考资料

下载的 sample1\RadiologyService 文件夹中,您将发现在 清单 3清单 4 中显示的 WSDL 文件分别与 Radiology.wsdl 和 RadiologyService.wsdl 一样。

打包 Radiology Department 应用程序

您现在需要打包 RadiologyDepartment 类及其附带的 JAXB 类、Spring 的 xbean.xml 和适用于 Radiology Department 应用程序的 WSDL 文件为一个名为 RadiologyService.zip 的 .zip 文件。您将在 下载 的 sample1\RadiologyService\ 文件夹中发现所有这些文件。我已经为您在 sample1\ 文件夹中准备了该 .zip 文件。

配置并打包服务客户

您已经打包了您的 Radiology 应用程序,这是一个服务提供商。但是如果您没有在 JBI 服务器中配置服务客户,您将无法运行此应用程序。

在 JBI 中配置服务客户非常类似于您刚刚看到的构建提供商配置。您需要为客户端点编写 Spring XML 配置和 WSDL 文件。

适用于您的服务客户的 Spring XML 配置显示在清单 5 中:

Listing 5. 适用于服务客户的 XML 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
       xmlns:radiology="http://hsb.org/radiology-department">
    <cxfbc:consumer wsdl="classpath:RadiologyService.wsdl"
        targetService="radiology:RadiologyService" />
</beans>

您可以看到 清单 5 非常类似于 清单 2清单 5 使用 cxfbc 命名空间来代替您在 清单 2 中看到的 cxfse 命名空间。此处您使用 cxfbc 命名空间是因为客户需要 BC 而不是 SE。您可以回头查阅第 1 部分 图 6 的六个步骤,在那里您可以看到 Prescription 应用程序(服务客户)需要 BC,Radiology Department 应用程序(内部服务提供商)需要 SE。ServiceMix 为 CXF 应用程序提供 SE 和 BC 两种命名空间,您可以使用您喜欢的方式完全灵活地配置您的应用程序。

适用于服务客户的 WSDL 文件非常相似于 清单 3清单 4中的 WSDL 文件。您将在 下载 的 sample1\PrescriptionService 文件夹中找到这些客户配置。

您也需要将适用于客户的 Spring 的 XML 配置和 WSDL 文件打包为一个名为 PrescriptionService.zip 的 .zip 文件。我已经为您准备好了此文件。请在 下载 的 sample1\ 文件夹中寻找 PrescriptionService.zip。

将 Radiology 应用程序与 Prescription 应用程序组装在一起

您已经配置了两个服务单元,一个用于 Radiology Department 应用程序(服务提供商),另一个用于 Prescription 应用程序(服务客户)。现在您将组装服务单元到 JBI 服务程序组合中。

为了创建服务组合,您需要编写一个 JBI XML 配置,如清单 6 所示:

清单 6. 为 Radiology Department 应用程序服务程序集进行 JBI 的 XML 配置
<?xml version="1.0" encoding="UTF-8"?>
<jbi xmlns="http://java.sun.com/xml/ns/jbi" version="1.0">
  <service-assembly>
    <identification>
      <name>radiology-service-assembly</name>
      <description>Radiology Department Service Assembly</description>
    </identification>
    <service-unit>
      <identification>
        <name>radiology-service</name>
        <description>Radiology Department Service Provider</description>
      </identification>
      <target>
        <artifacts-zip>RadiologyService.zip</artifacts-zip>
        <component-name>servicemix-cxf-se</component-name>
      </target>
    </service-unit>
    <service-unit>
      <identification>
        <name>prescription-service</name>
        <description> Prescription Service Consumer</description>
      </identification>
      <target>
        <artifacts-zip>PrescriptionService.zip</artifacts-zip>
        <component-name>servicemix-cxf-bc</component-name>
      </target>
    </service-unit>
  </service-assembly>
</jbi>

根标记在 清单 6 中,名为 <jbi>,属于 JBI 命名空间(http://java.sun.com/xml/ns/jbi)。<jbi> 标记包含一个名为 <service-assembly> 的子标记,其在服务程序组合中包装了正在被部署的 JBI 服务的名称和描述以及各种服务单元。

<service-assembly> 标记有两个 <service-unit> 子标记。每一个 <service-unit> 子标记都代表一个单独的服务单元。您正在配置的只有 Radiology Department 应用程序和 Prescription 应用程序,因为您的服务程序组合中只包含两个 <service-unit> 标记,每一个应用程序对应一个。

每一个 <service-unit> 标记都包装了单元名、描述和服务单元的 ZIP 文件。您可以看到每一个 <service-unit> 标记内的 <artifacts-zip> 标记都包含一个 ZIP 文件名;它们为您在 打包 Radiology Department 应用程序配置并打包服务客户 部分的结尾处创建的两个 .zip 文件匹配文件名。RadiologyService.zip 文件用于 Radiology Department 应用程序,PrescriptionService.zip 文件用于 Prescription 应用程序。

您需要在 清单 6 中保存配置为一个名为 jbi.xml 的 XML 文件。我已经为您完成了这个文件,您可以在 下载 的 META-INF\ 文件夹中找到此文件。最终,将 META-INF\ 文件夹和两个 .zip 文件打包成 RadiologyAssembly.zip。我已经为您准备好了 RadiologyAssembly.zip;其在 下载 的 sample1\ 文件夹中。

RadiologyAssembly.zip 是最终的 ZIP 文件,其包含到目前为止您所完成的每件事情。

开发 ServiceMix 应用程序的技巧

本文的 下载 中包括一个 Tips.txt 文件,其在以下方面提供一些有用的技巧:

  • 为 ServiceMix 启用调试跟踪
  • 创建 ServiceMix 缓存
  • 重新部署 ServiceMix 组件

虽然您无需这些技巧来运行本文的示例应用程序,但是它们将有助于开发您自己的 ServiceMix 应用程序。

测试 Radiology Department 服务

执行以下步骤来测试 Radiology Department 应用程序:

  1. 在您的计算机上下载并安装 Apache ServiceMix 3.3.1 (请查看 参考资料)。
  2. 通过双击 servicemix.bat 文件启动 ServiceMix,您将在 ServiceMix 安装的 ..\apache-servicemix-3.3.1\bin 文件夹中找到此文件。稍等片刻以便服务器启动其服务。
  3. 从 sample1\ 文件夹复制 RadiologyAssembly.zip 到您的 ServiceMix 安装的 ..\apache-servicemix-3.3.1\hotdeploy 文件夹。只要复制 .zip 文件,ServiceMix 就将检测正在被部署的新应用程序。这将启动部署流程,您将会看到 ServiceMix 的输出控制台。等待部署完成。

ServiceMix 提供一个简单的基于浏览器的 SOAP 客户端,您可以使用此客户端测试您的 ServiceMix 应用程序。此客户端附带了几个捆绑了 ServiceMix 的示例应用程序。您可以在 ServiceMix 安装的 ..\apache-servicemix-3.3.1\examples\cxf-wsdl-first 文件夹中找到 client.html 文件。

在您的浏览器上打开 client.html 文件并在 HTML 页面的 Target 字段上键入 http://localhost:8092/RadiologyService。然后键入如清单 7 所显示的 SOAP 请求到 Target 字段下的文本框中:

清单 7. 请求 SOAP 消息测试您的 radiology 应用程序
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:hsb="http://hsb.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <hsb:performTest>
         <arg0>Test1</arg0>
         <arg1>Test2</arg1>
      </hsb:performTest>
   </soapenv:Body>
</soapenv:Envelope>

我已经在 下载 中将此 SOAP 请求消息作为 SOAPRequest.txt 文件提供。您可以从 SOAPRequest.txt 文件处复制 SOAP 请求并粘贴到 Target 字段下的文本框中。输入地址和 SOAP 请求后,client.html 页面将看起来如图 1:

图 1. client.html 页面
client.html 页面

现在请点击页面底部的 Send 按钮并稍等片刻。Radiology Department 应用程序的服务客户接收请求、路由该请求到 NMR、然后通过 CXFSE 引擎到 RadiologyDepartment 类。然后 RadiologyDepartment 类产生响应。此响应一路游历最终回到SOAP 客户端。您将在与请求文本框相应的文本框中看到此响应,如图 2 所示:

图 2. 在您的 SOAP 客户端显示的响应
在您的 SOAP 客户端显示的响应

互连 JBI 服务器

您已经看到如何配置 Radiology Department 应用程序作为内部服务提供商,以及如何从外部服务客户处调用它。现在我将演示如何配置两个 JBI 服务器,以便连接到一个 JBI 服务器的服务客户可调用由连接到另一个 JBI 服务器的服务提供商所提供的服务。这种情况类似于第 1 部分的 图 7,在那里我讨论了 JBI 服务器的互连。

比较第 1 部分的图 47图 4 显示服务客户和外部服务提供商连接一个 JBI 服务器。图 7 显示服务客户连接一个 JBI 服务器且提供商连接另一个 JBI 服务器,这两个 JBI 服务器彼此之间是互连的。

根据 JBI 的观点,两种情况是相同的。如果服务对于 JBI 环境是外部的,则无论该外部服务是直接地 连接 JBI 服务器还是间接地 通过另外一台 JBI 服务器连接。这表示,假如您想根据第 1 部分的图 4 连接您的医疗保健提供商,那么您根据第 1 部分的 图 7 所做的 JBI 配置也将正常运行。因此我将只在本文中显示 图 7 的应用场景并给您留下 图 4 的应用场景。

在这部分,您需要两台 JBI 服务器。第一台服务器有一个服务客户和一个外部服务提供商。第二台 JBI 服务器有一个内部服务提供商。如图 3 所示:

图 3. 两个 JBI 服务器,一个带有外部服务客户,另一个带有内部服务提供商
两台 JBI 服务器,一台带有外部服务客户,另一台带有内部服务提供商

第一台 JBI 服务器将认为第二台 JBI 服务器是外部服务。第二台 JBI 服务器将认为第一台 JBI 服务器是服务客户。

这意味着您可以简单地使用 Radiology Department 应用程序的配置作为第二台 JBI 服务器。您只需要在第一台 JBI 服务器中配置一个外部服务提供商和一个客户。

配置外部服务提供商仅仅意味着告诉第一台 JBI 服务器第二台 JBI 服务器是 Web 服务。您只需要做两件事:编写类似于清单 25 的 Spring XML 配置文件,和类似于 清单 34 的 WSDL 文件。

为第一台 JBI 服务器配置外部服务提供商

清单 8 包含适用于外部服务提供商的 Spring 配置:

清单 8. 适用于外部服务提供商的 Spring 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
     xmlns:radiology="http://hsb.org/radiology-department">
        <cxfbc:provider
            service="radiology:RadiologyService"
            endpoint="RadiologyService"
            locationURI="http://192.168.10.33:8092/RadiologyService/"
            wsdl="classpath:RadiologyService.wsdl" />
</beans>

您可以看到 清单 8 中的 <beans> 标记包含您在 清单 5 中看到的相同的 cxfbc 命名空间声明。那是因为在 清单 8 中,您正在配置外部服务提供商,而在 清单 5 中您已经配置了外部服务客户。无论何时您要配置外部应用程序(无论是提供商还是客户),您都要使用 cxfbc 命名空间。

还要注意 清单 8 包含一个来自 cxfbc 命名空间(就像 清单 5 中的 <consumer> 标记一样)的 <provider> 标记。<provider> 标记有各种指定外部服务详细信息的属性:

  • service:托管在第二台 JBI 服务器上的放射服务提供商的名称。
  • endpoint:监听服务请求的 Radiology Department 应用程序的 WSDL 端口。
  • locationURI:Radiology Department 服务的网络地址。此网络地址在第二台 JBI 服务器上。在我尝试此应用程序时,我的第二台 JBI 服务器正运行在一台计算机上,其网络地址是 192.168.10.33 且第二台 JBI 服务器的端口是 8092
  • wsdl:WSDL 文件的名称和位置。ServiceMix 会将服务的类路径解析到到 ZIP 文件的根目录。您可以从本文的 下载 中看到 WSDL 位于 sampl2\JBI1\RemoteRadiologyService 文件夹中。RemoteRadiologyService 文件夹的内容来自适用于此应用程序的 ZIP 文件的根。因此,我已经简单地编写了 classpath:RadiologyService.wsdl 作为 wsdl 属性的值。

此提供商服务的 WSDL 文件与清单 34 显示的 WSDL 文件一样。您将发现在 下载 的 sample2\JBI1\RemoteRadiologyService 文件夹中 清单 8 为 xbean.xml 且其附带的 WSDL 为 RadiologyService.wsdl。您需要将 RemoteRadiologyService 文件夹的所有内容打包为一个名为 RemoteRadiologyService.zip 的 .zip 文件。我已经为您准备了该 .zip 文件;您将在 sample2\JBI1 文件夹中找到它。

为第一台 JBI 服务器配置服务客户

第一台 JBI 服务器的服务客户的配置与您在 清单 5 中所做的完全一样,因此我将不会在这里重复该清单。您将在 sample2\JBI1\PrescriptionService 文件夹中发现作为 xbean.xml 文件的此客户配置。

您也需要一个附带客户配置的 WSDL 文件。此 WSDL 文件非常类似于 清单 3 中的 WSDL 文件。您将在 sample2\JBI1\PrescriptionService 文件夹中发现该 WSDL 文件。我也已经将 PrescriptionService 文件夹中的内容打包为 PrescriptionService.zip。

为第一台 JBI 服务器组装提供商和客户

第一台 JBI 服务器的两个 .zip 文件已经准备就绪。最后一步将要组装 .zip 文件到服务程序集。完整程序集的 JBI 配置文件如清单 9 所示:

清单 9. 完整程序组合的第一台 JBI 服务器的 JBI 配置
<?xml version="1.0" encoding="UTF-8"?>
<jbi xmlns="http://java.sun.com/xml/ns/jbi" version="1.0">
  <service-assembly>
    <identification>
      <name>remote-radiology-service-assembly</name>
      <description>Radiology Department Service Assembly</description>
    </identification>
    <service-unit>
      <identification>

        <name>remote-radiology-service</name>
        <description>Radiology Department Service Provider</description>
      </identification>
      <target>
        <artifacts-zip>RemoteRadiologyService.zip</artifacts-zip>
        <component-name>servicemix-cxf-bc</component-name>
      </target>
    </service-unit>
    <service-unit>
      <identification>
        <name>remote-prescription-service</name>
        <description>Prescription Service Consumer</description>
      </identification>
      <target>
        <artifacts-zip>PrescriptionService.zip</artifacts-zip>
        <component-name>servicemix-cxf-bc</component-name>
      </target>
    </service-unit>
  </service-assembly>
</jbi>

您可以看到 清单 9 的 JBI 程序集文件非常类似于 清单 6。您将发现 清单 9 中的 JBI 配置与 下载 的 sample2\JBI1\META-INF 文件夹中的 jbi.xml 一样。

最后,您需要将 jbi.xml 与 RemoteRadiologyService.zip 和 PrescriptionService.zip 文件一起打包为另外一个名为 RemoteRadiologyAssembly.zip 的 .zip 文件。我已经为您准备了此文件;您将在 sample2\JBI1 文件夹中发现它。

测试 JBI 服务器的互连

为了测试 JBI 服务器的互连,您将运行与您在 测试 Radiology Department 服务 部分所见的相同的 RadiologyAssembly 应用程序。这将作为您的第二台 JBI 服务器。

在我尝试此 JBI 互连时,我的第二台 JBI 服务器正运行在一台计算机上,其网络地址是 192.168.10.33。正如您猜到的那样,第一台 JBI 服务器的提供商应当知道第二台 JBI 服务器的网络地址。因此,对于第一台 JBI 服务器的提供商,此网络地址会在您的配置文件中显示在两个地方:

  • xbean.xml 文件上的 locationURI 属性
  • RadiologyService.wsdl 文件上的 <soap> 标记的 address 属性

如果您正从不同的地址运行第二台 JBI 服务器,您必须在这两个地方上做适当的改变。

为了运行第一台 JBI 服务器,请执行以下这些步骤:

  1. 在一台独立的计算机上安装 Apache ServiceMix 3.3.1。我尝试用两台计算机进行 JBI 服务器的互连,一台用于第一台 JBI 服务器,另一台用于第二台 JBI 服务器。
  2. 通过双击您的 ServiceMix 安装的 ..\apache-servicemix-3.3.1\bin 文件夹中的 servicemix.bat 文件启动 ServiceMix。稍等片刻以便服务器启动其服务。
  3. 从 sample2\JBI1 文件夹复制 RemoteRadiologyAssembly.zip 到您的 ServiceMix 安装的 ..\apache-servicemix-3.3.1\hotdeploy 文件夹。一旦您复制文件,ServiceMix 将检测正在被部署的新应用程序并启动部署流程,您将看到 ServiceMix 的输出控制台。等待部署完成。
  4. 在您的浏览器中打开与之前您用来测试 Radiology Department 应用程序相同的 client.html 文件。在 HTML 页面的 Target 字段上键入 http://localhost:8092/RadiologyService。然后将与 清单 7 相同的 SOAP 请求输入到 Target 字段下的文本框中。
  5. 单击 Send 按钮并稍等片刻。请求将转到第一台 JBI 服务器,经过其客户 BC、NMR、提供商 BC 到达第二台 JBI 服务器。第二台 JBI 服务器上的客户 BC 将接收该请求,通过 NMR 将其路由,然后到 CXFSE,最终成为 RadiologyDepartment 类,这将产生响应。通过两个 JBI 服务器返回到您的浏览器此响应将一直都在运动中,将在与请求文本框旁边的文本框中显示此响应。

将特定行业标准集成到 ServiceMix

您已经看到了如何集成各种服务到 ServiceMix。在本文中我所用的示例服务(Radiology Department 应用程序服务)是基于 WSDL 的。然而,正如我在第 1 部分的 用于互操作医疗保健的 XML 部分说明的,并不是所有的服务都基于 WSDL。它们也可以基于像 HL7 那样的特定行业标准。无论何时您想集成服务到 JBI,您都需要 JBI 组件,无论该服务是基于 WSDL 还是特定行业。

因为一般标准通常用作定义服务接口,因此 WSDL 可跨所有行业使用。这就是为什么您将发现许多基于集成到 ServiceMix 的 WSDL 的实现,和为什么 ServiceMix 要捆绑 Apache CXF 的原因。这不是 HL7 的情况。虽然 ServiceMix 网站已经宣称在将来的某个时候该项目将集成 HL7 支持到 ServiceMix,但是在编写本文时 ServiceMix 是不支持 HL7 的。

您可能遇到集成特定行业标准到 ServiceMix 的问题。所以在这里为了构建您自己的可在 ServiceMix 内工作的组件我将概述一个高级计划。

无论何时你要集成组件到 ServiceMix,您都需要控制从客户处响应服务请求的方式。ServiceMix 已经定义了接口,这些接口允许您控制特定行业 JBI 组件的行为,这正是您想要的方式:

ServiceMix 灵活性

ServiceMix 提供了几个用于实现您自己的组件功能的接口:

  • Component
  • ComponentContext
  • ComponentLifeCycle
  • ServiceUnitManager
  • InstallationContext
  • Bootstrap

请查看 参考资源 便获得官方 ServiceMix 文档的链接,在那里您将发祥这些接口的详细信息。

  • 您可以控制在您的组件被安装时将要做什么。例如,您可以在安装期间创建数据库表以便组件可以存储应用程序数据。
  • 同样,ServiceMix 允许您编写卸载代码,此代码可撤消或清除组件安装期间所产生的东西。
  • 您可以实现 ServiceMix 接口的方法来控制组件的启动和停止。启动组件意味着该组件已准备好接收消息;停止则意味着相反的情况。
  • ServiceMix 接口使您的组件能够学习并与其环境(也就是说,JBI 环境)进行互动。例如,你可以编写代码来告知那些通信对象将通过 NMR 被用于与您的组件交换消息。

也许对于集成 HL7 支持到 ServiceMix 最有效的策略就是使用开源 HL7 实现作为您的起始点。有一个名叫 HAPI(HL7 应用程序编程接口)的产品,此产品已可用(参见 参考资料)。您可以为 HAPI 设计一个轻量级的包装并在您的包装上实现 ServiceMix 接口。


下载

描述名字大小
本文的示例代码j-hsb2.zip232KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology, SOA and web services
ArticleID=503086
ArticleTitle=集成医疗保健服务,第 2 部分: 使用 Apache ServiceMix 作为 Healthcare Service Bus
publish-date=08022010