医療サービスの統合: 第 2 回 Apache ServiceMix を医療サービス・バスとして使用する

医療アプリケーションをホストする複数の JBI サーバーを相互接続する

HSB (Healthcare Service Bus) により、多様な医療アプリケーションが相互に接続し、相互運用して効率的にサービスを提供できるようになります。この 2 部構成の記事の第 1 回では、JBI (Java™ Business Integration) アーキテクチャーを使用した医療サービスの集約について説明しました。最終回となるこの記事では、オープンソースの JBI 実装、Apache ServiceMix を HSB として適用する方法を説明します。ServiceMix でホストされる内部サービスとしてアプリケーションを構成し、複数の JBI 環境を相互接続する方法、そして医療業界での相互運用性のための標準を ServiceMix に統合する方法を学んでください。

Bilal Siddiqui, Consultant

Bilal Siddiqui は、電気工学エンジニア、XML コンサルタント、そして e-business の簡易化を専門とする会社、WaxSys の共同設立者でもあります。1995年に電子工学技術の学位でパキスタンのラホールにある University of Engineering and Technology を卒業した後、産業用制御システムを対象としたソフトウェア・ソリューションの設計を始めました。その後、XML に転向し、C++ のプログラミング経験を生かして Web ベースや Wap ベースの XML 処理ツール、サーバー側の構文解析ソリューション、そしてサービス・アプリケーションを作成しました。テクノロジー・エバンジェリストである彼が書いた技術書は、頻繁に発行されています。



2010年 6月 08日

各種の医療アプリケーションを JBI (Java Business Integration) サーバーに接続することによって、医療用のエンタープライズ・サービス・バス、HSB (Healthcare Service Bus) を構築することができます。この 2 回連載の第 1 回では、JBI とそのアーキテクチャーを紹介し、JBI を HSB として使用して、処方アプリケーション、放射線科アプリケーション、そしてドナー・グループ・アプリケーションを集約する方法を説明しました。

2 回目となる今回の記事では、JBI サーバーが HSB として機能し始められるように、第 1 回で集約した医療サービスを構成する手順を説明します。よく使われているオープンソースの JBI 実装、Apache ServiceMix を HSB として使用する方法を説明するため、まず始めに ServiceMix とその重要なコンポーネントの 1 つを導入します。そのコンポーネントを使ってアプリケーションを Apache ServiceMix でホストされる内部サービスとして構成した後、続く 3 番目のセクションでは 2 つの JBI 環境を相互接続し、それによって、一方の JBI 環境に接続されたアプリケーションが、もう一方の JBI 環境に接続されたアプリケーションと相互運用できるようにする方法を説明します。そして最後のセクションで、第 1 回で説明した HL7 (Healthcare Level 7) という医療業界で普及している標準の機能を JBI に統合するにあたっての助言をします。

Apache ServiceMix の概要

Apache ServiceMix は、第 1 回の図 456、および 7 に示したような JBI アプリケーションをホストすることができます。ServiceMix では JBI 環境のコンポーネントを実装するために、よく使われているオープンソースの Spring フレームワークを使用します (「参考文献」を参照)。Spring XML 構成ファイルを使って JBI 環境内のサービスを構成すれば、インスタンス化する必要のある Java クラスを容易に指定することができます。

JBI 仕様の実装に加え、ServiceMix には事前に構成済みの便利なコンポーネントがいくつかバンドルされています。この記事の JBI アプリケーションでは、これらのコンポーネントを直接使用することができます。第 1 回の「JBI での内部サービスと外部サービスの混成」セクションで説明したように、放射線科アプリケーションのような内部サービスを実装するには SE (Service Engine) が必要です。ServiceMix には、このような内部サービスを構築するために使用できる、各種の再利用可能な SE が用意されています。この記事では ServiceMix に用意された SE の 1 つ、CXFSE (CXF Service Engine) を使用します。

CXFSE は、オープンソース Apache CXF Web サービス・フレームワークのラッパーであり、この SE を使うことによって、ServiceMix アプリケーション内で Apache CXF の機能を使用できるようになります。Apache CXF を使用すると、内部ビジネス・ロジックが完全に統合された Web サービス・アプリケーションを構築することができます。多数の機能を持つ CXFSE は、HSB のようなアプリケーションで使用するには最適です。

Apache CXF は、インターセプターの概念を用いて Web サービス・フロントエンド (すなわち、WSDL (Web Services Description Language) ファイルに定義されたインターフェース) と Web サービスのビジネス・ロジックを統合します。CXF には、そのまますぐに使用できるインターセプターがいくつか用意されているだけでなく、独自のインターセプターを追加することも可能です。インターセプターはそれぞれに特有のジョブを行うため、インターセプターのチェーンを構成することで、ビジネス・ロジックがまさに必要とする動作を行うことができます。以下は、そのようなインターセプターのチェーンの一例です。

  1. 最初のインターセプターが、サービス・コンシューマーからのサービス・リクエストを受信し、そのリクエストを別のフォーマットに変換します。
  2. そのリクエストから、2 番目のインターセプターが Java オブジェクトを作成します。
  3. 3 番目のインターセプターがビジネス・ロジックを呼び出し、その呼び出しと併せて Java オブジェクトを渡します。
  4. 4 番目のインターセプター (複数可) には、実際のビジネス・ロジックを含めることができます。
  5. 5 番目のインターセプターが、サービス・リクエストから作成されてビジネス・ロジックに渡された新しい Java オブジェクトを、ビジネス・ロジック・アプリケーションから取得します。
  6. 6 番目のインターセプターが Java オブジェクトを XML フォーマットに変換し、レスポンスをサービス・コンシューマーに返します。

この記事では CXF インターセプターの作成や構成についての詳細を説明する代わりに、CXF にすでに用意されているインターセプターの単純な組み合わせを使って放射線科アプリケーションを呼び出します。Apache CXF について詳しく学ぶには、「参考文献」を参照してください。

CXFSE は構成可能なラッパーです。つまり、XML ファイルを作成することによって、SE の振る舞いを制御することができます。放射線科アプリケーションの CXFSE 用に XML 構成ファイルを作成する方法は後で説明することとして、まずは内部アプリケーション (サービス) を ServiceMix でホストするために必要な作業について、全体的な流れを説明しておきます。


放射線科アプリケーションを内部サービスとしてホストするための作業手順

ServiceMix で内部サービスをホストするための手順には、いくつかの構成作業が必要となります。これらの作業は、以下の 5 つのステップに分けて行います。

  1. 放射線科のビジネス・ロジックが含まれる Java クラスを作成してコンパイルし、そのクラスを Web サービスとして公開します。
  2. 放射線科アプリケーションの Java クラスを Spring フレームワークで構成することによって、Spring フレームワークにクラスをインスタンス化させて、アプリケーションの要件に応じて Java クラスを使用できるようにします。
  3. 放射線科アプリケーションの WSDL インターフェースを作成します。JBI 仕様では WSDL 2.0 を使用して、内部サービス・プロバイダーおよび外部サービス・プロバイダーが公開するインターフェースを定義します。
  4. サービス・プロバイダー (放射線科アプリケーション) およびサービス・コンシューマーの JBI 構成を作成します (第 1 回の図 6 に示した処方アプリケーションを思い出してください。放射線科アプリケーションにサービス・リクエストを送信する処方アプリケーションが、サービス・コンシューマーです)。
  5. 放射線科アプリケーションを JBI サービス・アセンブリーとしてパッケージ化し、そのパッケージを ServiceMix にコピーします。

ステップ 5 の作業を完了した後、HSB の動作を確認するために、処方アプリケーション (サービス・コンシューマー) から放射線科アプリケーションにメッセージを送信します。

ここからは、それぞれのステップを具体的に説明します。

単純な Java クラスとしての放射線科アプリケーション

リスト 1 に、RadiologyDepartment という名前を付けた Java クラスを記載します。この単純な 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 という 2 つのパラメーターを取ります。見てのとおり、これらのパラメーターの型は Holder <String> となっています。Holder は JAX-WS (Java API for XML Web Services) で定義されたクラスです。CXFSE は JAX-WS を使用するので、このクラスのインスタンスを使用すると Java クラスと情報を交換しやすくなります。Holder クラスには、インスタンスにデータを挿入するためのメソッドと、インスタンスからデータを取得するためのメソッドがあります。CXF フレームワークは内部で XML リクエスト・メッセージのデータを Holder オブジェクトに取り込んでから、Holder オブジェクトを放射線科アプリケーションの Java クラスに渡します。

