Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

TCP 受信アダプタの使用法

この章では、TCP 受信アダプタのそれぞれ (EnsLib.TCP.CountedInboundAdapterOpens in a new tabEnsLib.TCP.CountedXMLInboundAdapterOpens in a new tab、および EnsLib.TCP.TextLineInboundAdapterOpens in a new tab) の使用方法について説明します。この章は以下の節で構成されています。

Tip:

Ensemble では、TCP アダプタを使用する特殊なビジネス・サービス・クラスとユーザのニーズに適したビジネス・サービス・クラスの 1 つも提供されます。そのため、プログラミングの必要がありません。"Ensemble の紹介" の “接続オプション” を参照してください。

また、EnsLib.TCP.InboundAdapterOpens in a new tab またはそのサブクラスのいずれかに基づいて新しい受信アダプタ・クラスを開発することもできます。後述する “カスタム TCP アダプタ・クラスの作成” の節を参照してください。

TCP 受信アダプタの概要

Ensemble には、すべてが EnsLib.TCP.InboundAdapterOpens in a new tab のサブクラスである以下の受信 TCP アダプタが用意されています。

  • EnsLib.TCP.CountedInboundAdapterOpens in a new tab は、TCP クライアントと TCP リスナがデータのブロックを交換する受信 TCP 接続をサポートします。このブロック長は、ブロックの最初の 4 バイトで指定されます。アダプタは、クライアント・アプリケーションからのデータの意味のある部分を特定するためにブロック長を使用します。

  • EnsLib.TCP.CountedXMLInboundAdapterOpens in a new tab は、XTE サーバの TCP リスナとして機能します。アダプタは XML データをカウントされた TCP 形式で受信し、XML データを Ensemble にインポートします。その結果は、インスタンス化された Ensemble オブジェクトとなります。

  • EnsLib.TCP.TextLineInboundAdapterOpens in a new tab は、TCP クライアントと TCP リスナがデータを行終端文字で終了するテキスト文字列として交換する受信 TCP 接続をサポートします。終端文字のデフォルトは新規行文字 (ASCII 10) です。

    組み込みのビジネス・サービス・クラス EnsLib.TCP.StatusServiceOpens in a new tab は、EnsLib.TCP.TextLineInboundAdapterOpens in a new tab を使用するビジネス・サービスの重要な例です。このクラスにはコマンド行インタフェースが用意されており、これをコンソール・ユーザやコマンド行スクリプトで使用して、実行中の Ensemble プロダクションから基本ステータス情報を取得できます。詳細は、後述する “TCP ステータス・サービスの追加” を参照してください。

全般的な動作

それぞれの TCP 受信アダプタが、指定されたポートでデータをチェックして、入力を読み取り、それをストリームとして関連するビジネス・サービスに送信します。ユーザが作成および構成するビジネス・サービスは、このストリームを使用してプロダクションの他の部分と通信します。以下の図は、全体的なフローを示しています。

generated description: inbound

詳細は、以下のとおりです。

  1. アダプタは、構成されたデータ・ソースからの入力を検出するたびに、ビジネス・サービス・クラスの内部 ProcessInput() メソッドを呼び出して、ストリームを入力引数として渡します。

  2. ビジネス・サービス・クラスの内部 ProcessInput() メソッドが実行されます。このメソッドは、すべてのビジネス・サービスが必要とする内部情報の保持など、基本的な Ensemble タスクを実行します。ビジネス・サービス・クラスが継承するこのメソッドは、カスタマイズや上書きを行いません。

  3. 次に、ProcessInput() メソッドがカスタム OnProcessInput() メソッドを呼び出して、入力オブジェクトを渡します。このメソッドの要件については後述します。

応答メッセージは、同じパスを逆向きにたどります。

TCP 受信アダプタを使用するビジネス・サービスの作成

プロダクション内で TCP アダプタを使用するには、ここで説明されているように、新しいビジネス・サービス・クラスを作成します。後で、それをプロダクションに追加して、構成します

存在しなければ、適切なメッセージ・クラスを作成する必要もあります。"Ensemble プロダクションの開発" の “Ensemble メッセージの定義” を参照してください。

