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?

あまり一般的ではないタスク

この章では、以下のあまり一般的ではない開発タスクについて説明します。

カスタム・ユーティリティ関数の定義

Ensemble には、ビジネス・ルールと DTL から呼び出すことが可能なユーティリティ関数のセットが用意されています。これらの関数については、"ビジネス・ルールの開発" の “Ensemble ユーティリティ関数” で説明します。独自の関数を追加することができ、ビジネス・ルール・エンジンとビジネス・ルール・エディタは自動的に拡張に適応します。

新しいユーティリティ関数を追加するには:

  1. Ens.Rule.FunctionSetOpens in a new tab のサブクラスである新しいクラスを作成します。このクラスは Ens.Rule.FunctionSetOpens in a new tab 以外のスーパークラスを拡張してはなりません。

  2. 定義する関数ごとに、クラス・メソッドを新しい関数セット・クラスに追加します。ポリモフィズムはサポートされていないため、正確さを期するには、これらのクラス・メソッドを最終的なものとしてマーク付けする必要があります。これは、既存の Ens.Util.FunctionSetOpens in a new tab メソッドで表示できます (Ens.Util.FunctionSetOpens in a new tabEns.Rule.FunctionSetOpens in a new tab のスーパークラスです)。

  3. 新しいクラスをコンパイルします。これでルールの式で使用する新しい関数を利用できるようになりました。これらの関数を呼び出すには、サブクラスから ClassMethod の名前を使用します。Ens.Rule.FunctionSetOpens in a new tab で定義された関数と異なり、ユーザ定義のメソッド名は、それが属するクラスを含めて完全修飾で指定する必要があります。管理ポータル内のウィザードから名前を選択してメソッドを追加すると、自動的に完全修飾名で指定されます。

以下の関数セット・クラスでは、ビジネス・ルールで使用する日付と時刻の関数の例を示します。このクラス・メソッド DayOfWeek() および TimeInSeconds() で ObjectScript 関数の $ZDATE および $PIECE を呼び出して、ObjectScript の特殊変数 $HOROLOG から目的の日付と時刻の値を抽出します。

/// Time functions to use in rule definitions.
Class Demo.HL7.MsgRouter.Functions Extends Ens.Rule.FunctionSet
{

/// Returns the ordinal position of the day in the week,
/// where 1 is Sunday, 2 is Monday, and so on.
ClassMethod DayOfWeek() As %Integer [ CodeMode = expression, Final ]
{
$zd($H,10)
}

/// Returns the time as a number of seconds since midnight.
ClassMethod TimeInSeconds() As %Integer [ CodeMode = expression, Final ]
{
$p($H,",",2)
}

}

メソッド内のデフォルトの言語は、前の例にあるように ObjectScript ですが、以下の箇所で説明しているように Language キーワードを使用してメソッドを定義する場合は、Caché Basic を使用することもできます。

  • "Caché ObjectScript リファレンス" の “クラス・キーワード” の節の “言語” エントリ

  • "Caché オブジェクトの使用法" の “メソッド” の章

Caché Basic または ObjectScript で使用可能な関数および特殊変数の完全なリストは、以下を参照してください。

このトピックで説明があるように新しい関数を追加した場合、それを参照するための構文は組み込み関数の構文と多少異なります。以下のような Ens.Rule.FunctionSetOpens in a new tab から継承されるクラスの関数を定義すると仮定します。

ClassMethod normalizaSexo(value as %String) as %String 

このクラスをコンパイルした後に、ルーティング・ルール・エディタやデータ変換ビルダなどの Ensemble ビジュアル・ツールのいずれかを使用すると、関数の選択ボックスには、[Strip]、[In]、[Contains] などの組み込み関数と共に [normalizaSexo] という関数名が表示されます。

関数の選択ボックスから組み込み関数を選択して、生成されたコードを確認するとします。その結果、Ensemble がダブルドットのメソッド呼び出し構文を使用してその関数の呼び出しを生成したこと (DTL 内)、または単にその関数を名前で参照したことがわかります (ビジネス・ルール内)。(これらの構文規則については、"ビジネス・ルールの開発" の “Ensemble ユーティリティ関数” で説明します。)

次に、ダブルドット構文で組み込みの Strip 関数を参照する DTL の <assign> 文の例を示します。

<assign property='target.cod'
        value='..Strip(source.{PatientIDExternalID.ID},"<>CW")'
        action='set'/> 

ただし、独自のユーザ定義関数を作成する場合、DTL の構文は異なります。単に関数を指定するだけでは不十分で、関数のクラス・メソッドが含まれるクラスの完全なクラス名も指定する必要があります。独自の関数 normalizaSexoHP.Util.funciones というクラスで定義されたと仮定します。その場合、関数の選択ボックスから関数を選択して生成されたコードを確認すると、以下の例のようなコードが表示されます。

<assign property='target.sexo'
        value='##class(HP.Util.funciones).normalizaSexo(source.{Sex})'
        action='set'/> 

データ変換ビルダを使用してコードを生成するのではなく、このように直接 DTL コードに文を入力する場合は、この構文の違いを認識する必要があります。

ターゲットが動的な場合の接続のレンダリング

管理ポータルには、ユーザがビジネス・ホストを選択したときに、自動的に、特定のビジネス・ホストとの接続状態が表示されます。以下に例を示します。

generated description: production connections

これを実現するために、Ensemble がビジネス・ホストの構成設定を読み取って使用します。

ただし、ビジネス・サービスが実行時にそのターゲットを動的にホストしている場合は、Ensemble がその接続を自動的に表示することはできません。この場合に、接続を表示するには、OnGetConnections() コールバック・メソッドを実装します。Ensemble は、構成ダイアグラムをレンダリングするときに、自動的に、このメソッド (デフォルトでは何もしない) を呼び出します。

OnGetConnections() のシグニチャを以下に示します。

ClassMethod OnGetConnections(Output pArray As %String, item As Ens.Config.Item) [ CodeMode = generator ]

引数は以下のとおりです。

  • pArray — このメソッドで作成される文字列。メソッドが戻るときに、文字列にはビジネス・サービスのメッセージの送信先となる構成項目の名前のカンマ区切りリストを含める必要があります。また、その時点でターゲットがない場合は、この文字列を空 ("") にします。

  • item — このビジネス・サービスを示す Ens.Config.ItemOpens in a new tab オブジェクト。

オーバーライドされた OnGetConnections() メソッドの例は、スタジオを使用して、HL7 や X12 などの Electronic Data Interchange (EDI) プロトコルで使用するために提供されている組み込みビジネス・サービスを確認してください。これらについては、"Ensemble HL7 バージョン 2 開発ガイド" や "Ensemble X12 開発ガイド" などのドキュメントで詳しく説明されています。

Ens.Director の使用によるプロダクションの開始および停止

開発中は、管理ポータルを使用してプロダクションを開始または停止するのが一般的です。展開済みで稼働中のプロダクションでは、"Ensemble プロダクションの構成" で説明されている自動開始オプションの使用をお勧めします。

プロダクションをプログラムから開始または停止するオプションもあります。そのためには、Ens.DirectorOpens in a new tab クラス内の以下のメソッドを呼び出します。

StopProduction()

Ensemble ネームスペースで現在実行中のプロダクションを停止します。

  Do ##class(Ens.Director).StopProduction()
StartProduction()

実行中のプロダクションがない限り、指定されたプロダクションを Ensemble ネームスペースで起動します。

  Do ##class(Ens.Director).StartProduction("myProduction")
RecoverProduction()

実行中のプロダクションで問題が発生しているインスタンスをクリーンアップし、Ensemble ネームスペースで新しいインスタンスを実行できるようにします。

  Do ##class(Ens.Director).RecoverProduction()

RecoverProduction() を呼び出す前に、プロダクションが異常終了したかどうかを確認する目的で GetProductionStatus() を呼び出す必要はありません。プロダクションに問題が発生していない場合、このメソッドは何も実行せずに返ります。

GetProductionStatus()

このメソッドは、参照で渡される 2 つの出力パラメータを使用して、プロダクションのステータスを返します。それらのパラメータの 1 つは、ステータスが [実行中]、[中断中]、または [問題発生] の場合のみ、プロダクション名を返します。もう 1 つのパラメータは、プロダクションの状態を返します。これは次の定数のいずれかに相当する数値です。

  • $$$eProductionStateRunning

  • $$$eProductionStateStopped

  • $$$eProductionStateSuspended

  • $$$eProductionStateTroubled

以下に例を示します。


 Set tSC=##class(Ens.Director).GetProductionStatus(.tProductionName,.tState)
 Quit:$$$ISERR(tSC)
 If tState'=$$$eProductionStateRunning {
   $$$LOGINFO($$$Text("No Production is running.")) Quit
   }

