ルーティング・プロダクションの要素
Ensemble では、ENSDEMO ネームスペース内の Demo.HL7v3 パッケージに、簡単な HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションが用意されています。この例のプロダクション・ダイアグラムを、以下に示します。
ビジネス・サービス
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションの各ビジネス・サービスは、特定のソース・アプリケーションから受信データ・ストリームを受信します。ビジネス・サービスは、受信データ・ストリームから XML ドキュメントを生成します。このドキュメントから、メッセージのルーティングおよび変換に必要な情報を抽出します。
サンプル・クラス Demo.HL7v3.Service.FileInOpens in a new tab および Demo.HL7v3.Service.SOAPInOpens in a new tab は、ビジネス・サービスです。これらのクラスは、ENSDEMO ネームスペースにあります。Demo.HL7v3.Service.FileInOpens in a new tab を以下に示します。
Class Demo.HL7v3.Service.FileIn Extends Ens.BusinessService
{
Parameter ADAPTER = "EnsLib.File.InboundAdapter";
Method OnProcessInput(pInput As %FileCharacterStream,
pOutput As Ens.Response) As %Status
{
Set $ZTrap = "OnProcessInputET"
Set tStatus =
##class(%XML.XPATH.Document).CreateFromStream(pInput, .tDocument)
Set tStatus = tDocument.EvaluateExpression("/*", "name()", .tResults)
Set tStatus = pInput.Rewind()
If (tResults.Count() > 0) Set tRoot = tResults.GetAt(1).Value
Else Set tRoot = "<errorNoRootElement>"
Set tRequest = ##class(Demo.HL7v3.Message).%New()
Set tRequest.Name = tRoot
Set tRequest.DocType = ""
Set tRequest.Source = pInput.Attributes("Filename")
Do tRequest.Content.CopyFrom(pInput)
Set tStatus =
..SendRequestSync("Route and Transform Message", tRequest, .tResponse)
Quit $$$OK
OnProcessInputET
Set $ZTrap = ""
Quit $$$ERROR($$$GeneralError,"Error in OnProcessInput(): "_$ZError)
}
}
入力ファイルが見つかると、Demo.HL7v3.Service.FileInOpens in a new tab は CreateFromStream() メソッドを呼び出して、受信文字ストリームから XML ドキュメントを作成します。
このドキュメントは、%XML.XPATH.DocumentOpens in a new tab タイプのオブジェクトです。したがって、このドキュメントには EvaluateExpression() というメソッドが含まれます。ビジネス・サービスは、このメソッドを呼び出して、XPath コンテキスト ("/*") および式 ("name()") を評価します。このコンテキストは、ドキュメントから最初のノードセットを選択し、式はそのノードセットをさらにフィルタリングします。EvaluateExpression() に成功すると、結果のリスト (.tResult) が返されます。このリストは、タイプおよび値についてクエリできます。ビジネス・サービスがこれを行い、入力ストリーム内の最初の XML 要素の名前をメッセージ Name として受け入れます。
Demo.HL7v3.Service.FileInOpens in a new tab は、入力ファイルの名前を記録し、メッセージ・データを適切なストリーム・オブジェクトにコピーすることによって、Ensemble メッセージの作成を完了します。
ビジネス・サービスは、SendRequestSync() を呼び出す際のルーティング・プロセスの構成名を使用して、そのメッセージを指定されたルーティング・プロセスに送信します。
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのビジネス・サービス・ホスト・クラスを作成するには、Demo.HL7v3 パッケージ内のサンプル・クラスをコピーしてカスタマイズするか、Ens.BusinessServiceOpens in a new tab の独自のサブクラスを作成します。クラスを作成した後、ビジネス・サービスをプロダクションに追加します。
管理ポータルの新規ビジネス・サービス・ウィザードには、[HL7] オプションが用意されています。このオプションを使用すると、HL7 バージョン 2.x のビジネス・サービスが作成されますが、これは HL7 バージョン 3.0 で使用するには適切ではありません。
メッセージ
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションを設計する際、要求と応答の両方に適するメッセージ・タイプを定義しておくと便利な場合があります。このことが当てはまるのは、ENSDEMO ネームスペースの Demo.HL7v3 パッケージに含まれているサンプル・プロダクションの場合です。
サンプルのメッセージ・クラス Demo.HL7v3.MessageOpens in a new tab には、外部ファイルから得た HL7 バージョン 3.0 メッセージのルーティング、変換、およびタイムスタンプに最低限必要となるプロパティが用意されています。Demo.HL7v3.MessageOpens in a new tab を以下に示します。
Class Demo.HL7v3.Message Extends (%Persistent, %XML.Adaptor)
{
Property Content As %GlobalCharacterStream;
Property Name As %String;
Property DocType As %String;
Property Source As %String;
}
Content はデータ・ストリームです。
Name および DocType は HL7 ルーティング・プロセスによって期待されるプロパティで、どちらもメッセージ・クラス内に存在する必要があります。サンプル・プロダクションで、Name はメッセージをルーティングするために使用されるプロパティです。
Source は、タイムスタンプを提供するためにビジネス・オペレーションで使用されます。これは、メッセージ・データの生成元となったビジネス・サービスによって異なります。また、入力ファイル、または SOAP ビジネス・サービスにデータを中継した Web サービス名を識別します。
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのメッセージ・クラスを作成するには、サンプル・クラス Demo.HL7v3.MessageOpens in a new tab をコピーしてカスタマイズするか、独自のクラスを作成します。
ルーティング・プロセス
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのルーティング・プロセスは、関連するビジネス・サービスから受信した XML ドキュメントを検証します。検証に失敗すると、ルーティング・プロセスは XML ドキュメントを不正メッセージ・ハンドラに送信します。検証に成功すると、ルーティング・プロセスは、ルーティング・ルール・セットを呼び出して、XML ドキュメントの処理を判断します。
一致するルールが見つかると、ルーティング・プロセスはそのルールに対する指示を実行します。データ変換クラス Transform() メソッドを呼び出したり、ビジネス・オペレーションに Ensemble メッセージを送信したりすることができます (または両方を順番に行います)。
サンプル・クラス Demo.HL7v3.MsgRouter.RoutingEngineOpens in a new tab には、空の OnValidate() メソッドがあります。Demo.HL7v3.MsgRouter.RoutingEngineOpens in a new tab は ENSDEMO ネームスペースにあります。このクラスをコピーして、HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのルーティング・プロセス・クラスを作成する場合は、OnValidate() メソッドに有効なコードを挿入する必要があります。
Demo.HL7v3.MsgRouter.RoutingEngineOpens in a new tab は、CreateFromStream() を呼び出して、メッセージのストリーム Contents を XML ドキュメントに変換することによって、簡単な暗黙の検証テストを行います。この呼び出しに失敗すると、ルーティング・プロセスは不正メッセージ・ハンドラを呼び出します。成功した場合は、ルーティング・ルール・セットを呼び出します。
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのルーティング・プロセス・クラスを作成するには、サンプル・クラス Demo.HL7v3.MsgRouter.RoutingEngineOpens in a new tab をコピーしてカスタマイズするか、EnsLib.MsgRouter.RoutingEngineOpens in a new tab の独自のサブクラスを作成します。クラスを作成した後、ルーティング・プロセスをプロダクションに追加します。
管理ポータルの新規ビジネス・プロセス・ウィザードには、[HL7メッセージ・ルータ] オプションが用意されています。このオプションを使用すると、HL7 バージョン 2.x のルーティング・プロセスが作成されますが、これは HL7 バージョン 3.0 で使用するには適切ではありません。
ルーティング・ルール・セット
ルーティング・ルール・セットは、以下を決定するロジックを提供します。
-
メッセージの送信先
-
メッセージの送信前に変換が必要かどうか。また、変換が必要な場合はその方法
詳細は、"Ensemble HL7 バージョン 2 開発ガイド" の “HL7 のルーティング・ルール・セットの定義” を参照してください。
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのルーティング・ルール・セットのあらゆる点は、HL7 バージョン 2.x の場合と同じですが、唯一の相違点として、バージョン 3.0 では [メッセージ・クラス] はビジネス・サービスがルーティング・プロセスに送信する任意のクラスです。サンプル・コードでは、このクラスは Demo.HL7v3.MessageOpens in a new tab です。このクラスは ENSDEMO ネームスペースにあります。
Demo.HL7v3 パッケージ内のサンプル・ルーティング・ルール・セットの完全名は、Demo.HL7v3.Rule.RouteAndTransformOpens in a new tab です。以下の図は、Ensemble, Ensemble ルール・エディタ ページに表示されるこのルール定義を示しています(管理ポータルでこのページにアクセスするには、[Ensemble]、[ビルド] の順にクリックし、[ビジネス・ルール] をクリックします)。
このルール定義は、メッセージのタイプによって異なるアクションを実行します。Demo.HL7v3 サンプルは、各メッセージが MFMT_IN002101 または QUPA_IN101103 の 2 つのタイプのいずれかであることを期待します。両方のサンプル・ビジネス・サービスには、データ・ストリームの構造に基づいて受信メッセージのタイプを判断するコードが含まれています。これらのビジネス・サービスは、次に、ルーティング・プロセスに送信する Demo.HL7v3.MessageOpens in a new tab の Name プロパティに適切な文字列を配置します。これによって、メッセージタイプ MFMT_IN002101 または QUPA_IN101103 がルーティング・ルール・セットに使用可能になります。
サンプル・プロダクションを実行するために使用するサンプル・データは、実際に MFMT_IN002101 または QUPA_IN101103 タイプの HL7 バージョン 3.0 メッセージを含んでいる必要があります。これが含まれていない場合、メッセージはルーティングされません。各タイプのメッセージのサンプルは、このドキュメントの付録として用意されています。ドキュメントをオンラインで表示している場合は、各付録のテキストをファイルにコピーして Demo.HL7v3.Production.InterfaceEngineOpens in a new tab プロダクションを実行するためのサンプル・データとして使用できます。
データ変換
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのデータ変換は、Ensemble データ変換言語 (DTL) を使用しません。HL7 バージョン 3.0 メッセージのデータ変換は、XPath および XSLT を使用して、有効な XML ドキュメントを作成します。
サンプル・データ変換クラス Demo.HL7v3.Transformation.MFMTIN002101Opens in a new tab および Demo.HL7v3.Transformation.QUPAIN101103Opens in a new tab に、詳細なコードおよびコメントが用意されています。これらのクラスは、ENSDEMO ネームスペースにあります。Transform() メソッドの概要は以下のとおりです。
-
クラスに含まれる XData ブロックからメッセージ構造を取得します。
-
クラスに含まれる XData ブロックから XSL のストリームを取得します。
-
入力ストリームから XML ドキュメントを作成します。
-
XSL 変換を設定します。変換の各オペレーションに対して、以下を実行します。
-
XPath 式を使用して、変換対象のデータを取得します。
-
ObjectScript 文字列関数を使用するなどして、データを変換します。
-
この変換を XSL パラメータにバインドします。
-
-
変換されたデータ・ストリームをターゲット・メッセージに書き込みます。
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのデータ変換を作成するには、サンプル・クラス Demo.HL7v3.Transformation.MFMTIN00210 または Demo.HL7v3.Transformation.QUPAIN101103Opens in a new tab をコピーしてカスタマイズするか、Ens.DataTransformOpens in a new tab の独自のサブクラスを作成して適切な XData セクションを提供し %XML パッケージ内のクラスから適切なメソッドを呼び出します。
プロダクションにデータ変換を配置するには、ルーティング・ルール・セットのルールに対する [変換] アクションとしてこれを指定します。
属性の変換
前出の例では、HL7 V3.0 メッセージ内で要素を変換する方法を示しています。属性も変換できるように MFMTIN00210 の例を変更するには、Transform() メソッドに以下を追加します。
// Get creation date/time, change to the current date, and bind to XSL parameter
Set tStatus=tDocument.EvaluateExpression("//MFMT_IN002101/creationTime", "@value",.tResults)
Set tParams("creationTime") = "'" _ $ZD($H,3) _ " " _ $P(tResults.GetAt(1).Value," ",2) _"'"
さらに、XLS 変換を定義する XData に以下を追加します。
<xsl:param name="creationTime"/>
<xsl:template match="//MFMT_IN002101/creationTime/@value">
<xsl:attribute name="value">
<xsl:value-of select="$creationTime"/>
</xsl:attribute>
</xsl:template>
ビジネス・オペレーション
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションの各ビジネス・オペレーションは、Ensemble メッセージのルーティング・プロパティを使用して、新しい XML ドキュメントをターゲットのアプリケーションに送信データ・ストリームとして送信します。
サンプル・クラス Demo.HL7v3.Service.FileOut および Demo.HL7v3.Service.SOAPOut は、ビジネス・オペレーションです。これらのクラスは、ENSDEMO ネームスペースにあります。Demo.HL7v3.Service.FileOut を以下に示します。
Class Demo.HL7v3.Operation.FileOut Extends Ens.BusinessOperation
{
Parameter ADAPTER = "EnsLib.File.OutboundAdapter";
Parameter INVOCATION = "Queue";
Parameter SETTINGS = "Filename";
Property Filename As %String;
Method WriteToFile(pRequest As Demo.HL7v3.Message,
Output pResponse As Ens.Response) As %Status
{
Do pRequest.Content.Rewind()
Set tFilename=
..Adapter.CreateTimestamp(##class(%File).GetFilename(
$Piece(pRequest.Source, $Char(13))),
..Filename)
Set $ZTrap = "WriteToFileET"
Set tStatus = ..Adapter.PutStream(tFilename, pRequest.Content)
Quit $$$OK
WriteToFileET
Set $ZTrap = ""
Quit $$$ERROR($$$GeneralError,"WriteToFile("_tFilename_"): "_$ZError)
}
XData MessageMap
{
<MapItems>
<MapItem MessageType="Demo.HL7v3.Message">
<Method>WriteToFile</Method>
</MapItem>
</MapItems>
}
}
Demo.HL7v3.Service.FileOut は Demo.HL7v3.MessageOpens in a new tab の Source プロパティを使用して、送信ファイルのタイムスタンプを作成します。
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのビジネス・オペレーション・ホスト・クラスを作成するには、ENSDEMO ネームスペースの Demo.HL7v3 パッケージからサンプル・クラスをコピーしてカスタマイズするか、Ens.BusinessOperationOpens in a new tab の独自のサブクラスを作成します。クラスを作成した後、ビジネス・オペレーションをプロダクションに追加します。
管理ポータルの新規ビジネス・オペレーション・ウィザードには、[HL7] オプションが用意されています。このオプションを使用すると、HL7 バージョン 2.x のビジネス・オペレーションが作成されますが、これは HL7 バージョン 3.0 で使用するには適切ではありません。
不正メッセージ・ハンドラ
不正メッセージ・ハンドラは、ルーティング・プロセスが検証に失敗した HL7 バージョン 3.0 メッセージに有用な操作を行うビジネス・オペレーションです。不正メッセージ・ハンドラは、多くの場合、不正メッセージのソースを識別しやすくするためのタイムスタンプとファイル名前付け規則を使用して、不正メッセージをファイルに保存します。(ENSDEMO ネームスペース内の) サンプル・クラス Demo.HL7v3.MsgRouter.RoutingEngineOpens in a new tab には、BadMessageHandler プロパティがあります。このプロパティは、Ensemble, プロダクション構成 ページの構成画面に表示されるため、ユーザは構成済みのビジネス・オペレーションの名前を指定できます。サンプル・プロダクションではこのフィールドが空白になっているので、不正メッセージは無視されます。
アラート・ハンドラ
HL7 バージョン 3.0 メッセージ・ルーティング・プロダクションのアラート処理は、HL7 バージョン 2.x の場合と同じです。以下のリファレンスでは、詳細な情報を提供します。
-
"Ensemble HL7 バージョン 2 開発ガイド" の “携帯電話および電子メールのアラート”
-
"Ensemble プロダクションの構成" の “アラートの構成”