上記では (いくつかの System.out 文があることを除き) performTest() メソッドを空にしてありますが、これはあくまでも簡潔にするためだけです。実際のアプリケーションでは、performTest() メソッドを放射線科アプリケーションのビジネス・ロジックに接続することになります。

次に必要な作業は、上記の RadiologyDepartment クラスをコンパイルすることです。記事に付属のダウンロードには、RadiologyDepartment クラスのコードとコンパイルした後のこのクラスが sample1\RadiologyService フォルダーに用意されています。

RadiologyDepartment クラスの JAXB (Java API for XML Binding) ファイルも生成する必要があります。JAX-WS API は JAXB ファイルを使用するので、Apache CXF が RadiologyDepartment クラスを Web サービスとして公開するためには JAXB ファイルが必要です。RadiologyDepartment クラスから必要なすべてのファイルを生成するには、wsgen という名前の便利なツールがあります。wsgen は JDK1.6 インストール・ディレクトリーの ..\jdk1.6.0_12\bin フォルダーの中に入っています (wsgen ツールについての詳細は、「参考文献」を参照してください)。

この記事のために、ダウンロードには ws.bat ファイルを用意しておきました。この ws.bat を実行するだけで、必要な JAXB ファイルを生成することができます。また、このツールで生成される必要なすべてのファイルは、sample1\RadiologyService フォルダー内にソース、そしてコンパイルした形の両方で含まれています。

RadiologyDepartment クラスを Spring フレームワークで構成する

リスト 2 に、RadiologyDepartment クラスの Spring XML 構成を記載します。

リスト 2. 放射線科サービスの 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 のルート・タグが、Spring の XML 名前空間の一部である <beans> となっている点に注目してください。<beans> タグの目的は、アプリケーションのさまざまな Java Bean (または Java クラスのインスタンス) を保持することです。<beans> タグの内側でアプリケーション固有の Java Bean を構成すると、Spring が Java クラスのインスタンス化を処理し、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 をもう一度見てください。この図では、処方アプリケーションが放射線科アプリケーションにメッセージを送信しています。つまり、処方アプリケーションと放射線科アプリケーションがエンドポイントということになります。メッセージは処方アプリケーションから発信され、JBI のさまざまなコンポーネント (BC (Binding Component)、NMR (Normalized Message Router)、SE など) を介して最終的に放射線科アプリケーションに到達します。

リスト 2 で構成しているのは放射線科アプリケーションなので、<beans>/ タグの中には <endpoint> タグを直接指定します。これによって、ServiceMix は、ここで構成されているのがエンドポイントであることを認識します。

エンドポイントには、いくつかのタイプがあります。例えばエンドポイントを、複数のジョブを順番に行うインターセプターのチェーン (「Apache ServiceMix の概要」セクションで説明したようなインターセプターのチェーン) にすることもできますが、この記事では簡潔にするため、単純な Java クラス (RadiologyDepartment クラス) を使用します。単純な Java クラスのインスタンスは一般に POJO (Pain Old Java Object) と呼ばれます。cxfse 名前空間には <pojo> というタグがあります。このタグを <endpoint> タグに含めることによって、このエンドポイントが単純な Java クラスのインスタンスであると指定します。

リスト 2 で最後に指摘する点として、このなかに示されている <bean> タグは Spring の名前空間の一部で、このタグが、エンドポイントとして機能する Bean (Java クラスのインスタンス) を指定します。具体的には、<bean> タグの class 属性が、エンドポイントとなるインスタンスの完全修飾クラス名 (つまり、com.hsb.RadiologyDepartment) を指定します。

リスト 2 に記載した Spring XML 構成ファイルは、xbean.xml というファイル名でダウンロードの sample1\RadiologyService\ フォルダーに置かれています。

放射線科アプリケーションの WSDL ファイルを作成する

リスト 3 に、放射線科アプリケーションの WSDL インターフェースを記載します。

リスト 3. 放射線科アプリケーションの 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 は、放射線科アプリケーションの WSDL バインディングです。

リスト 4. 放射線科アプリケーションの 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 のインターフェースとバインディングの詳細は、この記事では説明しきれないので、「参考文献」に記載されている developerWorks 記事へのリンクにアクセスして、WSDL の詳細を調べてください。