一般的なクラスやルーチンなどの Ensemble クラスの外部で、$$$eProductionStateRunning など、プロダクションの状態を確認するマクロをコードに記述できます。このためには、目的のクラスに以下の文を追加する必要があります。

#include Ensemble

これをビジネス・ホストなどの Ensemble クラスの内部で行う必要はありません。

Ens.DirectorOpens in a new tab には、Ensemble 内部フレームワーク専用のものを含む多くのクラス・メソッドが用意されています。このドキュメントに記述されている Ens.DirectorOpens in a new tab メソッドのみを、その説明のとおりに使用することをお勧めします。

Note:

^%ZSTART ルーチンを使用して Ensemble プロダクションの起動を制御しないことをお勧めします。Ensemble の起動メカニズムの方がはるかに使いやすく、プロダクション自体に密接に関連付けられています。

Ens.Director の使用による設定へのアクセス

以下の各 Ens.DirectorOpens in a new tab クラス・メソッドでは、プロダクションを実行していなくても、そのプロダクションの設定を取得できます。

GetAdapterSettings()

特定された構成項目 (ビジネス・サービスまたはビジネス・オペレーション) のすべてのアダプタ設定の値を含む配列を返します。配列には、設定名の添え字が付けられます。Caché $ORDER 関数を使用して配列の要素へアクセスできます。このメソッドの 1 番目のパラメータは、プロダクション名と設定項目名を 2 本の垂直バー (||) で区切って記述した文字列です。戻り値はステータス値です。ステータス値が $$$OK ではない場合、指定したプロダクション名 (myProd) と設定項目名 (myOp) の組み合わせが見つからなかったことを示しています。

 Set tSC=##class(Ens.Director).GetAdapterSettings("myProd||myOp",.tSettings)
GetAdapterSettingValue()

特定された構成項目 (ビジネス・サービスまたはビジネス・オペレーション) の指定されたアダプタ設定の値を返します。1 番目のパラメータは、プロダクション名と設定項目名を 2 本の垂直バー (||) で区切って記述した文字列です。2 番目のパラメータは構成設定の名前です。3 番目の出力パラメータは、呼び出しで得られたステータス値を返します。以下に例を示します。

 Set val=##class(Ens.Director).GetAdapterSettingValue("myProd||myOp","QSize",.tSC)

返されたステータス値が $$$OK ではない場合、指定したプロダクション名 (myProd) と設定項目名 (myOp) の組み合わせが見つからなかったか、指定したプロダクションと設定項目の設定には指定した名前の設定 (QSize) が見つからなかったことを示しています。

GetCurrProductionSettings()

現在実行中のプロダクションまたは最後に実行されたプロダクションのすべてのプロダクション設定の値を含む配列を返します。配列には、設定名の添え字が付けられます。このメソッドの戻り値はステータス値です。ステータス値が $$$OK ではない場合、現在のプロダクションを識別できなかったことを示しています。

 Set tSC=##class(Ens.Director).GetCurrProductionSettings(.tSettings)
GetCurrProductionSettingValue()

現在実行中のプロダクションまたは最後に実行されたプロダクションの、指定されたプロダクション設定の文字列値を返します。2 番目の出力パラメータは、呼び出しで得られたステータス値を返します。このステータス値が $$$OK ではない場合、指定した名前の設定が現在のプロダクションの設定に見つからなかったか、現在のプロダクションを識別できなかったことを示しています。

 Set myValue=##class(Ens.Director).GetCurrProductionSettingValue("mySet",.tSC)
GetHostSettings()

特定された構成項目 (ビジネス・サービス、ビジネス・プロセス、またはビジネス・オペレーション) のすべての設定の値を含む配列を返します。配列には、設定名の添え字が付けられます。このメソッドの 1 番目のパラメータは、プロダクション名と設定項目名を 2 本の垂直バー (||) で区切って記述した文字列です。戻り値はステータス値です。ステータス値が $$$OK ではない場合、指定したプロダクション名 (myProd) と設定項目名 (myOp) の組み合わせが見つからなかったことを示しています。

 Set tSC=##class(Ens.Director).GetHostSettings("myProd||myOp",.tSettings)
GetHostSettingValue()

