Tip:
InterSystems IRIS® では、TCP アダプタを使用する特殊なビジネス・サービス・クラスとユーザのニーズに適したビジネス・サービス・クラスの 1 つも提供されます。そのため、プログラミングの必要がありません。"相互運用プロダクションの概要" の “接続オプション” を参照してください。
また、EnsLib.TCP.InboundAdapterOpens in a new tab またはそのサブクラスのいずれかに基づいて新しい受信アダプタ・クラスを開発することもできます。後述する “カスタム TCP アダプタ・クラスの作成” の節を参照してください。
TCP 受信アダプタを使用するビジネス・サービスの作成
プロダクション内で TCP アダプタを使用するには、ここで説明されているように、新しいビジネス・サービス・クラスを作成します。後で、それをプロダクションに追加して、構成します。
存在しなければ、適切なメッセージ・クラスを作成する必要もあります。"プロダクションの開発" の “メッセージの定義” を参照してください。
スタジオには、ビジネス・サービス・スタブを作成するために使用可能なウィザードが用意されています。このウィザードにアクセスするには、[ファイル]→[新規作成] をクリックし、[プロダクション] タブをクリックします。次に [ビジネス・サービス] をクリックして [OK] をクリックします。このウィザードには、汎用入力引数が用意されています。ウィザードを使用する場合は、選択したアダプタに必要な特定の引数を使用するようにメソッド・シグニチャを編集することをお勧めします。次の節を参照してください。
ビジネス・サービス・クラスの基本要件を以下に列挙します。
-
ビジネス・サービス・クラスは Ens.BusinessServiceOpens in a new tab を拡張するものでなければなりません。
-
クラス内の ADAPTER パラメータは EnsLib.TCP.CountedInboundAdapterOpens in a new tab、EnsLib.TCP.CountedXMLInboundAdapterOpens in a new tab、または EnsLib.TCP.TextLineInboundAdapterOpens in a new tab と一致する必要があります。
-
クラスは OnProcessInput() メソッドを実装する必要があります。これについては、“OnProcessInput() メソッドの実装” で説明します。
-
クラスは OnConnect() コールバック・メソッドを実装できます。このメソッドは、TCP 受信アダプタがリモート・システムとの新しい接続を確立するたびに、OnTask() メソッドの後に呼び出されます。
このメソッドを実装する場合は、以下のシグニチャを付与する必要があります。
Method OnConnect(pTimeout As %Numeric) As %Status
新しい接続が確立されるたびに何らかの処理 (ログオン・シーケンスやハンドシェーク・トークンの送信など) を実行する場合は、OnConnect() を実装します。timeout 引数は、TCP 受信アダプタによって自動的に指定されます。この値には、Read Timeout アダプタ設定の値が入力されます。Read Timeout の詳細は、“設定の参照先” を参照してください。
OnConnect() がエラー・ステータスを返した場合は、新しい接続が失敗して、アダプタが切り離されます。トラップされない例外が OnConnect() 内で発生した場合、アダプタはその例外をキャッチして、OnConnect() が実装されていなかった場合と同じように処理を継続します。
その他のオプションと一般情報は、"プロダクションの開発" の “ビジネス・サービス・クラスの定義” を参照してください。
-
クラスでは、OnInit() メソッドを実装して特殊な設定アクションを実行できます。このメソッドは、%OnNew() メソッドから呼び出します。[接続毎のジョブ] 設定を true に設定すると、リスナが接続を受け入れるために新しいジョブを生成するたびに、OnInit() が %OnNew() から呼び出されます。
-
クラスでは、OnTearDown() メソッドを実装して特殊なティアダウン・アクション (終了処理) を実行できます。このメソッドは、%OnClose() メソッドから呼び出します。具体的には、%OnClose() によって、アダプタの OnTearDown() メソッドが呼び出された後、ビジネス・サービスの OnTearDown() メソッドが呼び出されます。[接続毎のジョブ] 設定を true に設定すると、OnTearDown() は、接続ジョブが閉じられる直前に呼び出されます。
Important:
新規のビジネス・サービス・クラスで、OnTearDown() メソッドにカスタム・コードを含める場合、そのビジネス・サービスが適切に機能するように、そのカスタム・コードでスーパークラスの OnTearDown() メソッドを呼び出す必要があります。以下に例を示します。
//Sets a node of the ^%zexample global to the ID of the current process
// and invokes the OnTearDown() method of the superclass
Method OnTearDown() As %Status
{
set ^%zexample($i(^%zexample),"onteardown")=$j
Return ##super()
}
エラーを処理するために、適宜、Try/Catch ロジックを実装する必要もあります。スーパークラス・メソッドを呼び出す方法の詳細は、"##super 構文" を参照してください。
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
}
}