リスト 3リスト 4 に記載した WSDL ファイルは、ダウンロードの sample1\RadiologyService フォルダーにそれぞれ Radiology.wsdl、RadiologyService.wsdl という名前で置かれています。

放射線科アプリケーションをパッケージ化する

ここで、RadiologyDepartment クラスとこのクラスに付随する JAXB クラス、Spring の xbean.xml、そして放射線科アプリケーションの WSDL ファイルを、RadiologyService.zip という名前を付けた .zip ファイルにパッケージ化してください。これらのファイルはすべて、ダウンロードの sample1\RadiologyService\ フォルダーに置かれています。そしてこのすべてのファイルをパッケージ化した .zip ファイルは、sample1\ フォルダーに置かれています。

サービス・コンシューマーを構成してパッケージ化する

これまでの手順でパッケージ化した放射線アプリケーションはサービス・プロバイダーです。このアプリケーションを実行するには、JBI サーバーにサービス・コンシューマーを構成しなければなりません。

サービス・コンシューマーを JBI に構成する手順は、これまで行ってきたサービス・プロバイダー構成を組み立てる手順とほぼ同じで、Spring XML 構成と WSDL ファイルを、今度はコンシューマー・エンドポイント用に作成します。

リスト 5 に、サービス・コンシューマーの Spring XML 構成を記載します。

リスト 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 ではリスト 2cxfse 名前空間の代わりに、cxfbc 名前空間を使用します。cxfbc 名前空間を使用する理由は、サービス・コンシューマーには SE ではなく、BC が必要だからです。第 1 回の図 6 に関する説明の 6 つのステップをもう一度振り返ってみると、処方アプリケーション (サービス・コンシューマー) には BC が必要であり、放射線科アプリケーション (内部サービス・プロバイダー) には SE が必要であることがわかります。ServiceMix は CXF アプリケーションの SE 名前空間と BC 名前空間の両方を提供するため、アプリケーションを必要に応じて自由自在に構成することができます。

サービス・コンシューマーの WSDL ファイルにしても、リスト 3リスト 4 に記載した WSDL ファイルと非常によく似ています。これらのサービス・コンシューマー構成ファイルは、ダウンロードの sample1\PrescriptionService フォルダー内にあります。

サービス・コンシューマーの Spring XML 構成と WSDL ファイルも、.zip ファイルにパッケージ化する必要があります。このファイルには PrescriptionService.zip という名前を付けて、皆さんのためにすでに用意してあります。この PrescriptionService.zip は、ダウンロードの sample1\ フォルダーに置かれています。

放射線科アプリケーションと処方アプリケーションを 1 つに組み立てる

2 つのサービス・ユニットを構成する作業は完了しました。1 つは放射線科アプリケーション (サービス・プロバイダー) のサービス、そしてもう 1 つは処方アプリケーション (サービス・コンシューマー) のサービスです。これから、この 2 つのサービス・ユニットを 1 つの JBI サービス・アサンブリーに組み立てていきます。

サービス・アセンブリーを完成させるために必要な作業は、JBI の XML 構成を作成することだけです (リスト 6 を参照)。

リスト 6. 放射線科アプリケーション・サービス・アセンブリーの 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> タグには 2 つの <service-unit> 子タグがあり、それぞれの<service-unit> 子タグが、個々のサービス・ユニットを表します。ここで構成しているのは放射線科アプリケーションと処方アプリケーションだけなので、上記のサービス・アセンブリーには、そのそれぞれに対応する 2 つの <service-unit> タグしか含まれていません。

<service-unit> タグの中には、サービス・ユニットの名前と説明、そしてサービス・ユニットの ZIP ファイルがラップされています。<service-unit> タグごとの <artifacts-zip> タグで囲まれている ZIP ファイルの名前を見るとわかるように、これらの名前は、「放射線科アプリケーションをパッケージ化する」セクションと「サービス・コンシューマーを構成してパッケージ化する」セクションの最後で作成した 2 つの .zip ファイルの名前と一致します。RadiologyService.zip ファイルが放射線科アプリケーション用の ZIP ファイル、PrescriptionService.zip ファイルが処方アプリケーション用の ZIP ファイルです。

リスト 6 の構成は、jbi.xml という名前の XML ファイルとして保存してください。この XML ファイルはあらかじめ、ダウンロードMETA-INF\ フォルダーに用意しておきました。最後に META-INF\ フォルダーと 2 つの .zip ファイルを RadiologyAssembly.zip にパッケージ化します。この RadiologyAssembly.zip も、ダウンロードの sample1\ フォルダーに含まれています。

RadiologyAssembly.zip は、最終的な ZIP ファイルです。このなかに、これまで作業したすべてのファイルが含まれています。

ServiceMix アプリケーションを開発する際の秘訣

この記事のダウンロードに含まれている Tips.txt ファイルには、以下の方法に関する有益な秘訣が記載されています。

  • ServiceMix のトレースを有効にしてデバッグする方法
  • ServiceMix キャッシュをクリアする方法
  • ServiceMix コンポーネントを再デプロイする方法

これらの秘訣は、この記事のサンプル・アプリケーションを実行する際には必要ありませんが、独自の ServiceMix アプリケーションを開発するときに役立ちます。

放射線科サービスをテストする

以下のステップに従って、放射線科アプリケーションをテストします。

  1. お使いのコンピューターに Apache ServiceMix 3.3.1 をダウンロードしてインストールします (「参考文献」を参照)。
  2. ServiceMix を起動します。それには、ServiceMix インストール・ディレクトリーの ..\apache-servicemix-3.3.1\bin フォルダーにあるservicemix.bat ファイルをダブルクリックします。しばらくするとサーバーがそのサービスを開始するので、それまで待ちます。
  3. sample1\ フォルダーに格納されている RadiologyAssembly.zip を、ServiceMix インストール・ディレクトリーの ..\apache-servicemix-3.3.1\hotdeploy フォルダーにコピーします。.zip ファイルをコピーすると同時に、ServiceMix は新しいアプリケーションがデプロイされていることを検出し、デプロイメント・プロセスを開始します。このプロセスの様子は、ServiceMix の出力コンソールに表示されるので、デプロイメントが完了するまで待ってください。

ServiceMix には単純なブラウザー・ベースの SOAP クライアントが用意されているので、このクライアントを使って ServiceMix アプリケーションをテストすることができます。クライアントに付随する複数のサンプル・アプリケーションも、ServiceMix にバンドルされて提供されます。クライアントは、client.html ファイルという形で ServiceMix インストール・ディレクトリーの ..\apache-servicemix-3.3.1\examples\cxf-wsdl-first フォルダーに含まれています。

client.html ファイルをブラウザーで開き、HTML ページの「Target」フィールドに http://localhost:8092/RadiologyService と入力します。「Target」フィールドのすぐ下にあるテキスト・ボックスには、リスト 7 に記載する SOAP リクエストを入力してください。

リスト 7. 放射線科アプリケーションをテストするための SOAP リクエスト・メッセージ
<?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」ボタンをクリックして、しばらく待機します。放射線科アプリケーションのサービス・コンシューマーがリクエストを受け取って、NMR にそのリクエストをルーティングすると、CXFSE エンジンによってリクエストが RadiologyDepartment クラスにルーティングされます。すると RadiologyDepartment クラスがレスポンスを返します。レスポンスが SOAP クライアントまで戻ってくると、リクエスト・テキスト・ボックスの隣にあるテキスト・ボックスに表示されます (図 2 を参照)。

図 2. SOAP クライアントに表示されたレスポンス
SOAP クライアントに表示されたレスポンス

JBI サーバーの相互接続

これまでの手順で、放射線科アプリケーションを内部サービス・プロバイダーとして構成し、そのサービスを外部サービス・コンシューマーから呼び出す方法を説明してきました。ここからは、ある JBI サーバーに接続されたサービス・コンシューマーが、別の JBI サーバーに接続されたサービス・プロバイダーによって提供されるサービスを呼び出せるように、2 つの JBI サーバーを構成する手順を説明します。これは、JBI サーバーの相互接続について説明した第 1 回の図 7 に示したようなシナリオです。

第 1 回の図 4図7 を見比べてみてください。図 4 ではサービス・コンシューマーと外部サービス・プロバイダーが同じ JBI サーバーに接続されています。図 7 では、サービス・コンシューマーとサービス・プロバイダーがそれぞれ別の JBI サーバーに接続されていますが、この 2 つの JBI サーバーは相互に接続されています。

JBI の観点からすると、この 2 つのシナリオは同じです。サービスが JBI 環境の外部にある場合、その外部サービスが JBI サーバーに直接接続されているのか、あるいは別の JBI サーバーを介して間接的に接続されているのかは関係ありません。つまり、第 1 回の図 7 に従って構成した JBI は、第 1 回の図 4 に従って医療プロバイダーに接続する場合でも有効に機能するということです。したがって、この記事では図 7 のシナリオだけを取り上げ、図 4 のシナリオは読者の皆さんに任せることにします。

このセクションでは、2 つの JBI サーバーが必要です。一方の JBI サーバーにはサービス・コンシューマーと外部サービス・プロバイダーを接続し、もう一方の JBI サーバーには内部サービス・プロバイダーを接続します。この構成を図 3 に示します。

図 3. 外部サービス・コンシューマーが接続された JBI サーバーと、サービス・プロバイダーを内包している JBI サーバー
外部サービス・コンシューマーが接続された JBI サーバーと、サービス・プロバイダーを内包している JBI サーバー

1 番目の JBI サーバーは、2 番目の JBI サーバーを外部サービスと見なします。2 番目の JBI サーバーは、1 番目の JBI サーバーをサービス・コンシューマーと見なします。

これはつまり、放射線科アプリケーションの構成をそのまま 2 番目の JBI サーバーとして使用できることを意味します。したがって必要な作業は、1 番目の JBI サーバーに外部サービス・プロバイダーとサービス・コンシューマーを構成することだけです。

外部サービス・プロバイダーを構成するということは、単に 1 番目の JBI サーバーに対し、2 番目の JBI サーバーが Web サービスであると伝えるということに過ぎません。そのために必要なステップは 2 つだけです。まず、リスト 2 および 5 のような Spring XML 構成ファイルを作成し、次にリスト 3 および 4 のような WSDL ファイルを作成します。

1 番目の 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 では (リスト 5<consumer> タグと同じく) cxfbc 名前空間に属する <provider> タグが使用されている点にも注目してください。<provider> タグには、以下のように外部サービスの詳細を指定する各種の属性があります。

  • service: 2 番目の JBI サーバーでホストされる放射線科サービス・プロバイダーの名前。
  • endpoint: サービス・リクエストをリッスンしている放射線科アプリケーションの WSDL ポート。
  • locationURI: 放射線科サービスのネットワーク・アドレス。このネットワーク・アドレスは 2 番目の JBI サーバーに存在します。私がこのアプリケーションを試したときには、2 番目の JBI サーバーが稼働しているマシンのネットワーク・アドレスは192.168.10.33 で、2 番目の JBI サーバーのポートは 8092 でした。
  • wsdl: WSDL ファイルの名前とロケーション。ServiceMix はクラスパスを、サービスに対応する ZIP ファイルのルートに解決します。この記事のダウンロードでは、WSDL は sampl2\JBI1\RemoteRadiologyService フォルダーにあります。RemoteRadiologyService フォルダーに含まれるファイルが、このアプリケーションの ZIP ファイルのルートを形成するため、wsdl 属性の値は単純に classpath:RadiologyService.wsdl となっているわけです。

このプロバイダー・サービスの WSDL ファイルはリスト 3リスト 4 に記載した WSDL ファイルと同じです。ダウンロードの sample2\JBI1\RemoteRadiologyService フォルダーに、リスト 8 が xbean.xml として、この構成に付随する WSDL が RadiologyService.wsdl として置かれています。このフォルダーに含まれるすべてのファイルをまとめて .zip ファイルにパッケージ化し、RemoteRadiologyService.zip というファイル名を付けてください。パッケージ化した後の .zip ファイルは、sample2\JBI1 フォルダーに用意してあります。

1 番目の JBI サーバーのサービス・コンシューマーを構成する

1 番目の JBI サーバーのサービス・コンシューマーの構成は、リスト 5 で行った構成とまったく同じなので、ここでリストをもう一度記載することはしません。このコンシューマーの構成は、sample2\JBI1\PrescriptionService フォルダーに xbean.xml ファイルとして置かれています。