特定された構成項目 (ビジネス・サービス、ビジネス・プロセス、またはビジネス・オペレーション) の指定された設定の値を返します。1 番目のパラメータは、プロダクション名と設定項目名を 2 本の垂直バー (||) で区切って記述した文字列です。2 番目のパラメータは構成設定の名前です。3 番目の出力パラメータは、呼び出しで得られたステータス値を返します。以下に例を示します。

 Set val=##class(Ens.Director).GetHostSettingValue("myProd||myOp","QSize",.tSC)

返されたステータス値が $$$OK ではない場合、指定したプロダクション名 (myProd) と設定項目名 (myOp) の組み合わせが見つからなかったか、指定したプロダクションと設定項目の設定には指定した名前の設定 (QSize) が見つからなかったことを示しています。

GetProductionSettings()

指定されたプロダクションのすべてのプロダクション設定の値を含む配列を返します。配列には、設定名の添え字が付けられます。このメソッドの戻り値はステータス値です。ステータス値が $$$OK ではない場合、指定したプロダクションが見つからなかったことを示しています。

 Set tSC=##class(Ens.Director).GetProductionSettings("myProd",.tSettings)
GetProductionSettingValue()

指定されたプロダクションの指定されたプロダクション設定の値を返します。3 番目の出力パラメータは、呼び出しで得られたステータス値を返します。このステータス値が $$$OK ではない場合、指定したプロダクションが見つからなかったか、指定した名前の設定が、指定したプロダクションの設定に見つからなかったことを示しています。

 Set val=##class(Ens.Director).GetProductionSettingValue("prod","set",.tSC)

Ens.DirectorOpens in a new tab には、Ensemble 内部フレームワーク専用のものを含む多くのクラス・メソッドが用意されています。このドキュメントに記述されている Ens.DirectorOpens in a new tab メソッドのみを、その説明のとおりに使用することをお勧めします。

ビジネス・サービスの直接呼び出し

言語バインディング、Caché Server Pages、SOAP、またはオペレーティング・システム・レベルで呼び出されるルーチンなどの他のメカニズムによって作成されたジョブからビジネス・サービスを直接呼び出す場合があります。これを実行できるのは、ADAPTER クラス・パラメータの値が NULL の場合だけです。この種のビジネス・サービスは、アダプタ不要型ビジネス・サービスと呼ばれています。

ビジネス・サービスを機能させるには、そのビジネス・サービス・クラスのインスタンスを作成する必要があります。%New() メソッドを呼び出してこのインスタンスを作成することはできません。代わりに、Ens.DirectorOpens in a new tabCreateBusinessService() メソッドを使用する必要があります。以下に例を示します。

  Set tSC = ##class(Ens.Director).CreateBusinessService("MyService",.tService)

Ensemble プロダクションは、起動時に、このビジネス・サービスにジョブを割り当てません。これは、[プールサイズ] の設定が 0 であることが想定されているためです。

CreateBusinessService() メソッドは、以下を実行します。

  1. プロダクションが実行中であること、およびそのプロダクションが所定のビジネス・サービスを定義していることを確かめます。

  2. 所定のビジネス・サービスが現在有効であることを確かめます。

  3. ビジネス・サービスの構成名の名前解決を行い、正しい設定値を使って正しいビジネス・サービス・オブジェクトをインスタンス化します (プロダクションが、別の名前と設定を持つ同一のビジネス・サービス・クラスを使って、多くのビジネス・サービスを定義している可能性もあります)。

CreateBusinessService() メソッドが成功すると、ビジネス・サービス・クラスのインスタンスを参照によって返します。これに続けて、その ProcessInput() メソッドを直接呼び出すことができます。ProcessInput() メソッドに対し、このメソッドが期待する入力オブジェクトのインスタンスを提供する必要があります。以下に例を示します。

If ($IsObject(tService)) {
  Set input = ##class(MyObject).%New()
  Set input.Value = 22
  Set tSC = tService.ProcessInput(input,.output)
}

CreateBusinessService() メソッドを呼び出したときに、認証情報へのアクセスが必要な InProc ビジネス・オペレーションをビジネス・サービスが呼び出す場合は、"Ensemble リリース・ノート" の “認証情報パスワードの格納に使用する新しいグローバルおよびデータベース” を参照してください。

Ens.DirectorOpens in a new tab には、Ensemble 内部フレームワーク専用のものを含む多くのクラス・メソッドが用意されています。このドキュメントに記述されている Ens.DirectorOpens in a new tab メソッドのみを、その説明のとおりに使用することをお勧めします。

