程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 集成醫療保健服務,第 2 部分

集成醫療保健服務,第 2 部分

編輯:關於JAVA

使用 Apache ServiceMix 作為 Healthcare Service Bus

Healthcare Service Bus (HSB) 使各種醫療保健應用程序互連和互操作從而交付高效的服 務。本文由兩部分組成,其中 第 1 部分  討論了通過使用 Java™ Business Integration (JBI) 體系結構對醫療保健服務進行聚合。第 2 部分將為您顯示如何使用一個開 源 JBI 實現 — Apache ServiceMix — 作為一個 HSB。您將配置應用程序作為已 托管的 ServiceMix 內部服務、學習如何互連多個 JBI 環境、並了解如何集成醫療保健互操作 性的行業標准到 ServiceMix。

通過連接各種醫療保健應用程序到 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 部分 的圖 4、5、6 和 7 所示。為 了實現 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 提供幾種隨時可用的攔截器並允許您 添加您自己的攔截器。攔截器從事特定的工作,您可以配置一系列攔截器來具體處理您的業務 邏輯需求。例如,您可以配置以下的攔截器鏈:

攔截器從服務客戶處接收服務請求並將其轉換為另一種格式。

另一個攔截器根據請求創建 Java 對象。

第三個攔截器調用業務邏輯並同請求調用一起傳遞 Java 對象。

另一個或少數攔截器可包含實際的業務邏輯。

第五個攔截器從業務邏輯應用程序處提取新的 Java 對象。

第六個攔截器將 Java 對象轉換為 XML 格式並向服務客戶發回響應。

我將不在本文中討論建立或配置 CXF 攔截器的具體細節。相反,我將使用一個簡單默認的 現成的攔截器組合,該組合可調用 Radiology Department 應用程序。

CXFSE 是一個可配置的包裝器,這意味著通過編寫一個 XML 文件您可以控制您的 SE 的行 為。接下來我將演示如何為 Radiology Department 應用程序的 CXFSE 編寫 XML 配置。但首 先,我將為所有需要在 ServiceMix 上托管內部應用程序(或服務)的操作提供一個高級計劃 。

托管 Radiology Department 應用程序為一個內部服務

在 ServiceMix 上托管內部服務的過程需要一些配置,我將這些配置分成以下五步:

為 Radiology Department 應用程序編寫並編譯包含業務邏輯的 Java 類,並公開該類作為 一個 Web 服務。

在 Spring 框架上配置 Radiology Department 應用程序的 Java 類,以便框架根據應用程 序需求實例化這些類並使它們可用。

為 Radiology Department 應用程序編寫一個 WSDL 接口。JBI 規范使用 WSDL 2.0 來定義 通過內部和外部服務提供商公開的服務接口。

為服務提供商(Radiology Department 應用程序)和服務客戶編寫 JBI 配置。(回憶在第 1 部分的 圖 6 上的 Prescription 應用程序,是一個服務客戶發送服務請求給 Radiology Department 應用程序。)

將 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() 方法有兩個參數:testDetails 和 testResults。正如您看到的,它們是 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。

就本文而言,我已經在 下載 中提供了一個 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 接口和綁定的詳細信息都超出了本文范圍。

在下載的 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 應用程序:

在您的計算機上下載並安裝 Apache ServiceMix 3.3.1。

通過雙擊 servicemix.bat 文件啟動 ServiceMix,您將在 ServiceMix 安裝的 ..\apache -servicemix-3.3.1\bin 文件夾中找到此文件。稍等片刻以便服務器啟動其服務。

從 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 頁面

 

現在請點擊頁面底部的 Send 按鈕並稍等片刻。Radiology Department 應用程序的服務客 戶接收請求、路由該請求到 NMR、然後通過 CXFSE 引擎到 RadiologyDepartment 類。然後 RadiologyDepartment 類產生響應。此響應一路游歷最終回到SOAP 客戶端。您將在與請求文本 框相應的文本框中看到此響應,如圖 2 所示:

圖 2. 在您的 SOAP 客戶端顯示的響應

 

互連 JBI 服務器

您已經看到如何配置 Radiology Department 應用程序作為內部服務提供商,以及如何從外 部服務客戶處調用它。現在我將演示如何配置兩個 JBI 服務器,以便連接到一個 JBI 服務器 的服務客戶可調用由連接到另一個 JBI 服務器的服務提供商所提供的服務。這種情況類似於第 1 部分的 圖 7,在那裡我討論了 JBI 服務器的互連。

比較第 1 部分的圖 4 和 7。圖 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 服務器是服務客戶。

這意味著您可以簡單地使用 Radiology Department 應用程序的配置作為第二台 JBI 服務 器。您只需要在第一台 JBI 服務器中配置一個外部服務提供商和一個客戶。

配置外部服務提供商僅僅意味著告訴第一台 JBI 服務器第二台 JBI 服務器是 Web 服務。 您只需要做兩件事:編寫類似於清單 2 和 5 的 Spring XML 配置文件,和類似於 清單 3 和 4 的 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 文件與清單 3 和 4 顯示的 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 服務器,請執行以下這些步驟:

在一台獨立的計算機上安裝 Apache ServiceMix 3.3.1。我嘗試用兩台計算機進行 JBI 服 務器的互連,一台用於第一台 JBI 服務器,另一台用於第二台 JBI 服務器。

通過雙擊您的 ServiceMix 安裝的 ..\apache-servicemix-3.3.1\bin 文件夾中的 servicemix.bat 文件啟動 ServiceMix。稍等片刻以便服務器啟動其服務。

從 sample2\JBI1 文件夾復制 RemoteRadiologyAssembly.zip 到您的 ServiceMix 安裝的 ..\apache-servicemix-3.3.1\hotdeploy 文件夾。一旦您復制文件,ServiceMix 將檢測正在 被部署的新應用程序並啟動部署流程,您將看到 ServiceMix 的輸出控制台。等待部署完成。

在您的浏覽器中打開與之前您用來測試 Radiology Department 應用程序相同的 client.html 文件。在 HTML 頁面的 Target 字段上鍵入 http://localhost:8092/RadiologyService。然後將與 清單 7 相同的 SOAP 請求輸入到 Target 字段下的文本框中。

單擊 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 接口。

來源: http://www.ibm.com/developerworks/cn/java/j-hsb2/index.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved