メッセージの定義
このページでは、プロダクション・メッセージ・ボディを定義するクラスの定義方法について説明します。
概要
メッセージ・ボディは、任意の永続オブジェクトにすることができます。
実際には、Ens.Util.RequestBodyMethodsOpens in a new tab または Ens.Util.ResponseBodyMethodsOpens in a new tab のサブクラスを作成してプロパティを追加する方法が一般的です。これにより、標準のメッセージ・ボディが作成されます。これらのクラスを使用すれば、管理ポータルでメッセージの内容を表示するためのさまざまな組み込み機能に簡単にアクセスできます。これらの機能により、開発者や管理者がプロダクション実行時のエラーを見つけるのに役立ちます。特に、プロダクションでメッセージの内容を使用して送信先を決定する場合には有効です。
X12 などの Electronic Data Interchange (EDI) 形式の一部の電子ドキュメントには、長さがまちまちで、複雑なデータが含まれています。この場合は、代替クラスの InterSystems IRIS® 仮想ドキュメントを表すクラスを使用する方が適しています。またこの場合、メッセージの内容を含む一連のプロパティがメッセージ・ボディに含まれていません。詳細は、"プロダクション内での仮想ドキュメントの使用法" を参照してください。
このドキュメントのほとんどの例では、標準のメッセージ本文と比較的少数のメッセージ・プロパティが想定されています。
単純なメッセージ・ボディ・クラスの作成
メッセージ・クラス (メッセージ・ボディとして使用する) を作成するには、次のようなクラスを作成します。
-
Ens.Util.RequestBodyMethodsOpens in a new tab と Ens.Util.ResponseBodyMethodsOpens in a new tab のどちらかを拡張する。
-
必要に応じて、メッセージ内で転送すべきデータの要素を表すプロパティを含む。
簡単な例を以下に示します。
Class Demo.Loan.Msg.CreditRatingResponse Extends Ens.Util.ResponseBodyMethods
{
Property TaxID As %String;
Property CreditRating As %Integer;
}
クラスにはメソッドを含めることもできます。以下に例を示します。
Class Demo.Loan.Msg.Application Extends Ens.Util.RequestBodyMethods
{
Property Amount As %Integer;
Property Name As %String;
Property TaxID As %String;
Property Nationality As %String;
Property BusinessOperationType As %String;
Property Destination As %String;
Method RecordNumber() As %String
{
If ..%Id()="" Do ..%Save()
Quit ..%Id()
}
Method GetRecordNumberText(pFormatAsHTML As %Boolean = 0) As %String
{
Set tCRLF=$s(pFormatAsHTML:"<br>",1:$c(13,10))
Set tText=""
Set tText=tText_"Your loan application has been received,"_tCRLF
Set tText=tText_"and is being processed."_tCRLF
Set tText=tText_"Your record number is "_..RecordNumber()_"."_tCRLF
Set tText=tText_"You'll receive a reply from FindRate"_tCRLF
Set tText=tText_"within 2 business days."_tCRLF
Set tText=tText_"Thank you for applying with FindRate."_tCRLF
Quit tText
}
}
カスタムのメッセージ・クラスを作成する方法もありますが、その場合は、メッセージの検索を迅速にするために、そのクラス専用のテーブルにのみメッセージが格納されるようにクラスを定義することが重要です。そのためには、%PersistentOpens in a new tab をプライマリ・スーパークラスとして使用し、メッセージが要求であれば Ens.RequestOpens in a new tab、応答であれば Ens.ResponseOpens in a new tab をそれに続けて記述します。例えば以下のようにします。
Class Demo.Loan.Msg.CreditRatingResponse Extends (%Persistent, Ens.Response)
{
Property TaxID As %String;
Property CreditRating As %Integer;
}
(クラス・パラメータの USEEXTENTSET と DEFAULTGLOBAL を使用して、クラス専用のテーブルにメッセージが格納されるようにすることもできます。詳細は、%PersistentOpens in a new tab のクラス・リファレンスを参照してください。)
Ens.RequestOpens in a new tab または Ens.ResponseOpens in a new tab をプライマリ・スーパークラスにした場合、このメッセージの保存先は、他のすべてのリクエストとレスポンスも格納されるテーブルになります。これにより、メッセージ・テーブルを問い合わせる際のパフォーマンスが低下することがあります。
永続クラスに基づくクラスを作成する方法もあり、必要に応じてそのクラスに別のスーパークラスとして %XML.AdaptorOpens in a new tab を設定できます (%XML.AdaptorOpens in a new tab を使用すると、管理ポータルにメッセージを XML 形式で表示できます)。
複雑なメッセージ・ボディ・クラスの作成
前の例では、メッセージ・ボディ・クラスに単純なプロパティしか含まれていませんでした。他のクラスを使用するプロパティを定義しなければならない場合があります。その場合は、メッセージ・ボディをパージするときにすべきことを慎重に検討する必要があります ("プロダクションの管理" を参照してください)。
メッセージ・ボディをパージすると、InterSystems IRIS では特定のメッセージ・ボディ・オブジェクトのみが削除されます。例えば、以下のメッセージ・クラスがあるとします。
Class MyApp.Messages.Person Extends Ens.Util.RequestBodyMethods
{
Property Name As %String;
Property MRN As %String;
Property BirthDate As %Date;
Property Address As MyApp.Messages.Address;
}
Address クラスは次のとおりです。
Class MyApp.Messages.Address Extends %Persistent
{
Property StreetAddress As %String;
Property City As %String;
Property State As %String;
Property ZIP As %String;
}
この場合は、メッセージ・ボディをパージすると、InterSystems IRIS によって MyApp.Messages.Person のインスタンスが削除されますが、MyApp.Messages.Address のインスタンスは削除されません。
メッセージ・ボディ・クラスで他のクラスがプロパティとして使用されている場合とアプリケーションで任意の参照オブジェクトもパージしなければならない場合は、以下のアプローチのいずれかを使用します。
-
参照クラスがシリアルであることを確認します。例えば、次のように、Address クラスを再定義します。
Class MyApp.Messages.Address Extends %SerialObject { ... }
この場合は、Address クラスのデータが Person クラスの一部として保存されます (そのため、自動的に同時にパージされます)。
-
適切なリレーションシップとしてプロパティを定義します。"リレーションシップ" を参照してください。
-
メッセージ・クラスに削除トリガまたは %OnDelete() メソッドを追加して、参照クラス内の該当するレコードを削除できるようにします。
-
オプションで、%XML.AdaptorOpens in a new tab をスーパークラスとして含めることによって、参照クラス内で定義されたプロパティが管理ポータルに表示されるようにします。
メッセージのパージ動作の設定
メッセージ・ボディ・クラスを定義する際には、ENSPURGE パラメータを含めて、パージ処理時にそのクラスのインスタンスを InterSystems IRIS でどのように処理するかを指定できます。このパラメータに指定できる値は以下の 2 つです。
-
0 — InterSystems IRIS は、メッセージ・ボディをパージするオプションが有効になっている場合でも、クラスに基づいてメッセージ・ボディをパージすることはありません。
-
1 — InterSystems IRIS は、メッセージ・ボディをパージするオプションが有効になっている場合、クラスに基づいてメッセージ・ボディをパージします。
ENSPURGE パラメータは、エンタープライズ・メッセージ・バンクでのパージ処理を除いて、管理ポータルからのすべてのパージ処理に影響を与えます。同様に、このパラメータは、Ens.MessageHeaderOpens in a new tab クラスの Purge() メソッドを使用したプログラムによるパージにも影響を与えます。
例えば、以下の Sample.Person 永続データベース・クラスを見てみましょう。
Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
Property Name As %String(POPSPEC = "Name()") [ Required ];
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
Property DOB As %Date(POPSPEC = "Date()");
...
}
患者情報を更新するビジネス・オペレーションに Sample.Person オブジェクトを送信するようプロダクションを構成する場合、そのオブジェクトの保持が重要になると考えられます。システムで Sample.Person メッセージ・ボディ・クラスのいずれのインスタンスもパージされないようにするために、以下のように、クラス定義に ENSPURGE パラメータを追加できます。
Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
Parameter ENSPURGE As %Boolean = 0;
Property Name As %String(POPSPEC = "Name()") [ Required ];
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
Property DOB As %Date(POPSPEC = "Date()");
...
}
それ以降のパージでは、Sample.Person メッセージ・ボディ・クラスに基づいて、メッセージのヘッダのみが削除されるようになります。メッセージ・ボディは実質的に孤立して、プログラムでのみ削除可能となります。詳細は、"プロダクション・データのパージ" を参照してください。
ENSPURGE パラメータは、継承可能で、必須ではありません。既定値は 1 です。