メッセージの定義
このページでは、InterSystems IRIS® データ・プラットフォームの相互運用プロダクションのメッセージ・ボディを格納するクラスの定義方法について説明します。
メッセージ・ボディのタイプ
メッセージ・ボディ・クラスは永続クラスでなければなりません。プロダクションから送信されたメッセージはすべて、システム管理者がパージするまでデータベースに格納されます。メッセージ・ボディ・クラスには、一般に、標準メッセージ・ボディと仮想ドキュメントの 2 つのタイプがあります。標準メッセージ・ボディには、メッセージ・データを格納する複数のプロパティがあり、仮想ドキュメントには、シリアル化された形式でメッセージ・データすべてが格納されるという違いがあります。標準メッセージ・ボディは、メッセージの形式が常に同じ場合に適しています。データの長さが任意の場合やデータが複雑な場合は、代わりに仮想ドキュメントを使用する必要があります。Electronic Data Interchange (EDI) 形式の場合、InterSystems IRIS では仮想ドキュメントを使用します。
いずれにしても、InterSystems IRIS が提供するツールにより、データ変換、ルーティング、またはビジネス・ルールのために、メッセージ内の特定の要素にアクセスできます。
標準メッセージ・ボディは、単純 (オブジェクト以外のプロパティのみが含まれる) な場合と複雑 (オブジェクト値のプロパティが含まれる) な場合があります。
仮想ドキュメントの詳細は、"プロダクション内での仮想ドキュメントの使用法" を参照してください。このページの以降の部分では、標準メッセージ・ボディのみについて説明します。
単純なメッセージ・ボディ・クラスの作成
単純な標準メッセージ・クラスを作成するには、次のようなクラスを作成します。
-
%PersistentOpens in a new tab を拡張します。
一般的に、メッセージの検索時に最高のパフォーマンスを得るには、メッセージの格納方法を考慮すること、特に異なるタイプのメッセージが異なるテーブルに格納されるようにすることが重要です。"メッセージの格納" を参照してください。単純な標準メッセージ・クラスを作成するための代替方法についても説明しています。
-
また、クラスが要求メッセージと応答メッセージのどちらとして使用されるかに応じて、Ens.Util.RequestBodyMethodsOpens in a new tab または Ens.Util.ResponseBodyMethodsOpens in a new tab をそれぞれ拡張します。 これらのクラスを使用すれば、管理ポータルでメッセージの内容を表示するためのさまざまな組み込み機能に簡単にアクセスできます。これらの機能により、開発者や管理者がプロダクション実行時のエラーを見つけるのに役立ちます。特に、プロダクションでメッセージの内容を使用して送信先を決定する場合には有効です。
-
オプションで、%XML.AdaptorOpens in a new tab または %JSON.AdaptorOpens in a new tab も拡張します。この場合、管理ポータルでは XML 形式または JSON 形式で全メッセージを表示できます。"表示の制御" も参照してください。
-
必要に応じて、メッセージ内で転送すべきデータの要素を表すプロパティを含む。
-
オプションで、ENSPURGE パラメータの値を指定します。"メッセージのパージ動作の指定" を参照してください。
簡単な例を以下に示します。
Class Demo.Loan.Msg.CreditRatingResponse Extends (%Persistent, Ens.Util.ResponseBodyMethods)
{
Property TaxID As %String;
Property CreditRating As %Integer;
}
クラスにはメソッドを含めることもできます。以下に例を示します。
Class Demo.Loan.Msg.Application Extends (%Persistent, 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.Util.RequestBodyMethodsOpens in a new tab または Ens.Util.ResponseBodyMethodsOpens in a new tab を拡張できます。
-
メッセージ・クラスは、%PersistentOpens in a new tab を拡張してから、Ens.RequestOpens in a new tab または Ens.ResponseOpens in a new tab を拡張できます。
Important:この場合のように、複数の永続スーパークラスを使用する場合、スーパークラスの順序が重要です。Ens.RequestOpens in a new tab または Ens.ResponseOpens in a new tab が最初にリストされる場合、このメッセージの保存先は、他のすべての要求と応答も格納されるテーブルになります。これにより、メッセージ・テーブルを問い合わせる際のパフォーマンスが低下することがあります。
-
メッセージ・クラスは、任意の永続クラスを拡張でき、USEEXTENTSET および DEFAULTGLOBAL クラス・パラメータを使用できます。これにより、他の方法でデータはそれ自体のテーブルに格納されます。詳細は、%PersistentOpens in a new tab のクラス・リファレンスを参照してください。
表示の制御
管理ポータルでは、メッセージ・ビューワとビジュアル・トレースの両方に、メッセージ・ボディを表示する 2 つのタブがあります。
-
[ボディ] タブには、メッセージ・ボディがテーブルとして表示され、1 列目がメッセージ・クラスのプロパティを表し、2 列目が対応する値を表します。このテーブルには、オブジェクト値プロパティは表示されません。
-
[コンテンツ] タブには、可能であれば、メッセージ・ボディがシリアル化された形式で表示されます。メッセージ・クラスが %XML.AdaptorOpens in a new tab から継承される場合、このタブにはメッセージが XML 形式で表示されます。メッセージ・クラスが %JSON.AdaptorOpens in a new tab から継承される場合、このタブにはメッセージが JSON 形式で表示されます。
この表示をオーバーライドするには、メッセージ・クラスで %GetContentType() および %ShowContents() を定義します。情報は、Ens.Util.MessageBodyMethodsOpens in a new tab に関するクラス・リファレンスを参照してください。
複雑なメッセージ・ボディ・クラスの作成
前の例では、メッセージ・ボディ・クラスに単純なプロパティしか含まれていませんでした。他のクラスを使用するプロパティを定義しなければならない場合があります。その場合は、メッセージ・ボディをパージするときにすべきことを慎重に検討する必要があります ("データの削除" を参照してください)。
メッセージ・ボディをパージすると、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 です。