ビジネス・サービス・クラスの基本要件を以下に列挙します。

  • ビジネス・サービス・クラスは Ens.BusinessServiceOpens in a new tab を拡張するものでなければなりません。

  • クラス内の ADAPTER パラメータは EnsLib.TCP.CountedInboundAdapterOpens in a new tabEnsLib.TCP.CountedXMLInboundAdapterOpens in a new tab、または EnsLib.TCP.TextLineInboundAdapterOpens in a new tab と一致する必要があります。

  • クラスは OnProcessInput() メソッドを実装する必要があります。これについては、“OnProcessInput() メソッドの実装” で説明します。

  • クラスは OnConnect() コールバック・メソッドを実装できます。このメソッドは、TCP 受信アダプタがリモート・システムとの新しい接続を確立するたびに呼び出されます。

    このメソッドを実装する場合は、以下のシグニチャを付与する必要があります。

    Method OnConnect(pTimeout As %Numeric) As %Status
    

    新しい接続が確立されるたびに何らかの処理 (ログオン・シーケンスやハンドシェーク・トークンの送信など) を実行する必要がある場合は、OnConnect() を実装します。timeout 引数は、TCP 受信アダプタによって自動的に指定されます。この値には、Read Timeout アダプタ設定の値が入力されます。Read Timeout の詳細は、“設定の参照先” を参照してください。

    OnConnect() がエラー・ステータスを返した場合は、新しい接続が失敗して、アダプタが切り離されます。トラップされない例外が OnConnect() 内で発生した場合、アダプタはその例外をキャッチして、OnConnect() が実装されていなかった場合と同じように処理を継続します。

  • その他のオプションと一般情報は、"Ensemble プロダクションの開発" の “ビジネス・サービス・クラスの定義” を参照してください。

Note:

スタジオには、ビジネス・サービス・スタブを作成するために使用可能なウィザードが用意されています。このウィザードにアクセスするには、[ファイル][新規作成] をクリックし、[プロダクション] タブをクリックします。次に [ビジネス・サービス] をクリックして [OK] をクリックします。このウィザードには、汎用入力引数が用意されています。ウィザードを使用する場合は、選択したアダプタに必要な特定の引数を使用するようにメソッド・シグニチャを編集することをお勧めします。次の節を参照してください。

OnProcessInput() メソッドの実装

この節では、アダプタによって異なる OnProcessInput() のメソッド・シグニチャとそのメソッドの実装方法について説明します。

EnsLib.TCP.CountedInboundAdapter の OnProcessInput() のシグニチャ

ビジネス・サービス・クラスで EnsLib.TCP.CountedInboundAdapterOpens in a new tab が使用されている場合は、OnProcessInput() メソッドに次のシグニチャを付与する必要があります。

Method OnProcessInput(pInput As %Library.GlobalCharacterStream,
                      Output pOutput As %Library.AbstractStream) As %Status

説明 :

  • pInput には TCP クライアントがアダプタに転送した受信データ・ストリームが含まれています。

  • pOutput にはビジネス・サービスが TCP クライアントに提供する可能性のあるすべての応答が含まれています。

EnsLib.TCP.CountedXMLInboundAdapter の OnProcessInput() のシグニチャ

ビジネス・サービス・クラスで EnsLib.TCP.CountedXMLInboundAdapterOpens in a new tab が使用されている場合は、OnProcessInput() メソッドに次のシグニチャを付与する必要があります。

Method OnProcessInput(pInput As %RegisteredObject,
                      Output pOutput As %RegisteredObject) As %Status

説明 :

  • pInputAccept Class Names アダプタ設定によって指定された任意のオブジェクトにすることができます。

    Accept Class Names の詳細は、“設定の参照先” を参照してください。

  • pOutput には XTE サーバに返される可能性のあるすべての応答が含まれています。

EnsLib.TCP.TextLineInboundAdapter の OnProcessInput() のシグニチャ

ビジネス・サービス・クラスで EnsLib.TCP.TextLineInboundAdapterOpens in a new tab が使用されている場合は、OnProcessInput() メソッドに次のシグニチャを付与する必要があります。

Method OnProcessInput(pInput As Ens.StringContainer,
                      Output pOutput As Ens.StringContainer) As %Status

説明 :

  • pInput には受信テキスト行が含まれています。

  • pOutput には送信応答文字列 (存在する場合) が含まれています。

OnProcessInput() の実装

すべてのケースにおいて、OnProcessInput() メソッドは以下の一部または全部を実行する必要があります。

  1. 入力オブジェクト (pInput) を検査して、その使用方法を決定します。

  2. ビジネス・サービスから送信されることになる要求メッセージのインスタンスを作成します。

    メッセージ・クラスの作成方法は、"Ensemble プロダクションの開発" の “Ensemble メッセージの定義” を参照してください。

  3. 要求メッセージの場合は、必要に応じて、入力内の値を使用してそのプロパティを設定します。

  4. ビジネス・サービスの適切なメソッドを呼び出して、要求をプロダクション内の宛先に送信します。具体的には、SendRequestSync()SendRequestAsync()、または (あまり一般的ではない) SendDeferredResponse() を呼び出します。詳細は、"Ensemble プロダクションの送信" の “要求メッセージの定義” を参照してください。

    これらの各メソッドは、ステータス (具体的には、%StatusOpens in a new tab のインスタンス) を返します。

  5. 必ず出力引数 (pOutput) を設定します。通常、受信した応答メッセージと同じように設定します。この手順は必須です。

  6. データ・ソースがその入力に対する確認または応答を期待している場合は、OnProcessInput() がこの応答を作成して、アダプタ経由でデータ・ソースに返送する必要があります。

  7. 適切なステータスを返します。この手順は必須です。

