メッセージクラスの定義
これまでの連載で、ビジネス・サービスやビジネス・プロセスなどIRISのコンポーネント間で「メッセージが流れる」という説明をしてきました。ここでは、この「メッセージ」というものについて改めて説明し、定義を行っていきます。
メッセージ
IRISのインターオペラビリティ機能のコンポーネント同士は、メッセージを送受信することで動作します。IRISでは、メッセージは特別な機能を持ったクラスとして定義されます。
メッセージは、リクエストとレスポンスに分類されます。次の図をご覧ください。
赤で囲んだ部分は、CheckDriveProcess(ビジネスプロセス)とCheckDriveOperation(ビジネス・オペレーション)との間でメッセージが送受信されている様子を示しています。CheckDriveProcessは、CheckDriveRequestというリクエストをCheckDriveOperationに送信し、CheckDriveOperationは、CheckDriveResponseというレスポンスを返しています。
次に示すのは、CheckDriveRequestクラスの定義です。
Class DriveDemo.Request.CheckDriveRequest Extends Ens.Request [ ClassType = persistent, ProcedureBlock ] { Property CarId As %String; Property RelativeTm As %Integer; }
Extends句でEns.Requestクラスを継承することによって、このクラスがリクエストとして機能することを指定しています(その後の[ ]で囲まれた部分は今回は“おまじない”として理解してください)。
その後のProperty定義は、通常のクラス定義と同様です。CheckDriveRequestでは、該当する車のID(CarId)と、相対時刻(RelativeTm)がメッセージに含まれるデータとして定義されています。
次に示すのは、CarUpdateRequestです。
Class DriveDemo.Request.CarUpdateRequest Extends Ens.Request [ ClassType = persistent, ProcedureBlock ] { Property Data As DriveDemo.Data.DriveRecord; }
Ens.Requestを継承する点は、先ほどのCheckDriveRequestと同様です。
プロパティはData一つだけです。As以下で DriveDemo.Data.DriveRecord を指定しています。これは、先ほど定義した DriveDemo.Data.DriveRecordクラスのインスタンスへの参照を、このリクエストに含めることを意味しています。
今度はレスポンスの例を見てみましょう。CheckDriveResponseの定義です。
Class DriveDemo.Response.CheckDriveResponse Extends Ens.Response [ ClassType = persistent, ProcedureBlock ] { Property hasEvent As %Boolean; Property DrivingBehavior As DriveDemo.Data.DrivingBehavior; Property MessageText As %String(MAXLEN = 32767); }
Ens.Responseクラスを継承することによって、このクラスはレスポンスとして機能します。
プロパティには、何らかのイベントが発生したかどうかを示すhasEvent、発生したイベントの内容を保持するMessageTextが定義されています。
DrivingBehaviorプロパティのAs句では、DriveDemo.Data.DrivingBehaviorと指定されています。先ほどのDriveDemo.Data.DriveRecordと違い、ここでは、プロパティに別のクラスのインスタンスを「埋め込む」ことを指定しています。この違いは、Asで指定されているクラスの種類の違いによるものです。
では、そのDriveDemo.Data.DrivingBehaviorの定義を見てみましょう。
Class DriveDemo.Data.DrivingBehavior Extends ( %SerialObject, %XML.Adaptor ) { Property IsOverSpeed As %Boolean; Property IsHighEngineRPM As %Boolean; Property IsHighXG As %Boolean; Property IsHighYG As %Boolean; }
これまで紹介したクラスの定義と同様、4つの%Boolean型のプロパティを定義して、どのようなイベントがあったのか(速度超過、エンジン高回転、大きな加速度)を表すようになっています。
これまで定義したクラスとの重要な違いは、Extends句にあります。このクラスは%SerialObjectを継承しています。
%SerialObjectは%Persistentと違い、インスタンスをデータベースに保存することはできません。しかし、他のクラスのインスタンスのプロパティに、「シリアル化」して埋め込むことが可能になっています。
このDrivingBehaviorクラスを例にとると、インスタンスのDrivingBehaviorプロパティに、DrivingBehaviorのインスタンスが埋め込まれることになります。次の図が、そのイメージです。
今回のアプリケーションでは、他に、DriveDemo.Request.CarRegisterRequestというリクエストを定義しています。
以上のクラスをコンパイルしてください。