受信アダプタの作成またはサブクラス化

この節では、受信アダプタを作成またはサブクラス化する方法について説明します。

受信アダプタの概要

受信アダプタは、外部システムからの要求を受信し、検証します。

受信アダプタ・クラスは、ビジネス・サービス・クラスとの組み合わせで機能します。一般に、受信アダプタには汎用目的で再利用可能なコードが含まれていますが、ビジネス・サービスにはプロダクション固有のコード (特別な検証ロジックなど) が含まれています。通常は、Ensemble の組み込みアダプタ・クラスのいずれかを使用して受信アダプタ・クラスを実装します。下の図は、プロダクションでどのように受信要求が受け付けられるかを示しています。

generated description: business service

一般に、外部アプリケーションが特定の処理の実行を要求すると、上の図のように、その要求は受信アダプタを経由して Ensemble 内に入ってきます。この要求する側のアプリケーションは、“クライアント”・アプリケーションと呼ばれます。プロダクションに何かをするように依頼したためです。さらに、このアプリケーションはプロダクションの “クライアント” と呼ばれます。この段階で機能する要素が受信アダプタです。受信アダプタは、クライアントのネイティブな要求形式をプロダクションが理解できるものに変換する “アダプタ” として働く、コードの断片です。プロダクションに要求を出す各アプリケーションは、自分自身で受信アダプタを備える必要があります。クライアント・アプリケーションのコードを変更する必要はありません。それは、アダプタが、クライアント・アプリケーションでネイティブな呼び出しを処理するためです。

受信アダプタの定義

受信アダプタ・クラスを作成するには、次のようにクラスを作成します。

  • クラスは、Ens.InboundAdapterOpens in a new tab (またはサブクラス) を拡張する必要があります。

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

  • クラスは設定を定義できます。前述した “設定の追加と削除” を参照してください。

  • クラスは任意のまたはすべてのスタートアップ・メソッドおよびティアダウン・メソッドを実装できます。この章の “開始動作と停止動作の上書き” を参照してください。

  • クラスには Ensemble 資格情報を含めることができます。この章の “アダプタ・クラスへの資格情報の追加” を参照してください。

  • クラスにはその内部で作業を完了するためのメソッドを含めることができます。

以下に例を示します。

Class MyProduction.InboundAdapter Extends Ens.InboundAdapter
{

Parameter SETTINGS = "IPAddress,TimeOut";

Property IPAddress As %String(MAXLEN=100);

Property TimeOut As %Integer(MINVAL=0, MAXVAL=10);

Property Counter As %Integer;

Method OnTask() As %Status
{
  #; First, receive a message (note, timeout is in ms)
  Set msg = ..ReceiveMessage(..CallInterval*1000,.tSC)

  If ($IsObject(msg)) {
    Set tSC=..BusinessHost.ProcessInput(msg)
  }

  Quit tSC
}

}
Note:

スタジオには、上記のようなクラス・スタブの作成に使用可能なウィザードが用意されています。このウィザードにアクセスするには、[ファイル][新規作成] をクリックし、[プロダクション] タブをクリックします。次に [アダプタ] をクリックして [OK] をクリックします。

OnTask() メソッドの実装

OnTask() メソッドでは、受信アダプタの処理が実際に行われます。このメソッドの用途を以下に示します。

  1. Ensemble が受け取るイベントのチェック。受信アダプタは、この処理をさまざまな方法で行うことができます。例えば、Ensemble が受け取る I/O イベント (TCP ソケットの読み取りなど) を待機する方法や、外部データ (ファイルなど) が存在するかどうかを定期的にポーリングする方法などが考えられます。

    ほとんどの事前構築受信アダプタには、OnTask() の呼び出し間隔を制御する CallInterval という設定があります。このアプローチも使用できます。

  2. このイベントから受け取った情報を、ビジネス・サービス・クラスが期待する型のオブジェクトにパッケージ化します。

  3. ビジネス・サービス・オブジェクトの ProcessInput() メソッドを呼び出します。

  4. 必要に応じて、イベントを受け取った外部システムに対して通知を返します。

  5. さらに入力データがある場合は、OnTask() で以下のいずれかを実行できます。

    • すべてのデータが取得されるまで、ProcessInput() を繰り返し呼び出します。

    • 複数の入力イベントが存在する場合でも、CallInterval ごとに 1 回だけ ProcessInput() を呼び出します。

