記事
Mihoko Iijima · 2021年6月23日 40m read

【GettingStarted with IRIS】チュートリアルを始めよう!その3:Interoperability(相互運用性)チュートリアル

開発者のみなさん、こんにちは!

この記事では、GettingStarted ページの無料体験環境(Sandbox)で試せるチュートリアルの中から、「Connect Your Systems」(Interoperabilityのチュートリアル)の使い方をご紹介します。

GettingStarted ページでできることについては、こちらの記事でご紹介しています。

無料体験環境(Sandbox)の開始手続きについては、こちらの記事でご紹介しています。ぜひご参照ください。

 Connect Your Systems では、IRIS の Interoperability メニューを利用してどのように異なるシステム同士を接続し、処理を連携させることができるのか、ビデオによる解説とチュートリアルをご用意しています。

(1) Interoperability 概要 :   ビデオ(日本語字幕切り替え可)と概要説明

(オリジナルページ👉https://gettingstarted.intersystems.com/interoperability/

    (2) Combat Fraud with Transactions and AI:  ビデオのみ 

    (オリジナルページ👉https://gettingstarted.intersystems.com/interoperability/integration-fraud/

    このページのビデオでは、InterSystems IRIS が複数のデータ・ストリームと機械学習モデルを統合して、レストランの POS で不正取引を検出する仕組みのデモをご紹介しています。

    (3) Interoperability QuickStart:  ビデオ(日本語字幕切り替え可)とチュートリアル

    (オリジナルページ👉https://gettingstarted.intersystems.com/interoperability/quickstart-interop-2/

    ※ ビデオは (1) Interoperability 概要 のビデオと共通です。

    (4) Build a Smart Ticketing System(チュートリアル)

    (オリジナルページは👉https://gettingstarted.intersystems.com/interoperability/red-lights-part-2/

     

    以下、(1) (3) (4) について画面やチュートリアルの進め方をご紹介しています。ぜひご参照ください!


    (1) Interoperability 概要

    オリジナルページ 👉https://gettingstarted.intersystems.com/interoperability/ に 3 分36 秒の概要解説ビデオがあります。日本語字幕を追加する方法は、図解をご参照ください。

    IRIS の Interoperability(相互運用性)メニューを利用することで、異なるシステム同士のデータ共有がかつてないほど簡単になります!

    ビデオにもあるように、異なるシステム同士でデータを共有しようとすると、複数のシステムからデータを取り込む必要があったり、定義したロジックに従ってメッセージをルーティングしたり、共通プロトコルでアクセスできたり、異なるプロトコルだったり、複数の言語を使用したアクセスが必要になってくるなど、要件は様々です。

    InterSystems IRIS® data platform の Interoperability メニューを利用することで以下の内容を実現できます。

    • メタデータやメッセージ・コンテンツに基づいてメッセージをルーティングできます。
    • ローコード UI を使用してビジネス・ロジックの作成や更新が行えます。
    • 接続対象システムが使用しているフォーマットに合わせてデータを変更するようなデータ変換ロジックを作成できます。
    • すぐに使えるコンポーネントを使用して素早く統合処理を記述したり、独自のコードを作成してさらに柔軟性を高めることができます。
    • システムを流れるデータに機械学習アルゴリズムを適用することもできます。
    • 統合されたデータを 1 つのリポジトリに保存し、保存されたデータを利用して分析を行うことができます。
    • トラブルシューティングや監査のためにシステムを流れるメッセージをトレースできます。

     


    (3) Interoperability QuickStart

    (オリジナルページ👉https://gettingstarted.intersystems.com/interoperability/quickstart-interop-2/

    Interoperability クイックスタートチュートリアルのテーマは以下の通りです。

    信号機にカメラが設置されていて、赤信号の違反を自動的に識別できるようになった、と仮定して以下の内容を実施しようとしています。

    • 違反を識別したデータを後で分析できるようにデータベースに保存しておきたい。
    • 違反した車が緊急車両でない場合、違反チケットを発行するため別のアプリケーションに違反者情報のデータを送信する。

    このチュートリアルの中では、自動的に識別された違反データの中から、どの情報が違反チケットを発行する対象データであるかを判断するビジネス・ルールを作成し、データのルーティングを行います。

    また、判断結果を送信する接続先システムが必要としているデータのみを送付できるように、データの変換も行います。

    ビジネス・ルールやデータ変換は、InterSystems IRIS の管理ポータルを使用して開発できます。開発の他にも、Interoperability メニューが提供する機能を利用したメッセージのトレースなども確認していく予定です。

    テーマに合わせた一連の連携の流れや接続先情報を設定保存するための定義として「プロダクション」があります。

    プロダクションは、ビジネス・サービス、ビジネス・プロセス、ビジネス・オペレーションの3種類のコンポーネントを組み合わせ定義することができます。

    それぞれのコンポーネント概要は以下の通りです。

    • ビジネス・サービス:外部システムと接続し、外部システムからの情報を受信します(プロダクションの中で一番最初に動くコンポーネントです)。
    • ビジネス・プロセス:ルーティングやメッセージ変換などのビジネスロジックを定義するコンポーネントでプロダクション内の処理の調整役になります。
    • ビジネス・オペレーション:外部システムに処理を依頼する役割があります(プロダクション内で使用していたデータなどを渡すことができます)。

    メモ:このチュートリアルの流れでは、違反情報をデータベースに登録する流れの作成は含まれていません。

    ① Set up

    InterSystems IRIS を開始してプロダクションを参照してみよう!

    (1) Sandbox を開始し、IDE を開きます。

    https://gettingstarted.intersystems.com/interoperability/quickstart-interop-2/#set-up のページを開き、Sandboxを開始します。

    下図のように、LOGINボタンが表示されている場合は、LOGINボタンをクリックし、ログインしてください。

    LOGIN後、Sandbox の情報が表示されず「PROVISION SANDBOX」ボタンが表示されていたら「PROVISION SANDBOX」ボタンをクリックし、Sandbox を作成してください。

    ユーザ登録がまだの方は、こちらの記事をご覧いただき、ユーザ登録を行ってください。

    (2) 「Sandbox IDE」のリンクから IDE を開きます。また「Management Portal」のリンクから管理ポータルを開きます。

    管理ポータル起動時、ログイン画面が表示されたら、ユーザ名: tech  パスワード:demo を入力してください。

    (3) 管理ポータルの以下メニューを開きます。

    Interoperability > 一覧 > プロダクションDemo.RedLights の行を選択し「開く」ボタンをクリックします。

    (4) プロダクション構成画面で と表示されている場合は、ボタンをクリックし、プロダクションを開始します。

    プロダクション開始時「このプロダクションを開始してもよろしいですか?」のポップアップメッセージが表示されるので「OK」をクリックします。

    プロダクション開始中の状態確認画面が表示され「完了しました」が表示されたら「OK」ボタンを押し画面を閉じて開始処理を完了します。

     

    ② Monitor message transport

    データ送受信時のメッセージをトレース画面を利用して確認します。

    ① SetUp でプロダクションを開始すると、プロダクションに定義している監視対象ディレクトリに用意されていたサンプルファイルが読み込まれ、処理されます。

    ここでは、処理されたファイルの情報をメッセージのビジュアルトレース画面を使用して確認してみます。

    1、メッセージを参照する

    (1) 管理ポータルの Interoperability > 表示 > メッセージ に移動します。

    表示されているメッセージから、ソースの列に「RealTimeRedLightViolation」と表示されている行の一番先頭にあるメッセージを選択します。

    (2) 画面右側にある「トレース」タブを選択し「完全トレースを表示」のリンクをクリックします。

    (3) 開いた画面は「ビジュアルトレース」と呼びます。

    この画面では、IRIS のプロダクションに設定されているコンポーネント間でどのようなメッセージが送受信されているかを確認できます。

    (4) 全メッセージはデータベースに格納され、開発時やテスト時の送受信データの確認や、運用期間中にトラブルが発生した際のメッセージの確認など、様々な場面で利用できる情報です。

    (5) ビジネス・サービス:RealTimeRedLightViolationでは、外部から入力された情報を元に、メッセージが作成されました。

    以下の情報を確認してみましょう。

    • そのメッセージは、どのビジネス・プロセスに送信されたでしょうか。

    ヒント:ビジネス・サービス:RealTimeRedLightViolation
    の列に表示されている  の送付先がどこであるか確認します。

    答え:Demo.TicketBPL

    • ビジネス・オペレーション:To_TicketApplication へ送信されていない情報はどれでしょうか。

    ヒント: をクリックし画面右側で「ボディ」タブを選択します。

     をクリックし同様に、画面右側の「ボディ」タブを選択し、[1] と [3] のメッセージの違いを確認します。

    答え:CARTYPE

     

    2、他のメッセージを送信してみる

    (1) Sandbox の IDE を開きます。

    https://gettingstarted.intersystems.com/interoperability/quickstart-interop-2/#set-up を開き「Sandbox IDE」のリンクをクリックします。

    IDE を開き左画面で shared > Samples-Integration-RedLights > data > SampleFiles を開きます。

    LocalRedLightViolation1-copy.csv を Ctrl + c でコピーし、shared/Samples-Integration-RedLights/data/In に Ctrl +v でペーストします。

    再度、(1) の手順を利用してメッセージ・ビューワを確認すると、読み込んだ CSV からメッセージが作成されていることを確認できます。

     

    ③ Consume CSV files using the built-in Record Mapper

    管理ポータルの「レコード・マップ」は、CSV などの区切りマークで区切られたデータが含まれるファイルに対する入出力処理用コードの自動生成とプロダクションで使用するメッセージ定義を簡単に生成させることができる機能です。

    チュートリアルで使用するレコードマップ定義は既に用意されていますが、サンプルの CSV ファイルを使用してCSVファイルのデータがどのように解析されるか、レコードマップ定義のサンプルファイル読み込みオプションを利用して確認します。

    この他、CSV ウィザードもあり、CSV のヘッダを読み込み、対応するレコードマップを自動的に作成するメニューも用意されています。

    (1) 直前に開いたメッセージ・ビューワ画面があれば、画面左上部の表示されている [Interoperability] メニューをクリックします。

    次に、Interoperability > 構築 > レコード・マップ > 開くボタンクリック > Demo > RedLightViolationsRecordMap を選択します。

     

     

    (2)  をクリックし、テストに使用したCSV ファイル /home/project/shared/Samples-Integration-RedLights/data/SampleFiles/LocalRedLightViolation1-copy.csv を選択します(ファイルの種類で「カンマ区切りファイル(*.csv)」か「すべてのファイル(*)」を選択しすると表示されます)。

    サンプルファイル選択後の画面は以下の通りです。

    サンプルファイルを表示させるユーティリティを利用して、意図した通りに情報が区切れるかを確認しながらレコード・マップ定義を作成できます。

    サンプルファイルが目的通りの表示になる=レコードマップ定義を利用して正しく解析できることを意味しています。

    画面表示中に cross-origin エラーが発生する場合は、管理ポータルの URL を https:// から http:// に変更してお試しください(s を付けずに表示してみてください)。

    Sandbox は、コンテナ間でコンテンツを共有するように設定されているため、サンプルファイルのアップロードを行う場合にこの対応が必要になることがあります。

    (3) 画面上部の ホーム をクリックします。

    次に、Interoperability > 構成 > プロダクション を選択します。

    ビジネス・サービス:RealTimeRedLightViolation を選択し、画面右側の「設定」タブを参照し、RecordMap 定義を探します。

    RecordMap 定義に先ほど参照した Demo.RedLightViolationsRecordMap が設定されていることをご確認ください。

    プロダクションに含まれるコンポーネント(ビジネス・サービス/プロセス/オペレーション)は、プロダクション開始中でも設定変更が行え、変更を行ったコンポーネントのみに影響を与えることができます。

    確認したレコードマップを使用しているビジネス・サービスは、予め構築済のレコードマップ用ビジネス・サービスを利用しているため、コードの記述は不要です。

    区切りマーク付きファイルを処理する場合、レコード・マップ定義を利用することで、プロダクションに素早く新しい処理を追加することができます。

     

    ④ Route messages, apply business logic and transformations

    信号機から受信したデータは、チケットアプリケーションに送付される予定で、さらに分析用にデータベースに保存する予定です。

    しかし、受信した全データをチケットアプリケーションに送付するのではなく、赤信号を無視した車両がパトカーや消防車などの許可された車両ではない場合に限り送信します。

    チュートリアルのサンプルでは、受信したデータを正しく振り分けるための適切なルーティング・ロジックが作成されています。また、データベース保存用データとして必要な情報のみを送付するように設定されています。

    メモ:このチュートリアルの流れでは、抽出データをデータベースへ保存するコンポーネントの作成は含まれていません。

    以下の手順で、サンプルコードを確認しましょう。

    (1) プロダクション構成でビジネス・プロセス:Demo.TicketBPL を選択し、右画面の「設定」タブを選択します。

    情報を提供する設定 を展開し、クラス名: Demo.TicketBPL の右側に表示されている   虫眼鏡のアイコンをクリックしビジネス・プロセス・エディタを開きます。

    サンプルコードは、ローコードエディタである、ビジネス・プロセス・エディタを使用しています。

    この中では、許可された車種以外の違反情報を他のアプリケーションに送信するため、call アクティビティを使用して「ビジネス・オペレーション」を呼び出しています。

    メモ: や  をアクティビティと呼びます。

    (2) ルールアクティビティ を選択します。右画面に表示される設定画面から  ボタンをクリックします。

     

    このルール画面を使用して、メッセージの処理方法を変更することができます。

    サンプルでは、CarType に含まれる文字列が、許可された車種であるかをチェックしています。例では、ambulance、police、firetruck が来た時はホワイトリストとして違反チケット用アプリケーションに送付しない流れが設定されています。

    ルール画面は、特定のユーザのみが修正できるようにセキュリティを追加することもできます。

    ルール画面を通して、適切なユーザが処理の流れに影響のある条件値を変更するなど、ローコードで設定することができます。

     チャレンジ問題:CarType  SWAT の場合も、許可された車種となるように新しいルールを追加してください。

    (3) ビジネス・プロセス:Demo.TicketBPL のビジネス・プロセス・エディタの画面に戻ります(チュートリアルの手順では、別タブに開いています)。

    もし、画面を開いていない場合は、ホーム > Interoperability > 構築 > ビジネス・プロセス から開いてください。

     をクリックし、アクティビティの設定画面から  ボタンをクリックします(アクティビティ選択後、右画面に表示される設定画面を少しスクロールすると「リクエスト・ビルダ」ボタンが見つかります)。

    データベースに保存したい情報の抽出をこの画面で行っています。

    左半分に表示されている情報は、ビジネス・プロセスに送付される情報です。右半分に表示されている情報は、呼び出し対象として設定しているビジネス・オペレーションに送付する情報です。

    チュートリアルテーマのように簡単なデータ変換の場合は(例では、情報の一部をカットしているだけ)、ビジネス・プロセス内で情報抽出が行えます。

    より複雑なデータ変換が必要なケースもあります。その場合は、上図と同様に線を引きながら設定できるデータ変換画面を使用して、アプリケーション全体から呼び出し可能なデータ変換定義を作成することもできます。

     

    このチュートリアルの中では、ビジネス・サービスとビジネス・オペレーションに対してコードを記述していません(予め構築済のビジネス・サービス、ビジネス・オペレーション用コードを利用しているためコードの記述は不要でした)。

    もちろん、ビジネス・サービス、ビジネス・オペレーションをコードを記述しながら開発することもできます。

    例えば、TCP、FTP、SQL、RESTなど接続周りの処理を簡単に記述できるアダプタを使用して、接続先のシステムから送受信する情報に合わせてカスタムコードを記述しながら開発していく方法もあります。

     


    (4) Build a Smart Ticketing System

    このチュートリアルでは、1つ前の (3) Interoperability QuickStart で確認した Red Light Violationアプリケーションをベースにしているため、説明の流れが (3) Interoperability QuickStart チュートリアルを完了した状態を想定して手順が記述されています。

    このチュートリアルのテーマは

    シカゴの交通システムのデータに基づいて危険な交差点を特定するための処理を追加します。

    です。以下の内容を作成します。

    • ファイル入力によりデータを受信し、判断結果をファイル出力するシンプルなインターフェースを使用します。
    • 赤信号違反の数に基づいてハイリスクと判断された交差点のみをリストアップするロジックを追加します。
    • 公開されている REST API を使用して人口密度に関するデータを取得する処理を追加します。
    • システムに適したフォーマットにデータを修正する処理を追加します。

    ① Get set up

    (1) Sandbox の IDE を開きます。

    https://gettingstarted.intersystems.com/interoperability/red-lights-part-2/#get-set-up  のページを開き、アクセス情報を確認します。

    LOGIN ボタンが表示される場合は、LOGIN ボタンをクリックして下さい。「PROVISION SANDBOX」のボタンが表示される場合は「PROVISION SANDBOX」ボタンをクリックします。

    (2) IDE のターミナルウィンドウを利用して、以下のチュートリアルで使用するリポジトリをクローンします。

    cd /home/project/shared
    git clone https://github.com/intersystems/Samples-Integration-SmartTicketing

    (3) IDE のメニュー InterSystems > Management Portal から管理ポータルを開きます。

    (4) サンプルコードをインポートします。

    管理ポータルのメニュー システムエクスプローラ > クラス を開き、 ボタンをクリックします。

    /home/project/shared/Samples-Integration-SmartTicketing/Setup/CustomCensusComponents.xml をインポートファイルに指定し、インポートを行います。

    インポートの操作で cross-origin エラーが発生する場合は、管理ポータルの URL を https:// から http:// に変更し、再度実行してみてください。

    Sandbox は、コンテナ間でコンテンツを共有するように設定されているため、ファイルのアップロードを成功させるにはこの方法が必要となる場合があります。

     

    ② Add a new interface

    新しいインターフェースを追加してみましょう!

    最初に、レコードマップを使用してファイル入力を行うシンプルなビジネス・サービスを追加します。

    チュートリアルを進めていくうちに、より複雑な内容も登場しますが、現時点では、レコードマップを使用することで入力したファイルから好みのフォーマットにマッピングする処理をとても簡単に作成できることを確認します。

    IRIS には、多くの構築済コンポーネントがあります。レコードマップも構築済コンポーネントを使用するため、コーディングの必要はありません。

    (1) 次の手順で、シカゴの交差点に関する情報を入力するための新しいレコードマップを使用するビジネス・サービスを作成します。

    A) 管理ポータルの Interoperability > 構築 > レコードマップ を開きます。

    B) ボタンをクリックし、ファイルに /home/project/shared/Samples-Integration-SmartTicketing/SampleFiles/Red_Light_Camera_Violations_Test.csv を指定します。残りの設定項目は以下の通りです。

    • サンプルファイル:/home/project/shared/Samples-Integration-SmartTicketing/SampleFiles/Red_Light_Camera_Violations_Test.csv
    • レコード・マップ名:Demo.CameraViolationsMap
    • セパレータ:, (変更なし)
    • レコード終端文字:LF
    • 文字エンコード:UTF-8 (変更なし)
    • 3か所のチェックボックスをすべてチェック(「サンプルがヘッダ行を持つ」をチェックすることで、CSV ファイルの1行目をヘッダ行と認識します。)

    設定が完了したら  ボタンをクリックすると、以下の画面が開きます。

    CSVファイルを指定してレコードマップを作成する操作で cross-origin エラーが発生する場合は、管理ポータルの URL を https:// から http:// に変更し、再度実行してみてください。

    Sandbox は、コンテナ間でコンテンツを共有するように設定されているため、ファイルのアップロードを成功させるにはこの方法が必要となる場合があります。

    C)  以下のフィールドが正しく設定されているか確認します。足りない場合は  をクリックして追加してください。

    D)  ボタンをクリックし、レコードマップ定義と関連するメッセージクラスを生成します。

    E) 管理ポータル > Interoperability > 構成 > プロダクション からプロダクション構成ページを開きます。

    新しいビジネス・サービスを追加します。 赤枠のボタンをクリックします。

    サービスクラスに EnsLib.RecordMap.Service.FileService を指定します(プルダウンで表示される名称には、似た名前が多いので気を付けて選んでください)。

    サービス名に From_RedLightArchive を指定し、OK ボタンをクリックして追加します。

    (現時点で、設定は完了していません)

    プロダクションが開始していない場合は、「開始する」ボタンをクリックし、開始してください。

     F) 追加したビジネス・サービスの設定を完成させます。

    コンポーネント名をクリックします(From_RedLightArchive の字の部分をクリックします)。

    画面右側に設定欄が表示されます。以下の項目を設定してください。

    設定完了後、「適用」のボタンを押し忘れないようにご注意ください!

    • 有効:チェックします。
    • ファイル・パス:/home/project/shared/Samples-Integration-RedLights/data/In/
    • ファイル・スペック:Red_Light_Camera_Violations*.csv
    • アーカイブ・パス:/home/project/shared/Samples-Integration-RedLights/data/SampleFiles/
    • RecordMap:Demo.CameraViolationsMap

    (2) 続いて、危険な交差点のリストを出力するビジネス・オペレーションを作成します。

    A) 再度、CSVウィザードを利用してレコードマップ定義を作成します。

    今回のレコードマップ名は Demo.HighRiskArchiveMap とします。定義内容も前回と同じで、レコードマップ名だけ異なります。ご注意ください。

    CSV ウィザードは以下メニューからも移動できます。

    管理ポータル > Interoperability > 構築 > CSVレコードウィザード

    上記画面の「生成」ボタンを押し忘れないようにしてください。

    B) 管理ポータル > Interoperability > 構成 > プロダクション からプロダクション構成ページを開きます。

    新しいビジネス・オペレーションを追加します。 赤枠のボタンをクリックします。

    オペレーションクラスに EnsLib.RecordMap.Operation.FileOperationを指定します(プルダウンに表示される名称には似た名前が多いので、気を付けて選んでください)。

    オペレーション名に To_HighRiskArchiveを指定し、OK ボタンをクリックして追加します。

    (現時点で、設定は完了していません)

    ビジネス・オペレーション:To_HighRiskArchive  を選択します(コンポーネント名をクリックします)。

    画面右側に設定欄が表示されます。以下の項目を設定してください。

    設定完了後、「適用」のボタンを押し忘れないようにご注意ください!

    • 有効:チェックします。
    • ファイル・パス:/home/project/shared/Samples-Integration-RedLights/data/Out/
    • ファイル名:%Q_HighRisk.txt
    • RecordMap:Demo.HighRiskArchiveMap

     

    (3) ビジネス・サービス:From_RedLightArchive を選択します(コンポーネント名をクリックします)。

    画面右側の設定タブの「ターゲット構成名」に作成したビジネス・オペレーション:To_HighRiskArchive を設定し、適用ボタンを押してください。

    (4) プロダクションが実行中であることを確認します。

    もし、停止している場合は「開始する」ボタンをクリックしてください。

    (5) これでシンプルなビジネス・サービス、ビジネス・オペレーションの追加は終わりです。早速テストしてみましょう!

    A) Sandbox の IDE の左画面から /home/project/shared/Samples-Integration-SmartTicketing/SampleFiles/Red_Light_Camera_Violations_Test.csv ファイルを Ctrl + c でコピーし、/home/project/shared/Samples-Integration-RedLights/data/In/ のフォルダに Ctrl + v でペーストします。

    B) 管理ポータルに戻りメッセージビューワを開きます。

    Menu > メッセージ・ビューワ を選択します。

    C) 直近で処理されたメッセージを選択し、画面右でトレースタブを選択し「完全トレースを表示」をクリックすると、トレース画面が開きます。

    ここまでの動作が正常に終了している場合、ビジネス・オペレーション:To_HighRiskArchive で設定したファイル・パスのディレクトリ(/home/project/shared/Samples-Integration-RedLights/data/Out/)にファイルが出力されている予定です。

    もしエラーが発生している場合は、ビジュアルトレース画面で  の表示されます。その場合は、この記事の一番下に掲載している「トラブルシューティングガイド」をご参照ください。

     

    ③ Add business orchestration logic

    次に、どの交差点がハイリスクであるかを判断し、対象データのみをファイルに出力するルールセットを追加します。

    ビジネス・プロセス・エディタを使い、条件のチェックやルールセットの適用などのロジックを追加し、対象となるデータを1つ前の演習で作成したビジネス・オペレーション:To_HighRiskArchive に送信し、ファイルが指定されたディレクトリに出力されるか確認します。

    (1) ビジネス・プロセス・エディタを開きます。

    管理ポータルの Interoperability > 構築 > ビジネス・プロセス を開きます。

    (2) ボタンをクリックし、新しいビジネス・プロセスを以下の名称で作成します。

    パッケージ名: Demo

    名前:HighRiskIntersectionsBPL

    (3) 次に、ビジネス・プロセスの設定を追加します。

    ビジネス・プロセスが受信する基本要求(リクエスト・クラス)と、呼び出し元に返送する基本応答(レスポンス・クラス)、このビジネス・プロセス内で使用できるコンテキストプロパティを定義します。

    画面右の「コンテキスト」タブを選択し、以下の値を設定します。

    • リクエスト・クラス: Demo.CameraViolationsMap.Record
    • レスポンス・クラス: Ens.Response(デフォルト値のまま)
    • コンテキストプロパティ: IntersectionRisk データタイプに %String(MAXLEN=50) を設定
    • コンテキストプロパティ: VIOLATIONS データタイプに %Integer を設定

    設定が完了したら、 ボタンをクリックし、保存してください(アクティビティの設定が途中でも保存できます。保存時エラーメッセージが出ますが気にせず保存してください)。

    (4) 次に、Assign アクティビティを追加します。

    アクティビティの追加は、アクティビティのプルダウン > Assing をクリックします。

    追加後、<assign> アクティビティを <start> の下に接続します。

    <start> の下についているアイコン  からドラッグし <assign> アクティビティの上についているアイコン  までドラッグし続け、線がくっついたところでドロップします。


     次に <assign> アクティビティの設定を追加します。アクティビティを選択し、右画面で以下設定してください。

    • アクション: set
    • プロパティ: context.VIOLATIONS
    • 値: request.VIOLATIONS

    メモ:ビジネス・プロセスの「コンテキスト」タブで設定したプロパティは、ビジネス・プロセス内で使用できるコンテキストオブジェクトのプロパティで 変数 context で操作できます。request はビジネス・プロセスの起動のきっかけとなったメッセージのインスタンスを操作できる変数です。

    設定が完了したら、 ボタンをクリックし、保存してください(アクティビティの設定が途中でも保存できます。保存時エラーメッセージが出ますが気にせず保存してください)。

    (5) <rule> アクティビティを追加します。

    どの交差点がハイリスクであるかを判断する流れを、ビジネス・プロセス内で直接書くこともできますが、ルールエディタで判断基準を変更できるように、ルール(<rule> アクティビティ)を組み込みことができます。

    ルールエディタを利用する利点としては、ビジネス・プロセスのコードを変更せずに、判断基準となる値のみを変更できる点です。

    追加する <rule> アクティビティでは、1日の交差点通過時の違反回数から very highhightlow のいずれかの文字列が設定される予定です。

    以下の手順で追加します。

    A) <rule> アクティビティを追加します。

    B) キャプションを設定します。

    C) <rule> アクティビティから呼び出されるルールを作成します。

    <rule> アクティビティを選択し  ボタンをクリックし、出力される子画面で以下入力します。

    • パッケージ名: Demo
    • 名前: IntersectionRiskRule
    • コンテキスト・クラス: Demo.HighRiskIntersectionsBPL.Context

    設定した「コンテキスト・クラス」の指定により、ビジネス・プロセスで使用してる特定の交差点の違反数を登録するコンテキスト・プロパティの値をルールに渡すことができます。

    D) ルール・エディタに rule を追加します。

     を選択し、 をクリックしてから を選択します。

    E) 追加した rule に when を追加します。

     を選択し、 をクリックしてから  を選択します。

    D) 1つの目の  の をダブルクリックし、VIOLATIONS > 15 を条件式として設定します。

    E) 1つ目の   を選択し、 をクリックしてから  を選択し、“very high” を value に設定します。

     

    H) 同様の手順で、以下の図と同じ設定になるように定義してください。

    I) 最後に、保存ボタンをクリックし、設定を保存します。

    (6) ルールエディタは、新しいタブで開いています。

    一旦ルールエディタのタブを閉じ、ビジネス・プロセス・エディタに戻ります。

    ビジネス・プロセス・エディタの <rule> アクティビティの設定で、ルール名に Demo.IntersectionRiskRule を設定し、Result Location に context.IntersectionRisk を設定します。

    設定が完了したら、 ボタンをクリックし、保存してください(アクティビティの設定が途中でも保存できます。保存時エラーメッセージが出ますが気にせず保存してください)。

    (7) <rule> アクティビティを選択した状態で、<if> アクティビティを追加します。

    メモ:接続したいアクティビティを選択した状態で新しいアクティビティを追加すると、予め線が結ばれた状態で追加されます。

    <if> アクティビティのブロックの終わりを示す と <if> アクティビティがつながった状態で追加されます。

    (8) <if> アクティビティを設定します。

    • 名前: ハイリスクかどう
    • 条件: (context.IntersectionRisk = "high") || (context.IntersectionRisk = "very high")

    (IntersectionRisk の値が "high" か "very high" の場合に、その情報をファイル出力するようにこの後の問題で作成します)

    (9) ハイリスクの交差点だと特定された場合、その情報をファイル出力します。

    <if> アクティビティが真である場合の true の線を選択した状態で <call> アクティビティを追加します。

    <call> アクティビティの設定は以下の通りです。

    • 名前: HighRiskArchiveの呼び出し
    • ターゲット: オペレーションを選択し、To_HighRiskArchive を設定
    • リクエストメッセージクラス: Demo.HighRiskArchiveMap.Record
    • レスポンスメッセージクラス: Ens.Response (デフォルト設定のまま)

    (10) <call> アクティビティの  ボタンをクリックします。

    (11) ビジネス・プロセスの起動のきっかけとなった要求メッセージ(基本要求)の request の %Source プロパティ を <call> アクティビティで設定したターゲット構成へ送付する要求メッセージの callrequest の %Source プロパティにコピーします(線を結びます)。

    (線を引くとき、色が変わるまでドロップしないようにしてください)

    同様に、request.INTERSECTION から context.INTERSECTION へ線を引きます。

    (12) 線を引いた後、OK ボタンをクリックします。

    要求メッセージ・クラスの要求アクションに  と設定されます。

    (13) <if> アクティビティの設定を変更します。

    ブロックの終わりを示す に false の線をつなぎます。

    (14) 最後に、<if> アクティビティのブロックの終わりを示すアイコンから、<end> まで線を引き完成です。

    (15) 忘れずに、コンパイルを実行してください。

    コンパイル結果が子画面に表示されます。「コンパイルが正常に終了ました」と表示されるまでお待ちください。

    (16) 作成したビジネス・プロセスをプロダクションに追加します。

    管理ポータル > interoperability > 構成 > プロダクション を開きます。

    (17) ビジネス・プロセスを追加します。 をクリックします。

    (18) ビジネス・プロセス・クラスに作成した Demo.HighRiskIntersectionsBPL を設定し、有効にするのチェックをいれ、OKボタンをクリックします。

    (19) ビジネス・サービス:From_RedLightArchiveターゲット構成名を変更します。

    Demo.HighRiskInteractionsBPL に変更し適用ボタンをクリックします。

    (20) テストを実行します。

    先ほどのテストと同じファイル(/home/project/shared/Samples-Integration-SmartTicketing/SampleFiles/Red_Light_Camera_Violations_Test.csv)をCtrl + c でコピーし、/home/project/shared/Samples-Integration-RedLights/data/In に Ctrl + v でペーストしてテストを実行してください。

    メッセージビューワを利用して、いくつかのメッセージがビジネス・プロセスで止まっていることを確認してください。

    管理ポータル > Interoperability > 表示 > メッセージ 

    ビジネス・プロセスで停止しているトレース例は以下の通りです。

     をクリックすると、画面右側にルールのどの条件を通過したか、確認できる画面が表示されます。

    のリンクをクリックすると、ルールエディタが開き、通過した場所を表示します。

    以下のトレース例は、オペレーションまでメッセージが流れいてる例です(high のパタン)。

    ④ Add routing

    先ほどまでの流れでは、危険な交差点であることが判明した場合、その情報をファイル出力していました。

    ここに、各交差点の人口密度に関する情報を取得し、危険な交差点情報の追加情報としてファイル出力に加えることで、危険な交差点に対してどのような対応がとれるかより良い方法を探ることができるようになります。

    作成中のビジネス・プロセス:Demo.HighRiskIntersectionsBPL に、REST を使用して US Census が提供するサービスの呼び出しを追加し、交差点の緯度と経度から GeoJSON コードを取得するように変更します。

    次に、人口情報を取得するため米国国勢調査が提供する別のサービスの呼び出しを行い、取得した人口密度情報をハイリスクの交差点情報に追加し、ファイル出力を行います。

    (1) プロダクション構成ページにビジネス・オペレーションを追加します。

    チュートリアルのサンプルとして用意のある Demo.ToCensusGeoServiceBO クラスを使用して以下の設定で新しいビジネス・オペレーションを追加します。

    • オペレーションクラス:  Demo.ToCensusGeoServiceBO  
    • 有効にする: チェックします
    • (設定タブ)HTTPサーバ: tigerweb.geo.census.gov
    • (設定タブ)URL: /arcgis/rest/services/TIGERweb/Tracts_Blocks/MapServer/5/
    • (設定タブ)SSL 設定: RESTSSL

    SSL 設定は作成していないため、以下の手順で追加します。

    管理ポータル > システム管理 > セキュリティ > SSL/TLS 構成 > 新規構成の作成ボタンクリック > 構成名に RESTSSL を設定し保存ボタンクリック

    (2) プロダクションの設定を変更します。

    管理ポータル > Interoperability > (USERネームスペースを選択)> 構成 > プロダクション を開き画面右側の「設定」タブの下の方に配置されている [開発とデバッグ]を展開し「テスト使用可能」をチェックし適用ボタンクリックします。

    (3) ビジネス・オペレーション:Demo.ToCensusGeoServiceBO をテストします。

     をクリック(コンポーネント名をクリック)し、画面右側の「アクション」タブを選択し  ボタンをクリックします。

    テスト画面が表示されるので以下入力し  をクリックします。

    Latitude: 41.95402905

    Longtitude: -87.70807749

     

     

    (4) もう1つ、ビジネス・オペレーションを追加します。

    • クラス名: Demo.ToCensusDS
    • 有効にする: チェックします。
    • (設定タブ)HTTPサーバ: api.census.gov
    • (設定タブ)URL: /data/2014/acs/acs5
    • (設定タブ)SSL設定: RESTSSL

    (5) ビジネス・プロセス: HighRiskIntersectionsBPL をビジネス・プロセス・エディタで開きます。

    プロダクション構成画面で  を選択し(コンポーネント名を選択し)、画面右側の設定タブの「情報を提供する設定」を展開し、クラス名の右側に表示されている虫眼鏡アイコン  をクリックします。

    (6) 以下の修正を行います。

    Geo サービス(ビジネス・オペレーション:Demo.ToCensusGeoServiceBO)から取得した GeoJSON 情報を Census サービス(ビジネス・オペレーション:Demo.ToCensusDS)に渡すために、追加でコンテキスト・プロパテを設定します。

    [コンテキスト] タブに移動し、Demo.GeoResponse タイプの GeoResponse プロパティと、%String(MAXLEN=50) タイプの Population プロパティを追加します。

    (7) すべての交差点情報に緯度と経度のデータがあるとは限らないためファイル出力情報に追加できない場合もあります。

    経度と緯度の情報がある場合、ない場合で処理を分けられるように新しい <if> アクティビティを追加します。

    追加場所は、現在の <if> アクティビティと HighRiskArchiveオペレーション を呼び出す<call> アクティビティの間に追加します。

    true の線を選択し、<if>アクティビティを追加します。

    <if> アクティビティの設定内容は以下の通りです。

    • 名前: Geo情報の有無
    • 条件: $length(request.LATITUDE)>0

    メモ:$length() は InterSystems ObjectScript の関数で、引数に指定した文字数を返します。

    (8) (7)で追加した<if> アクティビティ(Geo情報の有無)で、経度と緯度の情報が取得できた場合、2 つの <call> アクティビティを追加します。

    1 つ目の <call> アクティビティの設定は以下の通りです。

    • 名前: Geo情報取得
    • ターゲット: Demo.ToCensusGeoServiceBO
    • 非同期: チェックを外します(同期処理に変更します)
    • 要求メッセージクラス: Demo.GeoRequest
    • 要求アクション: 
    • 応答メッセージクラス: Demo.GeoResponse
    • 応答アクション: 

    要求メッセージクラスの設定では、永続クラス > Demo > GeoRequest の順に選択します。

    応答メッセージクラスの設定では、永続 クラス> Demo > GeoResponse の順に選択します。

    要求アクションの設定は、 ボタンをクリックしても設定できます。

    応答アクションの設定は、 ボタンからも設定できます。

     

    2つ目の <call> アクティビティの設定は以下の通りです。

    • 名前: 人口密度情報取得
    • ターゲット: Demo.ToCensusDS
    • 非同期: チェックを外します(同期処理に変更します)
    • 要求メッセージクラス: Demo.PopulationRequest
    • 要求アクション: 
    • 応答メッセージクラス: Demo.PopulationResponse
    • 応答アクション: 

    要求メッセージクラスの設定では、永続クラス > Demo > PopulationRequest の順に選択します。

    応答メッセージクラスの設定では、永続クラス > Demo > PopulationResponse の順に選択します。

    要求アクションの設定は、 ボタンをクリックしても設定できます。

    State プロパティと同様に、Country、Tract、BackGroup も設定した例は以下の通りです。

    応答アクションの設定は、 ボタンからも設定できます。

     

    (9) Geo情報(経度と緯度の情報)がない場合、人口密度情報を取得できないため、人口密度情報を含まないハイリスク用のファイルを作成する必要があります。

    Geo情報有無 の <if> アクティビティで false の場合は何も処理せず、ブロックの終わりに移動するように線を引きます。 

    (10) ビジネス・プロセスをコンパイルします。

    (11) ハイリスクの交差点の情報を出力するファイルに人口密度情報を追加するため、レコードマップ:Demo.HighRiskArchiveMap を修正します。

    管理ポータルの ホーム > Interoperability > 構築 > レコード・マップ > 開く > Demo.HighRiskArchiveMap で定義を開きます。

    (レコードマップの画面は直近で操作した定義が表示されます。手順通りに進めていると Demo.HighRiskArchiveMap が開いた状態で画面が開きます。)

    PopulationDensity をカラムを追加し、データタイプを %String  に設定します。

     をクリックし新しいカラムを追加します。

    修正が完了したら、忘れずに  ボタンをクリックします。ボタンを押した後の画面は以下ご参照ください。

    (12) ビジネス・プロセス:Demo.HighRiskIntersectionsBPL のエディタに戻ります。

    を選択し、を利用して値の割り当てを追加します。

    context.Population を callrequest.PopulationDensity に割り当てを追加します(callrequest.PopulationDensity はレコードマップで追加したカラム名です)。

    修正が完了したらコンパイルを行います。

    (13) テストを行います。

    Sandbox の IDE の左画面から /home/project/shared/Samples-Integration-SmartTicketing/SampleFiles/Red_Light_Camera_Violations_Test.csv ファイルを Ctrl + c でコピーし、/home/project/shared/Samples-Integration-RedLights/data/In/ のフォルダに Ctrl + v でペーストします。

    メッセージビューワで確認します(管理ポータルの ホーム > Interoperability > 表示 > メッセージ)。

    画面右側の「トレース」タブを参照しながら、追加した REST サービスを呼び出すオペレーションへの経路があるトレースを開き、流れを確認してください。

     

    ⑤ Explore custom business components

    InterSystems IRIS には、コーディングをほとんど必要としないすぐに使えるコンポーネントが多く用意されています。

    構築済コンポーネント以外では、InterSystems ObjectScript で作成するカスタム・コンポーネントもあり、カスタム・コンポーネントの利点としては、処理に必要なことなら何でもコードで追記することができます。

    チュートリアルに登場したビジネス・オペレーションの Demo.ToCensusGeoServiceBO と Demo.ToCensusDS は、カスタム・コンポーネントとして作成しています。

    以降の紹介では、InterSystems ObjectScript で記述されたカスタムコンポーネントのコードについてご説明します。

    Sandbox の IDE を開きます(https://gettingstarted.intersystems.com/interoperability/red-lights-part-2/#get-set-up からアクセス情報をご確認ください)。

    左画面で、shared/Samples-Integration-SmartTicketing/Setup/src/cls に移動し、Demo.ToCensusDS クラスを開きます。

    このクラスの中のコードでは、REST エンドポイントを呼び出し、情報を取得して、呼び出したビジネス・プロセスにデータを返送している処理を記述しています。

    以下、コードで登場する変数やメソッドについての補足です。

    • 変数 tURL は、プロダクション構成の  で設定した情報を ..Adapter.URL で取得し、ここに REST サービスを呼び出す時に必要となるクエリパラメータを追記しています。
    • GetURL()メソッドは、 と組み立てた URL(=変数 tURL)を利用して、GET 要求を実行し、HTTP 応答を受信しています。HTTP 応答は、参照渡しで指定された第2引数 tHttpResponse に登録されます。
    • ..JSONStreamToObject() メソッドは、ビジネス・オペレーションが使用している REST 用のアウトバウンドアダプタ(ビジネス・オペレーションに追加できるアダプタ)から提供されるメソッドで、GET 要求から得られた HTTP 応答のストリームに含まれる JSON データを​​ IRIS のダイナミックオブジェクト(=IRIS 内で JSON を操作するときに使用するインスタンス)​​​に変換しています。
    • Demo.GeoResponse のインスタンスを新規生成(set pResponse = ##class(Demo.GeoResponse).%New())している流れでは、HTTP 応答から変換した JSON のダイナミックオブジェクトを使用して、返送データを応答メッセージのプロパティに設定しています。インスタンスを設定している変数 pResponse は、メソッド:GetGeoInfo() の第2引数に参照渡しとして設定されている引数で、この変数に情報を設定することで、ビジネス・オペレーションの応答メッセージとして呼び出し元に返送されます。
    /// Retrieves GeoJSON data from the USCensus using longitude and latitude.
    Method GetGeoInfo(pRequest As Demo.GeoRequest, Output pResponse As Demo.GeoResponse) As %Status
    {
      try {
          // Prepare and log the call
          // Append the city to the URL configured for adapter
          set tURL= ..Adapter.URL _ "query?geometry=" _ pRequest.Longitude _ "," 
          _ pRequest.Latitude _ "&geometryType=esriGeometryPoint&outfields=*"
          _ "&returnGeometry=true&returnIdsOnly=false&inSR=4326&f=geojson"
          
          // Execute the call
          $$$TRACE("Executing call")
          set tSC=..Adapter.GetURL(tURL,.tHttpResponse)
          
          // Return the response
          if $$$ISERR(tSC)&&$IsObject(tHttpResponse)&&$IsObject(tHttpResponse.Data)
            &&tHttpResponse.Data.Size {
             set tSC=
             $$$ERROR($$$EnsErrGeneral,$$$StatusDisplayString(tSC)_":"_tHttpResponse.Data.Read())
          }
          quit:$$$ISERR(tSC)
          if $IsObject(tHttpResponse) {
             // Instantiate the response object
             set pResponse = ##class(Demo.GeoResponse).%New()
             // Convert JSON into a Proxy Object
             set tSC = ..JSONStreamToObject(tHttpResponse.Data, .tProxy)
             if (tSC){                                 
                // Set response properties from the Proxy Object
                set pResponse.State = tProxy.features.GetAt(1).properties.STATE
                set pResponse.County = tProxy.features.GetAt(1).properties.COUNTY
                set pResponse.Tract = tProxy.features.GetAt(1).properties.TRACT
                set pResponse.BlockGroup = tProxy.features.GetAt(1).properties.BLKGRP
                $$$TRACE("Object created with " _ pResponse.State)
               } 
           }
       }catch{
           set tSC=$$$SystemError
       }
       quit tSC
    }

     


    Troubleshooting Guide

    問題 対策
    Sandbox が起動しない、ページが表示されない この記事のコメント欄でお知らせください

    メッセージビューワにメッセージが表示されない

    ビジネス・サービス:From_RedLightArchiveの設定タブにある「ターゲット構成名」が正しく設定されているかご確認ください。

    チュートリアル前半では、ターゲット構成名には To_HighRiskArchive が設定されています。

    チュートリアル公判では、Demo.HighRiskIntersectionsBPL が設定されています。

    cross-originエラーが発生する

    管理ポータルの URL を https:// から http:// に変更し、再度実行してみてください。

    Sandbox は、コンテナ間でコンテンツを共有するように設定されているため、共有フォルダ内のファイルに正常にアクセスするために必要になる場合があります。

    ビジネス・オペレーション:Demo.ToCensusGeoServiceBO テスト時にエラーが発生

    テスト時に入力したデータ(longitude、latitude)をご確認ください。(例に記載の文字列をご利用ください)

    テストボタンが無効になっていて押せない プロダクションの設定を確認します。
    設定タブの下の方にある「開発とデバッグ」を展開し、テスト使用可能のチェックを入れ  適用ボタンをクリックしてから再度お試しください。

    メッセージビューワに表示されるメッセージ一覧に「Ens.ScheduleService」が表示されていて、チュートリアルの流れには登場していません。

    このメッセージはバックグラウンド処理に関連したメッセージで無視いただけます。

    メッセージ一覧にチュートリアルで使用しているメッセージが表示されていれば大丈夫です。

     

    10
    1 0 0 45
    Log in or sign up to continue