サービス・コンシューマー構成に付随する WSDL ファイルも必要となりますが、この場合の WSDL ファイルはリスト 3 に記載した WSDL ファイルと非常によく似ています。このサービス・コンシューマー用の WSDL は sample2\JBI1\PrescriptionService フォルダー内にあります。また、PrescriptionService フォルダーに含まれるファイルは PrescriptionService.zip にパッケージ化しておきました。

1 番目の JBI サーバーのプロバイダーとコンシューマーを 1 つに組み立てる

1 番目の JBI サーバー用の 2 つの .zip ファイルは用意できました。最後のステップは、これらの .zip ファイルをサービス・アセンブリーに組み立てることです。完成したアセンブリーの JBI 構成ファイルをリスト 9 に記載します。

リスト 9. 1 番目の 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 サーバーの相互接続をテストするには、「放射線科サービスをテストする」セクションで実行した RadiologyAssembly アプリケーションを再び実行します。このアプリケーションが、2 番目の JBI サーバーとしての役割を果たします。

私がこの JBI 相互接続を試したときの 2 番目の JBI サーバーは、ローカル・ネットワーク・アドレス 192.168.10.33 のマシンで稼働していました。お察しのとおり、1 番目の JBI サーバーのプロバイダーは、2 番目の JBI サーバーのネットワーク・アドレスを知っていなければなりません。そのため、1 番目の JBI サーバーのプロバイダーを対象とした構成ファイルでは、このネットワーク・アドレスが次の 2 箇所で出現します。

  • xbean.xml ファイル内の locationURI 属性
  • RadiologyService.wsdl ファイル内にある <soap> タグの address 属性

2 番目の JBI サーバーを別のアドレスから実行している場合には、上記の 2 箇所を該当するアドレスに変更してください。

以下のステップに従って、1 番目の JBI サーバーを実行します。

  1. 別のマシンに Apache ServiceMix 3.3.1 をインストールします。私は 2 台のマシンを使って JBI サーバーの相互接続を試みました。1 台は 1 番目の JBI サーバー用、もう 1 台は 2 番目の 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. 前に放射線科アプリケーションをテストするときに使用した client.html ファイルをブラウザーで開きます。HTML ページの「Target」フィールドには「http://localhost:8092/RadiologyService」と入力し、「Target」フィールドの下にあるテキスト・ボックスには、リスト 7 と同じ SOAP リクエストを入力します。
  5. Send」ボタンをクリックして、しばらく待ちます。リクエストが 1 番目の JBI サーバーに送信され、このサーバーに接続されたサービス・コンシューマーの BC、NMR、サービス・プロバイダーの BC を介して 2 番目の JBI サーバーに到達します。2 番目の JBI サーバーに接続されたサービス・コンシューマーの BC がリクエストを受け取って、リクエストを NMR、CXFSE、そして最後に RadiologyDepartment クラスにルーティングすると、このクラスがレスポンスを返します。レスポンスが 2 つの JBI サーバーを介してブラウザーに辿り着くと、リクエスト・テキスト・ボックスの隣にあるテキスト・ボックスにそのレスポンスが表示されます。

ServiceMix への業界固有の標準の統合

これまで、さまざまなサービスを ServiceMix に統合する方法を見てきました。この記事でサンプルとして使用したサービス (放射線科アプリケーション・サービス) は、WSDL をベースとしています。けれども第 1 回の「医療サービスを相互運用可能にするための XML」セクションで説明したように、すべてのサービスが WSDL をベースとしているわけではありません。サービスのなかには、HL7 などの業界固有の標準をベースとしているものもあります。サービスを JBI に統合するときには、そのサービスが WSDL ベースであろうと、業界固有のサービスであろうと、常に JBI コンポーネントが必要となります。

サービス・インターフェースを定義する際に一般的に使用されている標準として、WSDL は業界の区別なく使用することができます。これが、WSDL ベースの実装の多くは ServiceMix に統合可能である理由であり、また、ServiceMix が Apache CXF にバンドルされている理由でもあります。けれでも、HL7 はその限りではありません。この記事を執筆している時点で、ServiceMix では HL7 をサポートしていませんが、ServiceMix の Web サイトでは、このプロジェクトは将来的には HL7 のサポートを ServiceMix に組み込む予定となっていると発表しています。

読者の皆さんが ServiceMix に業界固有の標準を統合するという問題に対処しなければならない可能性は十分に考えられます。そこで、ServiceMix 内で有効に機能する独自のコンポーネントを作成するための大まかな計画を概説しておきます。