受信アダプタを設計する際は、OnTask() メソッドはビジネス・サービスに対して定期的にコントロールを返す必要があるということ、つまり、OnTask() メソッドは受信イベントをいつまでも待ち続けてはならないということに注意してください。いつまでも待つ代わりに、例えば 10 秒間だけ待機して、それからビジネス・サービスに制御を返します。ビジネス・サービス・オブジェクトは Ensemble 内のイベントを定期的にチェックしなければならないというのがその理由です。プロダクションの終了通知はこのイベントの例です。

逆に、OnTask() メソッドはイベントを効率的に待ち受けます。—イベントを頻繁にポーリングして待ち受けると CPU サイクルの浪費につながり、プロダクション全体のパフォーマンス低下を引き起こしかねません。OnTask() メソッドが待機する必要がある場合は、プロセスを休眠状態にするような方法 (I/O イベント待ちや Hang コマンドの使用など) で待機する必要があります。

クラスが Ensemble アダプタのサブクラスの場合は、OnTask() を実装している可能性があります。その場合は、受信アダプタ・クラスで指定されているように、サブクラスで別のメソッドを上書きする必要があります。

送信アダプタの作成またはサブクラス化

この節では、送信アダプタを作成またはサブクラス化する方法について説明します。

送信アダプタの概要

送信アダプタは、要求を外部システムに送信します。下の図は、プロダクションでどのように送信要求が中継されるかを示しています。

generated description: business operation

送信アダプタは、外部アプリケーションまたは外部データベースのネイティブ・プログラミング・インタフェースを、Ensemble のプロダクションで認識可能な形式に “適合させる” コードの一部です。ビジネス・オペレーションを通してプロダクションへ応答を行う各外部アプリケーションまたはデータベースには、独自の送信アダプタが必要です。ただし、外部アプリケーションまたはデータベース内のすべてのメソッドを送信アダプタにマッピングする必要はなく、プロダクションで必要とされるオペレーションだけをマッピングします。受信アダプタと同様、送信アダプタを作成するために外部アプリケーション自体を変更する必要はありません。また、アダプタ自体の概念も、プロダクションと特定のアプリケーション間またはプロダクション外のデータベース間での要求、応答、およびデータを中継するというシンプルなものです。

送信アダプタ・クラスは、ビジネス・オペレーション・クラスとの組み合わせで機能します。一般に、送信アダプタには汎用目的で再利用可能なコードが含まれていますが、ビジネス・オペレーションにはプロダクション固有のコード (特別な処理ロジックなど) が含まれます。通常は、Ensemble の組み込みアダプタ・クラスを使用して、送信アダプタ・クラスを実装します。

送信アダプタの定義

送信アダプタ・クラスを作成するには、次のようにクラスを作成します。

  • クラスは、Ens.OutboundAdapterOpens in a new tab (またはサブクラス) を拡張する必要があります。

  • クラスは、対応するビジネス・オペレーションを呼び出すための 1 つ以上のメソッドを定義する必要があります。すべての送信アダプタで、関連するビジネス・オペレーション・クラスによって使用されるアダプタ独自の API (メソッドのセット) を自由に定義できます。

  • クラスは設定を定義できます。前述した “設定の追加と削除” を参照してください。

  • クラスは任意のまたはすべてのスタートアップ・メソッドおよびティアダウン・メソッドを実装できます。この章の “開始動作と停止動作の上書き” を参照してください。

  • クラスには Ensemble 資格情報を含めることができます。この章の “アダプタ・クラスへの資格情報の追加” を参照してください。

  • クラスにはその内部で作業を完了するためのメソッドを含めることができます。

アダプタ・クラスへの資格情報の追加

アダプタ・クラスに Ensemble 資格情報を含めるには、クラス定義内で次の手順を実行します。

  • Credentials という設定を追加します。

  • 資格情報テーブル内のユーザ名とパスワードを検索するためのキーとして Credentials 設定の値を使用する CredentialsSet() というメソッドを定義します。このメソッドにより、ユーザ名とパスワードで構成された資格情報オブジェクトがインスタンス化されます。

Ensemble 資格情報の上書き

Ensemble の資格情報システムが管理を集中化してソース・コードの外部でログイン・データを維持しますが、別のソースから資格情報を取得するコードを作成しなければならない場合があります。例えば、お使いのコードは、Web フォームや Cookie からユーザ名とパスワードを取得してから、これらを HTTP 送信アダプタで使用して、他のサイトに接続する場合があります。

これを処理するには、アダプタのメソッドを呼び出す前に、ビジネス・サービス・コードまたはビジネス・オペレーション・コード内で、以下の両方を実行します。

  • 資格情報オブジェクトをインスタンス化して、それにユーザ名とパスワードの値を割り当てるコードを入力します。

  • その後、アダプタの Credentials プロパティを設定したり、アダプタの CredentialsSet() メソッドを呼び出さないでください。値がリセットされる可能性があります。

以下に例を示します。

  If ..Adapter.Credentials="" {
     Set ..Adapter.%CredentialsObj=##class(Ens.Config.Credentials).%New()
  }
  Set ..Adapter.%CredentialsObj.Username = tUsername
  Set ..Adapter.%CredentialsObj.Password = tPassword

このコードには、EnsLib.HTTP.OutboundAdapterOpens in a new tab が使用できる資格情報オブジェクトがありますが、オブジェクト内の値は [認証情報] テーブルから取得しません。

開始動作と停止動作の上書き

Ensemble には、プロダクション、そのビジネス・ホスト、またはそのアダプタのライフ・サイクル期間の開始時点と終了時点でカスタム処理を追加するために上書き可能なコールバック・メソッドのセットが用意されています。デフォルトで、これらのメソッドは何もしません。

プロダクション・クラス内のコールバック

プロダクションの起動前に実行することが必要なコードがあり、そのコードを実行する前に Ensemble フレームワークを実行しておく必要がある場合は、プロダクション・クラスの OnStart() メソッドをオーバーライドする必要があります。OnStart() に目的のコード文を配置し、適切な順序で実行されるようにします。つまり、Ensemble が起動した、プロダクションが要求の受け付けを開始する前に実行されるようにします。また、OnStop() メソッドを使用すると、プロダクションがシャットダウンを終了する前に一連のタスクを実行できます。

ビジネス・ホスト・クラス内のコールバック

ビジネス・サービス、ビジネス・プロセス、ビジネス・オペレーションなどのビジネス・ホストは、Ens.HostOpens in a new tab のサブクラスです。これらのクラスのどれでも、OnProductionStart() メソッドをオーバーライドして、このホストのためにプロダクションの起動時に実行するコード文を指定できます。OnProductionStop() メソッドを実装することもできます。

例えば、プロダクションでプロパティ値の初期設定を変える必要がある場合は、ビジネス・オペレーションの OnInit() メソッドで値を設定します。例えば、LineTerminator プロパティの初期設定を、オペレーティング・システムに依存するように変更するには、以下のように設定します。

 Method OnInit() As %Status
  {
      Set ..Adapter.LineTerminator="$Select($$$isUNIX:$C(10),1:$C(13,10))"
      Quit $$$OK
  }

アダプタ・クラス内のコールバック

アダプタ・クラスは、OnInit() メソッドをオーバーライドできます。このメソッドは、アダプタ・オブジェクトが作成され、その構成可能なプロパティ値が設定された後に呼び出されます。OnInit() メソッドは、アダプタが特別な設定処理を実行するための方法を提供します。

例えば、次の OnInit() メソッドは、アダプタの起動時にデバイスとの接続を確立します。この場合は、このアダプタが ConnectToDevice() メソッドも実装していることを前提とします。

Method OnInit() As %Status
{
  // Establish a connection to the input device
  Set tSC = ..ConnectToDevice()
  Quit tSC
}

アダプタ・クラスは、OnTearDown() メソッドもオーバーライドできます。このメソッドは、アダプタ・オブジェクトが破棄される前のシャットダウン中に呼び出されます。OnTearDown() メソッドは、アダプタが特別なクリーンアップ処理を実行するための方法を提供します。

例えば、次の OnTearDown() メソッドは、アダプタの停止時にデバイスとの接続を閉じます。この場合は、このアダプタが CloseDevice() メソッドも実装していることを前提とします。

Method OnTearDown() As %Status
{
  // close the input device
  Set tSC = ..CloseDevice()
  Quit tSC
}

プログラムによるルックアップ・テーブルの操作

Ensemble には、ビジネス・ルールまたは DTL データ変換からテーブル検索を容易に実行できるように、Lookup() というユーティリティ関数が用意されています。この関数は、ルックアップ・テーブルが 1 つ以上作成され、各テーブルに適切なデータが入力されている場合にのみ機能します。