EnsLib.TCP.CountedInboundAdapter の例

EnsLib.TCP.CountedInboundAdapterOpens in a new tab を使用するビジネス・サービス・クラスの例を以下に示します。

Class Test.HL7v3.InterfaceEngine.Service.HL7TCPIn Extends Ens.BusinessService
{

 Parameter ADAPTER = "EnsLib.TCP.CountedInboundAdapter";

 Parameter SINGLEPOOLJOB = 1;

 Parameter SETTINGS = "TargetConfigNames";

 /// Configuration item to which to send messages
 Property TargetConfigNames As %String;

 Method OnProcessInput(pInput As %GlobalCharacterStream,
                      pOutput As %RegisteredObject) As %Status
 {
  Set $ZTrap = "OnProcessInputET"

  Set tRequest =
      ##class(Test.HL7v3.InterfaceEngine.Request.Message).%New()
  Set tRequest.Stream = pInput
  Set tRequest.DocType = $Case(pInput.Size < 10000, 1:"MCOA", :"CDAR2")

  If (..TargetConfigNames '= "") {
    For tCount = 1:1:$Length(..TargetConfigNames, ",") {
      Set tTarget =
          $ZStrip($Piece(..TargetConfigNames, ",", tCount), "<>W")
      Set tStatus = ..SendRequestAsync(tTarget, tRequest)
    }
  }

  Quit $$$OK

 OnProcessInputET
   Set $ZTrap = ""
   Quit $$$ERROR($$$GeneralError,"Error in OnProcessInput: "_$ZError)
 }

 /// Return an array of connections for
 /// drawing lines on the config diagram
 ClassMethod OnGetConnections(Output pArray As %String,
                              item As Ens.Config.Item)
 {
  Set (tValue,tIndex)=""
  For {
    Set tIndex = item.Settings.Next(tIndex) Quit:tIndex=""
    Set tSetting = item.Settings.GetAt(tIndex)
    If tSetting.Name="TargetConfigNames" Set tValue=tSetting.Value
  }
  For i=1:1:$L(tValue,",") {
   Set tOne=$P(tValue,",",i)
   Continue:""=tOne
   Set pArray(tOne)=""
  }
  Quit
 }
}

EnsLib.TCP.TextLineInboundAdapter の例

EnsLib.TCP.TextLineInboundAdapterOpens in a new tab を使用するビジネス・サービス・クラスの例を以下に示します。

Class TestTCPTextLine.AuthorizationTCPService Extends Ens.BusinessService
{
/// Name of the adapter class
Parameter ADAPTER = "EnsLib.TCP.TextLineInboundAdapter";

Method OnProcessInput(pInput As Ens.StringContainer,
                      pOutput As Ens.StringContainer) As %Status
{
  set $ZT = "EXCEPTION"
  set st = $$$OK

  do {
    if ('$isobject($get(pInput))) { quit }

    // Input must have the following format: 'PatientCode:ProcedureCode'
    set tSubject = pInput.StringValue
    $$$TRACE("received line "_tSubject)

    set req = ##class(TestTCPTextLine.AuthorizationRequest).%New()
    set req.PatientCode = $piece(tSubject,":",1)
    set req.ProcedureCode = $piece(tSubject,":",2)

    set st = ..SendRequestSync("AuthorizationProcess", req, .resp)
    quit:$$$ISERR(st)

    set pOutput=
      ##class(Ens.StringContainer).%New(resp.AuthorizationFlag_
        ":"_resp.AuthorizationCode)
    } while (0)

EXIT
   //do ..Adapter.Disconnect()
   quit st

EXCEPTION
   set $ZT = ""
   set st = $$$EnsSystemError
   goto EXIT
}
}

ビジネス・サービスの追加と構成

ビジネス・サービスを Ensemble プロダクションに追加するには、管理ポータルを使用して以下の操作を行います。

  1. Ensemble プロダクションにビジネス・サービス・クラスのインスタンスを追加します。

  2. ビジネス・サービスを構成します。設定の詳細は、“設定の参照先” を参照してください。

    ビジネス・サービスを構成するときに、他の設定と一緒に [許可IPアドレス] 設定の値を指定します。[許可IPアドレス] はアダプタで接続を開始する方法を示していることに注意してください。

  3. ビジネス・サービスを有効化します。

  4. プロダクションを実行します。

FeedbackOpens in a new tab