ServiceMix にコンポーネントを統合するときには必ず、コンシューマーからのサービス・リクエストに対してコンポーネントがどのように応答するかを制御しなければなりません。ServiceMix では、業界固有の JBI コンポーネントの振る舞いを必要に合わせて正確に制御できるインターフェースを定義しています。

ServiceMix の柔軟性

独自のコンポーネントの機能を実装できるように、ServiceMix には以下のインターフェースが用意されています。

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

これらのインターフェースについての詳細は、「参考文献」に記載している ServiceMix の公式ドキュメントへのリンクを参照してください。

  • コンポーネントの実行内容は、コンポーネントのインストール時に制御することができます。例えば、コンポーネントがアプリケーションのデータを保管できるように、コンポーネントのインストール中にデータベース・テーブルを作成することができます。
  • 同様に、ServiceMix ではアンインストール・コードを作成して、コンポーネントがそのインストール中に行った内容を取り消したり、クリーンアップしたりすることもできます。
  • コンポーネントの起動および停止を制御する ServiceMix インターフェースのメソッドを実装することができます。コンポーネントを起動するということは、コンポーネントがメッセージを受信できる状態になることを意味します。反対に、コンポーネントを停止するということはコンポーネントがメッセージを受信できなくなることを意味します。
  • ServiceMix インターフェースは、コンポーネントがその環境 (つまり、JBI 環境) を学習し、対話することを可能にします。例えば、NMR を介したコンポーネントとのメッセージ交換に使用する通信オブジェクトを指定するコードを作成することができます。

HL7 サポートを ServiceMix に統合するのに最も効率的なストラテジーとして考えられるのは、オープンソースの HL7 実装を統合の出発点として使用することです。そのような製品としては、HAPI (HL7 Application Programming Interface) がすでに使用できるようになっています (「参考文献」を参照)。HAPI では軽量なラッパーを設計して、そのラッパーに ServiceMix インターフェースを実装することができます。


ダウンロード

内容ファイル名サイズ
Sample code for this articlej-hsb2.zip232KB

参考文献

学ぶために

  • JBI: Java Community Process の Web サイトから、Java Business Integration 仕様を入手してください。
  • Apache ServiceMix マニュアル: このアジャイルなオープンソースの ESB について詳しく学んでください。
  • Apache CXF: この CXF サービス・フレームワークを調べてください。
  • Spring Framework: Apache ServiceMix にバンドルされている Spring は、エンタープライズ Java アプリケーションの構築、実行によく使われているプラットフォームです。ServiceMix をインストールすると、自動的に Spring もインストールされます。
  • HL7: 医療情報技術を相互運用するための標準について学んでください。
  • WSDL による Web サービスの配置: 第 2 回 SOAP (Simple Object Access Protocol)」(Bilal Siddiqui 著、developerWorks、2002年11月): SOAP プロトコルとその構文についての詳しい説明を読んでください。
  • WSDL 2.0 で REST Web サービスを記述する」(Lawrence Mandel 著、developerWorks、2008年5月): WSDL 2.0 を使用して Web サービスを記述する方法を学んでください。
  • JAX-WS (Java API for XML-based Web Services): JAX-WS プロジェクトのページにアクセスして、JAX-WS を使用した SOAP ベースの Java Web サービス開発について学んでください。
  • wsgen: wsgen ツールの詳細を学んでください。
  • Design and develop JAX-WS 2.0 Web services」(Rajeev Hathi、Naveen Balani 共著、developerWorks、2007年9月): このチュートリアルでは、JAX-WSを使用して Web サービスを開発し、デプロイする方法を説明しています。
  • Technology bookstore で、この記事で取り上げた技術やその他の技術に関する本を探してください。
  • developerWorks Java technology ゾーン: Java プログラミングのあらゆる側面を網羅した記事が豊富に用意されています。

製品や技術を入手するために

  • Apache ServiceMix: ServiceMix をダウンロードしてください。
  • HAPI: このオープンソースの HL7 実装をダウンロードして使用してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Industries
ArticleID=498931
ArticleTitle=医療サービスの統合: 第 2 回 Apache ServiceMix を医療サービス・バスとして使用する
publish-date=06082010