ルックアップ・テーブルの定義方法は、"Ensemble プロダクションの構成" の “データ・ルックアップ・テーブルの定義” を参照してください。

ルックアップ・テーブルを管理ポータルよりも直接的に操作する必要がある場合は、Ens.Util.LookupTableOpens in a new tab クラスを使用します。このクラスは、ルックアップ・テーブルをオブジェクトまたは SQL を介してアクセスできるようにします。さらに、このクラスは、テーブルの消去、XML としてのデータのエクスポート、および XML からのデータのインポートを行うクラス・メソッドを提供します。

Ens.Util.LookupTableOpens in a new tab には、以下の文字列プロパティが含まれています。

TableName

検索テーブルの名前。最大 255 文字です。ネームスペース内で定義されたルックアップ・テーブルを表示するには、Ensemble ポータルで [Ensemble][構成する][データ・ルックアップ・テーブル] の順に選択してから、[開く] を選択します。

KeyName

検索テーブルにあるエントリのキー。最大 255 文字です。これは、Ensemble, 検索テーブル ページの [キー] フィールドの値です。

DataValue

検索テーブルでこのキーに関連付けられた値。最大 32,000 文字です。これは、Ensemble, 検索テーブル ページの [値] フィールドの値です。

SQL クエリの例を以下に示します。

SELECT KeyName,DataValue FROM Ens_Util.LookupTable WHERE TableName = 'myTab'

Ens.Util.LookupTableOpens in a new tab には、以下のクラス・メソッドも含まれています。

%ClearTable()

指定されたルックアップ・テーブルの内容を削除します。

  do ##class(Ens.Util.LookupTable).%ClearTable("myTab")
%Import()

指定された XML ファイルからルックアップ・テーブル・データをインポートします。インポートを正常に行うには、このクラスの %Export() メソッドにより指定された XML 形式と同じ形式をファイルで使用する必要があります。

  do ##class(Ens.Util.LookupTable).%Import("myFile.xml")
%Export()

指定された XML ファイルにルックアップ・テーブル・データをエクスポートします。指定されたファイルが既に存在している場合、そのファイルは新しいデータで上書きされます。ファイルが存在していない場合は、作成されます。以下の例では、指定した検索テーブル myTab の内容のみがエクスポートされます。

  do ##class(Ens.Util.LookupTable).%Export("myFile.xml","myTab")

以下の例では、ネームスペースにあるすべての検索テーブルの内容がエクスポートされます。

  do ##class(Ens.Util.LookupTable).%Export("myFile.xml")

得られる XML ファイルは、以下の例のようになります。すべてのテーブルにある各エントリは、単一の <lookupTable> 要素にある兄弟要素の <entry> として記述されます。

<?xml version="1.0"?>
<lookupTable>
  <entry table="myOtherTab" key="myKeyA">aaaaaa</entry>
  <entry table="myOtherTab" key="myKeyB">bbbbbbbbb</entry>
  <entry table="myTab" key="myKey1">1111</entry>
  <entry table="myTab" key="myKey2">22222</entry>
  <entry table="myTab" key="myKey3">333333</entry>
</lookupTable>

<entry ごとに、そのエントリを含むテーブルを table 属性で特定します。key 属性は、キーの名前を指定します。<entry> 要素のテキストは、そのエントリの値を表します。

前述の XML 形式のほか、SQL インポート・ウィザードを使用して、テーブルとキーで構成するカンマ区切り形式 (CSV) ファイルをインポートすることもできます。

カスタム・アーカイブ・マネージャの定義

Ensemble では、管理ポータルに、アーカイブ・マネージャと呼ばれるツールが用意されています。これについては、"Ensemble の管理" で説明します。カスタム・アーカイブ・マネージャを定義して使用できます。そのためには、次のようにクラスを作成します。

  • スーパークラスとして Ens.Archive.ManagerOpens in a new tab を使用できます。

  • DoArchive() メソッドを定義する必要があります。このメソッドには、以下のシグニチャが設定されています。

    ClassMethod DoArchive() As %Status
    

代替オプションとして、エンタープライズ・メッセージ・バンクを使用すれば、複数のプロダクションからのメッセージをアーカイブできます。概要は、前述した “エンタープライズ・メッセージ・バンクの定義” を参照してください。

FeedbackOpens in a new tab