SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

InterSystems IRISでシンプルに開発するIoTアプリケーション(AD)

IRISのインターオペラビリティ機能を使いこなそう(前編)

InterSystems IRISでシンプルに開発するIoTアプリケーション 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

データ変換の定義

 データ変換とは、ある形式のデータを別の形式のデータに変換するための規則を定義したもので、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で説明されています。ぜひご覧ください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
InterSystems IRISでシンプルに開発するIoTアプリケーション連載記事一覧

もっと読む

この記事の著者

堀田 稔(インターシステムズジャパン)(ホリタ ミノル)

SEマネージャー。1992年大阪大学基礎工学部情報工学科卒。同年日本ディジタルイクイップメント(株)入社。電気通信など様々な業界向けプロジェクトにシステムエンジニアとして携わる。1996年InterSystems Data Platform製品の日本語版開発プロジェクトに従事し、同製品の販売・サポー...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12117 2020/03/31 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング