データ変換の定義
データ変換とは、ある形式のデータを別の形式のデータに変換するための規則を定義したもので、IRISではクラスとして実装します。
/DriveDemo/IRIS-MQTT/projects/srcs/iris/DriveDemoに3つのデータ変換クラス(VDoc*.cls)がありますので、Visual Studio CodeのワークスペースのDriveDemoフォルダにコピーしてコンパイルしてください。
次に示すのは、DriveDemo.VDocToCarUpdateRequestクラスです。このクラスは、XML形式のデータからDriveDemo.Request.CarUpdateRequestへの変換を定義します。
Class DriveDemo.VDocToCarUpdateRequest Extends Ens.DataTransformDTL [ DependsOn = (EnsLib.EDI.XML.Document, DriveDemo.Request.CarUpdateRequest) ] { Parameter IGNOREMISSINGSOURCE = 1; Parameter REPORTERRORS = 1; Parameter TREATEMPTYREPEATINGFIELDASNULL = 0; XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ] { <transform sourceClass='EnsLib.EDI.XML.Document' targetClass='DriveDemo.Request.CarUpdateRequest' sourceDocType='mqtt_schema_driverecord:message' create='new' language='objectscript' > <assign value='source.{DriveRecord}' property='target.Data' action='set' /> <assign value='..Piece(source.{type},"/",2)' property='target.Data.CarId' action='set' /> <assign value='source.{DriveRecord.time}' property='target.Data.RelativeTm' action='set' /> <assign value='source.{DriveRecord.longitude}' property='target.Data.Longitude' action='set' /> <assign value='source.{DriveRecord.azimuth}' property='target.Data.Azimuth' action='set' /> <assign value='source.{DriveRecord.car_speed}' property='target.Data.Speed' action='set' /> <assign value='source.{DriveRecord.engine_rpm}' property='target.Data.EngineRPM' action='set' /> <assign value='source.{DriveRecord.accel_pos}' property='target.Data.AccelPos' action='set' /> <assign value='source.{DriveRecord.brake_sw}' property='target.Data.BrakeSW' action='set' /> <assign value='source.{DriveRecord.accum_dist}' property='target.Data.AcumDistance' action='set' /> <assign value='source.{DriveRecord.accum_fuel}' property='target.Data.AcumFuel' action='set' /> <assign value='source.{DriveRecord.fuel_injection}' property='target.Data.FuelInjection' action='set' /> <assign value='source.{DriveRecord.a_000_x}' property='target.Data.aX' action='set' /> <assign value='source.{DriveRecord.a_000_y}' property='target.Data.aY' action='set' /> <assign value='source.{DriveRecord.a_000_z}' property='target.Data.aZ' action='set' /> <assign value='source.{DriveRecord.latitude}' property='target.Data.Latitude' action='set' /> </transform> } }
データ変換のクラスは、Ens.DataTransformDTLクラスを継承して作成します。また、データ変換の定義は、XDataブロックにXML形式で記述されています。
では、データ変換の内容を確認してみましょう。管理ポータルから、「Interoperability」→「構築」→「データ変換」を選択します。そこから、「開く」ボタンを押して、「DriveDemo」→「VDocToCarUpdateRequest」を選択します(次図)。
そうすると、次の図に示す通り、データ変換の定義がビジュアルに表示されます。
左側のソース(データ変換元)には、EnsLib.EDI.XML.Documentクラスのプロパティが表示されています。上の図に示したように、DriveRecordプロパティの左側にある三角をクリックすると、入れ子になっているDriveRecordのサブプロパティが展開表示されます。
右側のターゲット(データ変換先)には、DriveDemo.Request.CarUpdateRequestクラスのプロパティが表示されています。同様に、Dataプロパティの三角をクリックすると、サブプロパティが展開されます。
ソースのプロパティからターゲットのプロパティに引かれている線が、データ変換を表します。各線がどのような変換を表すかは、下側のペインに表示されています。ここでは、ほとんどがデフォルトである「そのままコピー」となっていますが、#2(上の図の赤で囲った行)では、ソースのtypeプロパティの値から”/”で区切られた2番目の文字列を切り出し、それをターゲットのCarIdに設定することが指定されています。
VDocToCarUpdateRequestの他に、2つデータ変換のクラスがありますので、同様に確認してみてください。
紹介したように、IRISではデータ変換をクラス定義として実装します。では、これらのデータ変換は、どこからどのようにして呼び出されるのでしょうか? その答えの一つがビジネス・ルールです。次のセクションで、ビジネス・ルールについて説明します。
ビジネス・ルールの定義
ビジネス・ルールとは、条件を指定して、メッセージの送信先を決定したり、データの変換方法を指定したりできるコンポーネントです。
IRISではビジネス・ルールもクラスとして定義します。/DriveDemo/IRIS-MQTT/projects/srcs/iris/DriveDemo/DemoProcessRoutingRule.clsにコードがありますので、Visual Studio CodeのワークスペースのDriveDemoフォルダにDemoProcessRoutingRule.clsという名前でファイルを作成し、内容をコピーの上、コンパイルしてください。
次のコードは、DriveDemo.DemoProessRoutineRuleクラスの定義です。
Class DriveDemo.DemoProcessRoutingRule Extends Ens.Rule.Definition { Parameter RuleAssistClass = "EnsLib.MsgRouter.VDocRuleAssist"; XData RuleDefinition [ XMLNamespace = "http://www.intersystems.com/rule" ] { <ruleDefinition alias="" context="EnsLib.MsgRouter.VDocRoutingEngine" production="DriveDemo.Production"> <ruleSet name="" effectiveBegin="" effectiveEnd=""> <rule name="" disabled="false"> <constraint name="source" value="MQTTIn"></constraint> <constraint name="msgClass" value="EnsLib.EDI.XML.Document"></constraint> <constraint name="docCategory" value="mqtt_schema_driverecord"></constraint> <constraint name="docName" value="message"></constraint> <when condition="Piece(Document.{type},"/",3,3)="start""> <send transform="DriveDemo.VDocToCarRegisterRequest" target="CarOperation"></send> </when> <when condition="Piece(Document.{type},"/",3,3)="drive""> <send transform="DriveDemo.VDocToCarUpdateRequest" target="CarOperation"></send> <send transform="DriveDemo.VDocToCheckDriveRequest" target="CheckDriveProcess"></send> </when> </rule> </ruleSet> </ruleDefinition> } }
クラス定義のExtends句で、Ens.Rule.Definitionを継承することで、ビジネス・ルールの機能を引き継ぎます。
ビジネス・ルールの定義は、XData宣言とともにXML形式で行います。
定義内容を確認するために、管理ポータルにアクセスし、「Interoperability」→「構築」→「ビジネス・ルール」を選択してください。そこで、次の図のように、「DemoProcessRoutingRule」を開いてください。
そうすると、次の図のようにビジネス・ルールの定義がビジュアルに表示されます。
詳細は機会を改めて説明したいと思いますが、ここでは、クラス定義のXMLの内容が、ビジュアルに表示されたコンポーネントに対応していることを確認してみてください。特に、
- “when”で条件を指定し、それに当てはまれば、”send”アクションを実行する
- “send”では、”transform”によりデータ変換を行い、”target”でデータ送信先のコンポーネント(ここではビジネス・オペレーション)を指定する
というところに注意して確認してください。このtransformで指定できるのは、前のセクションで定義したデータ変換のクラスです。
今回は説明の関係で、クラス定義でビジネス・ルールを作成しましたが、通常は管理ポータルからビジュアルにビジネス・ルールを作成していくのが一般的です。
定義されたビジネス・ルールを呼び出すコンポーネントの一つが、ビジネス・プロセスです。ビジネス・プロセスについては次回説明したいと思います。
まとめ
今回は、「IRISのインターオペラビリティ機能を使いこなそう(前編)」と題して、メッセージ、ビジネス・オペレーション、データ変換、ビジネス・ルールといったコンポーネントを作成する方法について紹介しました。
次回の後編は、この連載の最終回として、ビジネス・プロセスを作成し、アプリケーションを完成させます。また、IRISをRESTサーバとして動作させる方法についても紹介する予定です。
参考
インターシステムズでは、開発者の皆様にIRISを知っていただくために、いろいろな機能を紹介する短い動画を作成しています(日本語字幕付き)。
インターオペラビリティ機能は以下のURLで説明されています。ぜひご覧ください。