投稿者

インターシステムズジャパン
記事 Toshihiko Minamoto · 12月 28, 2023 35m read

PEX を使用して IRIS と .NET または Javaとの統合を実装

はじめに {#Webinar:ImplementingIntegrationswith.NetorJava-Introduction}

InterSystems IRIS 2020.1 には、Java または .NET で記述されたコンポーネントで IRIS 相互運用性プロダクションの開発を容易にする PEX(プロダクション拡張フレームワーク)が含まれています。

この PEX により、Java または .NET の知識を備える統合開発者は、InterSystems IRIS 相互運用性フレームワークの力、スケーラビリティ、および堅牢性を利用し、すぐに生産性を高めることができます。

IRIS 相互運用性フレームワークエキスパートに対し、PEX は既存の Java 言語または .NET 言語の外部コンポーネントとの統合を簡単にリッチ化することができます。

このチュートリアルでは、PEX を詳しく見ながら、.NET 開発者による PEX のはじめての使用を説明します。 コードは、https://github.com/es-comunidad-intersystems/webinar-PE にあります。

このチュートリアルは、https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=EPEX にあるオンライン PEX ドキュメントを補足するものです。

 

InterSystems IRIS 相互運用性のアーキテクチャ {#Webinar:ImplementarIntegracionescon.NetoJava-ArquitecturadeInteroperabilidadInterSystemsIRIS}

PEX では、任意のプログラミング言語(現時点では Java または .NET。将来的に Python も追加)を選択して、IRIS 相互運用性プロダクションを形成するコンポーネント(ビジネスサービス、ビジネスプロセス、ビジネスオペレーション、インバウンドアダプター、アウトバウンドアダプター、メッセージ)を実装できます。

IRIS 相互運用性には主に 3 つのコンポーネントがあります。

  • ビジネスサービス: 外部から使用できるサービスを提供するコンポーネント。 ビジネスサービスの例には REST サービスや SOAP Web サービスがありますが、ディレクトリに書き込まれた新しいファイルの読み取りと処理を行うサービス、データベーステーブルの行の読み取りと処理を行うサービス、FTP 経由でファイルを読み取るサービスなどもあります。 ビジネスサービスにはインバウンドアダプターが関連付けられる場合があり、特定のプロトコルの実装情報を管理します(SQL テーブルを読み取る SQLInboundAdapter、ファイルを読み取る FileInboundAdapter など)。 ビジネスサービスは、情報の処理、IRIS 相互運用性メッセージへの情報のコピー、およびビジネスプロセスまたはビジネスオペレーションへのメッセージの送信とレスポンスがある場合はその待機などを行います。  
  • ビジネスオペレーション: IRIS 相互運用性メッセージを受け取り、外部システムで稼働するコンポーネント。プロトコル実装情報(TCP、REST、SOAP、Files、SQL など)を管理する OutboundAdapter を使用する場合があります。 ビジネスオペレーションは呼び出し元にレスポンスを返す場合とそうでない場合があります。  
  • ビジネスプロセス: IRS 相互運用性メッセージを受信する際に 1 つ以上の他のビジネスプロセスまたはオペレーションを処理して呼び出しを行い、複雑なオペレーションを実行したり、それを送信したビジネスサービスに情報を追加してメッセージ返したりするオーケストレーションプロセスです。

コンポーネント構成は、「Production」にグループ化されます。これは、IRIS が起動する際にまとめて起動するすべての統合の定義と、これらの統合の各コンポーネントの構成を含む InterSystems IRIS クラスです。 IRIS クラスとして編集するか、管理ポータルから変更できます。

 

PEX のアーキテクチャ {#Webinar:ImplementarIntegracionescon.NetoJava-ArquitecturadePEX}

.NET または Java コードを実行するために、InterSystems IRIS は対応するオブジェクトゲートウェイを使用します。 このゲートウェイはローカルまたはリモートサーバー上にインスタンス化できます。

Java と .NET ゲートウェイ {#Webinar:ImplementarIntegracionescon.NetoJava-LosJavay.NetGateways}

ゲートウェイは、特定の TCP/IP ポートをリッスンし、IRIS プロセスからのリクエストを受信して実行し、結果を返すネイティブの .NET または Java コンポーネントです。

ビルド済みの PEX コンポーネント {#Webinar:ImplementarIntegracionescon.NetoJava-LosComponentesPEXpre-construidos}

IRIS プロダクションで PEX を使用するには、Java または .NET で開発されたコンポーネントごとに、ビルド済みのコンポーネントをプロダクションに追加する必要があります。 ビルド済みのコンポーネントはそれが参照する外部要素のラッパーとして機能し、そのプロパティと構成をプロダクション内で定義することができます。

対応するゲートウェイから実行している Java または .NET コンポーネントは、既存の PEX コンポーネントを継承している(サブクラス化される)必要があります。 これらの要素の概要を以下に示します。

IRIS コンポーネント {#Webinar:ImplementarIntegracionescon.NetoJava-ComponentesdeIRIS}

.NET と Java 用

<th>
  クラス
</th>

<th>
  コメント
</th>
<td>
  EnsLib.PEX.BusinessService
</td>

<td>
  構成されるアダプター: Ens.InboundAdapter
</td>
<td>
  EnsLib.PEX.BusinessProcess
</td>

<td>
   
</td>
<td>
  EnsLib.PEX.BusinessOperation
</td>

<td>
   
</td>
<td>
  EnsLib.PEX.InboundAdapter
</td>

<td>
   
</td>
<td>
  EnsLib.PEX.OutboundAdapter
</td>

<td>
   
</td>
<td>
  EnsLib.PEX.Message
</td>

<td>
  PEX コンポーネントに送信するメッセージ
</td>
<td>
  IRIS メッセージにマッピング
</td>

<td>
  IRIS コンポーネントへの PEX コンポーネントのメッセージ
</td>
機能
ビジネスサービス
ビジネスプロセス
ビジネスオペレーション
インバウンドアダプター
アウトバウンドアダプター
PEX メッセージ
IRIS メッセージ

 

Java または .NET コンポーネント

これらのコンポーネントは Java または .NET プロジェクトに追加されるライブラリに提供されています。 PEX プロジェクトで参照する最低限のライブラリは、ゲートウェイのライブラリと同じです。 また、IRISObject メッセージを使って PEX から IRIS コンポーネントを呼び出す場合、IRISClient ライブラリを参照する必要があります。

<th>
  ライブラリ
</th>
<td>
  &lt;installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.Gateway64.exe 
  &lt;installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.IRISClient.dll
</td>
<td>
  &lt;installdir>\dev\java\lib\JDK18\intersystems-gateway-3.1.0.jar 
  &lt;installdir>\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar 
  &lt;installdir>\dev\java\lib\gson\gson-2.8.5.jar
</td>
言語
.NET
Java

 

.NET コンポーネントに使用するスーパークラス

<th>
  .NET クラス
</th>
<td>
  InterSystems.EnsLib.PEX.BusinessService
</td>
<td>
  InterSystems.EnsLib.PEX.BusinessProcess
</td>
<td>
  InterSystems.EnsLib.PEX.BusinessOperation
</td>
<td>
  InterSystems.EnsLib.PEX.InboundAdapter
</td>
<td>
  InterSystems.EnsLib.PEX.OutboundAdapter
</td>
<td>
  InterSystems.EnsLib.PEX.Message
</td>
<td>
  InterSystems.Data.IRISClient.ADO.IRISObject
</td>
機能
ビジネスサービス
ビジネスプロセス
ビジネスオペレーション
インバウンドアダプター
アウトバウンドアダプター
PEX メッセージ
IRIS メッセージ

 

Java コンポーネントに使用するスーパークラス

<th>
  Java クラス
</th>
<td>
  com.intersystems.enslib.BusinessService
</td>
<td>
  com.intersystems.enslib.BusinessProcess
</td>
<td>
  com.intersystems.enslib.BusinessOperation.
</td>
<td>
  com.intersystems.enslib.pex.InboundAdapter
</td>
<td>
  com.intersystems.enslib.pex.OutboundAdapter
</td>
<td>
  com.intersystems.enslib.pex.Message
</td>
<td>
  &lt;...>.IRISObject
</td>
機能
ビジネスサービス
ビジネスプロセス
ビジネスオペレーション
インバウンドアダプター
アウトバウンドアダプター
PEX メッセージ
IRIS メッセージ

 

ユーティリティ関数 {#Webinar:ImplementarIntegracionescon.NetoJava-FuncionesdeUtilidades}

ObjectScript に実装されているコンポーネントでは、InterSystems IRIS は、マクロの形式で IRIS イベントログに情報を入力するためのコマンドをいくつか提供しています。 これらのメソッドは、以下のように Java と .NET で使用できます。

<th>
  説明
</th>
<td>
  「info」ステータスのメッセージをイベントログに追加します。
</td>
<td>
  「alert」ステータスのメッセージをイベントログに追加します。
</td>
<td>
  「warning」ステータスのメッセージをイベントログに追加します。
</td>
<td>
  「error」ステータスのメッセージをイベントログに追加します。
</td>
<td>
  「assert」ステータスのメッセージをイベントログに追加します。
</td>
メソッド
LOGINFO(message)
LOGALERT(message)
LOGWARNING(message)
LOGERROR(message)
LOGASSERT(message)

 

ネイティブコンポーネントと PEX コンポーネントの相互運用性 {#Webinar:ImplementarIntegracionescon.NetoJava-InteroperabilidadentrecomponentesnativosycomponentesPEX}

InterSystems IRIS のネイティブ ObjectScript 言語のコンポーネントと Java または .NET で開発された PEX コンポーネントを組み合わせることが可能です。

  • 両方のコンポーネントが BusinessService タイプと InboundAdapter または BusinessOperation と OutboundAdapter である場合、開発者は呼び出しに使用するデータ/オブジェクトのタイプを選択できます。呼び出しは IRIS と Java/.NET ゲートウェイの間で、ゲートウェイを判定するデータ変換ルールに従って行われます。
  • 情報を交換する両方のコンポーネントがビジネスホスト(BS、BP、BO)である場合、メッセージ(リクエストまたはレスポンス)を受け取るコンポーネントがは、メッセージに使用するオブジェクトのタイプを強制します。
    • PEX コンポーネントは常にメッセージ EnsLib.PEX.Message を受信します。
    • IRIS コンポーネントはメッセージ IRISObject を受信します。

EnsLib.PEX.Message {#Webinar:ImplementarIntegracionescon.NetoJava-EnsLib.PEX.Message}

EnsLib.PEX.Message を使用すると、.NET または Java で定義された構造のメッセージを IRIS ObjectScript で表現できます。 IRIS は DynamicObject 関数を使用してプロパティを操作します。 内部的には、IRIS は JSON を IRIS と .NET/Java 間のトランスポート媒体として使用します。 IRIS で PEX メッセージを作成する際、メッセージを使用するためにインスタンス化される必要のある .NET/Java クラスの名前は %classname として設定される必要があります。

IRISObject {#Webinar:ImplementarIntegracionescon.NetoJava-IRISObject}

ビルド済みの InterSystems IRIS コンポーネントを PEX コンポーネントから呼び出すには、IRISObject タイプのメッセージが定義されている必要があります(.NET では、完全なクラスは InterSystems.Data.IRISClient.ADO.IRISObject です)。

PEX と .NET の最初のステップ {#Webinar:ImplementarIntegracionescon.NetoJava-PrimerosPasosconPEXy.NET}

最初のステップでは、以下を行います。

  • 必要な PEX ライブラリ、.NET フレームワークバージョン 4.5 を使って .NET プロジェクトを作成する
  • .NET プロジェクトに BusinessOperation と単純なメッセージを追加する
  • InterSystems IRIS の .NET ゲートウェイを構成する
  • 相互運用性プロダクションを作成する
  • ビルド済みの BO を追加する

Visual Studio 2019 で .NET プロジェクトを作成する {#Webinar:ImplementingIntegrationswith.NetorJava-Creatinga.NETProjectwithVisualStudio2019}

Visual Studio で新しい「Class Library .Net Standard in C #」タイプのプロジェクトを作成します。 これを「PEX.Webinar.FirstDemo」とします。

PEX を操作するには、「Solution Explorer」と「Add Reference(参照を追加)」コンテキストメニューから必要な依存関係を追加します。

次に「Browse(参照)」ボタンを使って、2 つのライブラリ(.NET Framework 4.5! 対応)を追加します。これは、InterSystems IRIS インストールのサブディレクトリにあります。

<installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.Gateway64.exe <installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.IRISClient.dll

ソリューション Explorer Class 1.cs から「FirstOperation.cs」に名前が変更され、クラスは BusinessOperation PEX クラス(InterSystems.EnsLib.PEX.BusinessOperation)から継承するように変更されます。 すべての 3 つの PEX.BusinessOperation メソッドは上書きされています。

<th>
  説明
</th>
<td>
  このコンポーネントがプロダクションで開始されるときに 1 回実行します。 これにより、ライブラリ、接続、および変数を起動できるようになります...
</td>
<td>
  このコンポーネントまたはプロダクションが停止するときに 1 回実行します。 コンポーネントのライフサイクルで使用されたリソースを解放できるようになります。
</td>
<td>
  受信するメッセージごとに実行します。 メッセージを処理し、レスポンスを返すことができます。
</td>
メソッド
OnInit
OnTearDown
OnMessage

 

この時点では、メッセージや実行するタスクは定義されていません。 そのため、LOGINFO 関数は 3 つのメソッドに追加されています。 一方で、スーパークラスメソッドが呼び出される必要がないため、基底クラス(base.OnInit ()、base.OnTearDown()、base.OnMessage)への呼び出しを除去できます。 実装を以下のようにします。

<th>
  初期デプロイ
</th>
<td>

OnInit

メソッド
OnInit
public override void OnInit()         {             LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnInit()");         }
OnTearDown
<td>
  <b>OnTearDown</b>
public override void OnTearDown()        {            LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnTearDown()");        }
OnMessage
<td>
  <b>OnMessage</b>
public override object OnMessage(object request)        {            LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnMessage()");            return request;        }

 

これにより、「Build Solution」(ソリューションをビルド)メニューで、最初の .NET プロジェクトバージョンをコンパイルできます。 すると IRIS は以下のファイルを生成します。これは次に使用されるファイルです。

1>------ Build started: Project: PEX.Webinar.FirstDemo, Configuration: Debug Any CPU ------ 1>PEX.Webinar.FirstDemo -> C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\netstandard2.0\PEX.Webinar.FirstDemo.dll ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

InterSystems IRIS 相互運用性プロダクションの作成 {#Webinar:ImplementingIntegrationswith.NetorJava-InterSystemsIRISInteroperabilityProductionCreation}

IRIS 管理ポータルで、「Interoperability」(相互運用性)メニュー、「Ensemble」ネームスペース、および「Configure」(構成)および「Production」(プロダクション)メニューを使用できるようになりました。 「Actions」(アクション)タブと「New」(新規)ボタンを使って、新しい IRIS 統合プロダクションを定義できます。

テストサービスを有効にするには、「Settings」(設定)タブを選択し、リストの最後のセクション(「Development and Debugging」)で「Testing Enabled」を有効にし、Apply(適用)ボタンをクリックします。

.NET ゲートウェイをプロダクションに追加する {#Webinar:ImplementingIntegrationswith.NetorJava-Addingthe.NETGatewaytotheProducción}

PEX を操作するには、対応する Java または .NET ゲートウェイが起動している必要があります。 InterSystems では、プロダクション環境(ライブ)の System Administration(システム管理)/Configuration(構成)/Connectivity(接続)/Object Gateways(オブジェクトゲートウェイ)メニューからこれらのゲートウェイを構成して起動することを推奨しています。 この開発環境においては、コンポーネントをプロダクションに直接追加してゲートウェイを起動することができます。 このため、ワンクリックで、ゲートウェイをプロダクションとして同時に開始・停止できるようになるため、再コンパイルする際に .NET プロジェクトの .DLL へのアクセスを解放することができます(Visual Studio では .NET ゲートウェイが起動している場合に再コンパイルすることができません)。

「.NET Gateway」コンポーネントを追加するには、「Services」(サービス)の横にある「+」ボタンを使用して、プロダクションにビジネスサービスを追加します。 追加されるコンポーネントクラス名(Service クラス)は「EnsLib.DotNetGateway.Service」で、「Enable now」(今すぐ有効化)を選択してこのコンポーネントを有効にします。

追加されたコンポーネントの構成パラメーターは、それをクリックして、「Settings」(設定)タブに値を入力し、「Apply」(適用)ボタンをクリックして編集できます。

<th>
  値
</th>

<th>
  説明
</th>
<td>
  44444
</td>

<td>
  デフォルトのポート 55000 が別のプロセスでビジー状態である場合に、このポートに変更できます。
</td>
<td>
  &lt;installdir>\dev\dotnet\bin\v4.5\
</td>

<td>
  これは、実行可能なゲートウェイ(InterSystems.Data.Gateway64.exe)が存在する場所を示し、 &lt;InstallDir> は IRIS インストールディレクトリです。例: C:\InterSystems\IRIS20201\dev\dotnet\bin\v4.5\
</td>
<td>
  true
</td>

<td>
  64 ビットゲートウェイバージョンを選択します
</td>
<td>
  4.5
</td>

<td>
  .NET バージョンは 4.5 である必要があります
</td>
パラメーター
Port(ポート)
FilePath(ファイルパス)
Exec64
.NET Version(.NET バージョン)

 

.NET で作成されたビジネスオペレーションを追加する  {#Webinar:ImplementingIntegrationswith.NetorJava-AddingtheBusinessOperationcreatedin.NET}

次に、前に作成された .NET コードを参照するために、「Operations」(オペレーション)の横にある「+」ボタンを使用して、PEX ビジネスオペレーションを追加します。 クラスタイプは 「EnsLib.PEX.BusinessOperation」で、(オプションの)コンポーネントは「PEX.Webinar.FirstOperation」と呼ばれます。「Enable Now」を使って有効にされます。

次に、コンポーネントを構成し(追加されたコンポーネントをクリックします)、右側の「Settings」(設定)を選択します。

<th>
  値
</th>

<th>
  説明
</th>
<td>
  PEX.Webinar.FirstDemo.FirstOperation
</td>

<td>
  生成される .NET クラスの名前
</td>
<td>
  44444
</td>

<td>
  .NET ゲートウェイが構成されている TCP ポート
</td>
<td>
  C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\ netstandard2.0\PEX.Webinar.FirstDemo.dll
</td>

<td>
  含める .DLL の場所。 これは、Visual Studio ビルドが .DLL を生成した場所です。
</td>
パラメーター
Remote Classname(リモートクラス名)
Gateway Port(ゲートウェイポート)
Gateway Extra CLASSPATH(ゲートウェイ追加クラスパス)

変更を適用するために、「Apply」(適用)ボタンをクリックします。

プロダクションを追加してテストする {#Webinar:ImplementingIntegrationswith.NetorJava-AddingandStartingtheProduction}

「Start」(起動)ボタンによって、プロダクションとそのすべてのコンポーネントが起動します。

InterSystems IRIS では、コンポーネントの単純な隔離テストを実施できます。 「PEX.Webinar.FirstOperation」という「ビジネスオペレーション」を選択し、Actions(アクション)タブから「Test」(テスト)ボタンを選択します。

次の画面では以下のようにデータが入力されます。

<th>
  値
</th>

<th>
  説明
</th>
<td>
  EnsLib.PEX.Message
</td>

<td>
  送信される IRIS メッセージのタイプ。 常に EnsLib.PEX.Message です。 Java または .NET PEX コンポーネントに値を渡す動的プロパティを使用できます。
</td>
<td>
  InterSystems.EnsLib.PEX.Message
</td>

<td>
  Java または .NET にコンポーネントリクエストとして定義されるメッセージのクラス名。 .NET の場合、これは InterSystems.EnsLib.PEX.Message またはサブクラスである必要があります。
</td>
パラメーター
リクエストタイプ
%classname

「Invoke Testing Service」(テストサービスを呼び出す)をクリックすると、IRIS 相互運用性フレームワークはメッセージをコンポーネントに送信し、.NET コードが実行されます。

「Visual Trace」(ビジュアルトレース)をクリックすると、詳細を表示できます。 白いドット(#3)は、.NET に実装された「LOGINFO」トレースをひょじします。

IRIS イベントログには、OnInit() と OnTearDown() を含む生成されるすべての LOGINFO() メッセージのコンパイルが含まれます。

PEX での次のステップ: プロダクションの完成 {#Webinar:ImplementingIntegrationswith.NetorJava-NextStepswithPEX:CompletingtheProduction}

以下のように、他のタイプのコンポーネントが .NET で作成されます。

  • .NET メッセージ
  • .NET ビジネスサービス
  • .NET ビジネスプロセス

データによる PEX メッセージの作成と使用 {#Webinar:ImplementingIntegrationswith.NetorJava-CreatingandUsingaPEXMessagewithData}

Ensemble から PEX コンポーネントに情報を渡すために、渡される情報のプロパティを使って、サブクラス InterSystems.EnsLib.PEX.Message として、.NET でクラスを定義します。 単純化された例をそのまま使用し、メッセージに文字列「value」プロパティを追加します。 PEX ビジネスオペレーションは、コンテンツが大文字に変換された同じタイプのメッセージになります。

.NET のメッセージクラス {#Webinar:ImplementarIntegracionescon.NetoJava-Clasedemensajeen.NET}

新しい「FirstMessage.cs」ファイルは、以下の定義を使って .NET プロジェクトに追加されます。

FirstMessage

using System; using System.Collections.Generic; using System.Text; namespace PEX.Webinar.FirstDemo {     class FirstMessage : InterSystems.EnsLib.PEX.Message     {         public string value;     } }

.NET からメッセージを使用する {#Webinar:ImplementarIntegracionescon.NetoJava-Usodelmensajedesde.NET}

FirstOperation ビジネスオペレーションでは、OnMessage のデータ型はオブジェクトとして定義されます。 これを使用するには、「FirstMessage」クラスにキャストする必要があります。

OnMessageV2

public override object OnMessage(object request)         {             LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnMessage()");             ///レスポンスメッセージがインスタンス化             FirstMessage response = new FirstMessage();             //値がリクエストから「uppercase」でコピーされる             response.value = ((FirstMessage)request).value.ToUpper();             //レスポンスが返される             return response;         }

IRIS プロダクションを停止する(「Stop」(停止)ボタンを使用)か、少なくとも .NET ゲートウェイを無効にして(コンポーネントをダブルクリック)、.NET プロジェクトをコンパイルする必要があります。

InterSystems IRIS からクラスを使用する {#Webinar:ImplementarIntegracionescon.NetoJava-UsodelaclasedesdeInterSystemsIRIS}

「Test」(テスト)ボタン(テストサービス)では、EnsLib クラスの動的プロパティを filled.PEX.Message にできません。 ただし、テストサービスは IRIS ネイティブの「Ens.StringRequest」メッセージタイプとともに使用でき、(データ変換を通じて)PEX メッセージに変換することができます。 変換は、ビルド済みのルータータイプのビジネスプロセスから呼び出されます。

データ変換 {#Webinar:ImplementingIntegrationswith.NetorJava-DataTransformation}

データ変換は、データをネイティブ Ensemble メッセージからコピーするために作成されます。

<th>
  ソース
</th>

<th>
  ターゲット
</th>

<th>
  コメント
</th>
<td>
  EnsLib.StringRequest
</td>

<td>
  EnsLib.PEX.Message
</td>

<td>
  変換ソースとターゲットのクラス
</td>
<td>
  該当なし
</td>

<td>
  PEX.Webinar.FirstDemo.FirstMessage
</td>

<td>
  PEX メッセージ(ターゲット)の場合、%classname は、使用される .NET/Java クラス名を定義します。
</td>
<td>
  source.StringValue
</td>

<td>
  target.%jsonObject.value
</td>

<td>
  ターゲット PEX メッセージでは、動的プロパティは %jsonObject 内にあります。
</td>
 
クラス
%classname
プロパティ

 

データ変換は、管理ポータルの「Interoperability」>「ビルド」>「データ変換」にある「New」(新規)ボタンを使用して作成できます。

その後、「ソース」から「ターゲット」メッセージへの変換のパラメーターは、グラフィックツールを使用して、下に表示される 2 行のテキストを取得するように右側の「Action」(アクション)タブにテキストを入力することで、前のテーブルで説明されたとおりに定義されます。 すると、「Tools」(ツール)タブで保存、コンパイル、およびテストすることができます。

次に、「Tools」(ツール)タブを開いて、このデータ変換をテストできます。

ソースメッセージの値を指定(StringValue)して、結果を検証できるテストウィンドウが開きます。

ご覧のとおり、PEX メッセージは内部 JSON 表現を使用して、IRIS と Java または .NET 間で値を送信しています。

ルータータイプのビジネスプロセスを作成する {#Webinar:ImplementingIntegrationswith.NetorJava-CreatingaRoutertypeBusinessProcess}

ルータータイプのビジネスプロセスをプロダクションに追加し、作成されるデータ変換を呼び出して既存のビジネスオペレーションにメッセージを送信するルーティングルールを定義できるようになりました。

管理ポータルで、「Production Configuration」(プロダクション構成)画面(「Interoperability」/「構成」/「プロダクション」)に戻り、「Processes」(プロセス)の横にある「+」をクリックして以下のように入力し、ビジネスプロセスタイプ「EnsLib.Message.Router」を追加します。

<th>
  値
</th>

<th>
  説明
</th>
<td>
  EnsLib.MsgRouter.RoutingEngine
</td>

<td>
  ルールベースのメッセージルーティングを行うビジネスプロセス
</td>
<td>
  TRUE
</td>

<td>
  ルーティングルールのスケルトンを定義します
</td>
<td>
  MessageRouter
</td>

<td>
  プロダクションにおけるこのコンポーネントの名前
</td>
<td>
  TRUE
</td>

<td>
  このコンポーネントを直ちに有効化します
</td>
<td>
  1
</td>

<td>
  スケーラビリティ。 同時に実行するアクティブプロセス数を定義できます。
</td>
パラメーター
Business Process Class(ビジネスプロセスクラス)
Auto-Create Rule(自動作成ルール)
Business Process Name(ビジネスプロセス名)
Enable Now(今すぐ有効化)
Pool Size(プールサイズ)

 

このコンポーネントのルーティングルールの編集が残っています。 これを行うために、プロダクションの「MessageRouter」コンポーネントを選択し、ビジネスルール名の横にある虫眼鏡をクリックします。

ルールエディターでは、変換が適用された後に、すべての「Ens.StringRequest」メッセージを「PEX.Webinar.FirstOperation」ビジネスオペレーションに送信するようにルールを編集できます。 「+」ボタンを使用すると、ルールに要素を追加し、あらかじめ要素を選択する際には要素を編集することができます。 以下のようにルールを作成します。

デフォルトでは、このコンポーネントはレスポンスを期待しません。 コンポーネントの「Settings」(設定)タブで、ビジネスオペレーションからレスポンスを受信するように設定を変更しましょう。

テストサービスでルーターをテストする {#Webinar:ImplementarIntegracionescon.NetoJava-PruebadelEnrutadorconelServiciodePruebas}

プロダクションページに戻り、「Start」(起動)ボタンを使ってプロダクションを起動し、「MessageRouter」コンポーネントを選択します。「Actions」(アクション)タブで、「Test」(テスト)ボタンをクリックし、「Ens.StringRequest」タイプのメッセージを送信します。

テストレスポンスメッセージを「Test Results」(テスト結果)で確認できます。完全なメッセージログには、IRIS 相互運用性プロダクションの様々なコンポーネントに関する実行の全詳細が表示されます。

レスポンス:

  {#Webinar:ImplementarIntegracionescon.NetoJava-}

メッセージのトレース:

.NET ビジネスサービス {#Webinar:ImplementarIntegracionescon.NetoJava-BusinessServiceen.NET}

.NET の実装 {#Webinar:ImplementingIntegrationswith.NetorJava-Implementationin.NET}

Visual Studio に戻り、.NET ビジネスサービスを作成します。 この最初の例では、このビジネスサービスに特定の「インバウンドアダプター」は関連付けられていません。(CallInterval 値の設定に従って)定期的に実行し、CallInterval ごとにビジネスサービスを呼び出す「EnsLib.InboundAdapter」コンポーネントを使用します。 

Visual Studio で、「FirstService」クラスの新しい「FirstService.cs」ファイルが生成されます。 インバウンドアダプターが検出する各イベントの処理は、「OnProcessInput」メソッドを使って行われます。 パラメーターに設定されるオブジェクトは、InboudAdapter の実装によって異なりますが、この場合は使用されていません。

FirstService:OnProcessInput

public override object OnProcessInput(object messageInput)         {             //新しいリクエストオブジェクトを作成             FirstMessage myRequest = new FirstMessage();             myRequest.value = "The send time is: " + System.DateTime.Now.ToString();             //レスポンスを待たずに送信:             //SendRequestAsync("PEX.Webinar.FirstOperation", myRequest);             //送信して、20秒のタイムアウトでレスポンスを待機する:             FirstMessage myResponse=(FirstMessage) SendRequestSync("PEX.Webinar.FirstOperation", myRequest, 20);             return null;         }

FirstService:OnProcessInput

public override object OnProcessInput(object messageInput)         {             //新しいリクエストオブジェクトを作成             FirstMessage myRequest = new FirstMessage();             myRequest.value = "The send time is: " + System.DateTime.Now.ToString();             //レスポンスを待たずに送信:             //SendRequestAsync("PEX.Webinar.FirstOperation", myRequest);             //送信して、20秒のタイムアウトでレスポンスを待機する:             FirstMessage myResponse=(FirstMessage) SendRequestSync("PEX.Webinar.FirstOperation", myRequest, 20);             return null;         }
 

プロダクションのコンポーネントにコンパイルせずにメッセージを送信するために、管理ポータルで構成されたパラメーターを使用します。値は「RemoteSettings」構成パラメーター内に JSON 文字列として指定されています。

パラメーター

class FirstService : InterSystems.EnsLib.PEX.BusinessService     {          /// <summary>         /// ポータルから変更できるパラメーター         /// </summary>         public string TargetConfigName;      (...)

「TargetConfigName」に指定された値が null に設定されている場合、ビジネスサービスはどの宛先にもメッセージを送信しません。 この問題をできるだけ早期に検出するためには、1 つのオプションとして、コンポーネントが開始したときに、OnInit() 呼び出し内で TargetConfigName の値を検証することができます。

FirstService:OnInit

public override void OnInit()         {            //プロパティが正しく報告されることを検証            if (TargetConfigName==null )             {                 LOGWARNING("TargetConfigName is missing; assign it a value in RemoteSettings");             }else             {                 LOGINFO("TargetConfigname=" + TargetConfigName);             }         }

次に、OnProcessInput を、TargetConfigName の値を使用するように変更しましょう。

OnProcessInput

//送信して、20 秒のタイムアウトでレスポンスを待機: FirstMessage myResponse=(FirstMessage) SendRequestSync(TargetConfigName, myRequest, 20);

InterSystems IRIS での PEX ビジネスサービス {#Webinar:ImplementarIntegracionescon.NetoJava-BusinessServicePEXenInterSystemsIRIS}

管理ポータルで「+」をクリックして、プロダクションの定義にビジネスサービスタイプのコンポーネントを追加します。 

次に、(追加されたコンポーネントをクリックして)コンポーネントを構成し、右側の「Settings」(設定)タブを選択します。 

<th>
  値
</th>

<th>
  説明
</th>
<td>
  20
</td>

<td>
  関連するアダプターの OnTask() の実行と OnProcessInput() への呼び出し間の時間
</td>
<td>
  PEX.Webinar.FirstDemo.FirstService
</td>

<td>
  生成される .NET クラスの名前
</td>
<td>
  TargetConfigName=PEX.Webinar.FirstOperation
</td>

<td>
  param=value フォーマットによるパラメーターの &lt;newline> 区切りのリスト
</td>
<td>
  44444
</td>

<td>
  .NET ゲートウェイが構成されている TCP ポート
</td>
<td>
  C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\ netstandard2.0\PEX.Webinar.FirstDemo.dll
</td>

<td>
  含める .DLL の場所。 これは、Visual Studio ビルドが .DLL を生成した場所です。
</td>
パラメーター
CallInterval
Remote Classname(リモートクラス名)
Remote Settings(リモート設定)
Gateway Port(ゲートウェイポート)
Gateway Extra CLASSPATH(ゲートウェイ追加クラスパス)

 

このビジネスサービスが有効になると、関連アダプター(Ens.InboundAdapter)のOnTask() の CallInterval が実行されます。 ここでは、OnTask は FirstService.OnProcessInput() を呼び出すだけです。 つまり、CallInterval と FirstService.OnProcessInput() ごとに、「TargetConfigName」で定義されたコンポーネントにメッセージが送信されます。 これはメッセージビューアーで確認可能です。

呼び出しの詳細が含まれます。

.NET ビジネスプロセス {#Webinar:ImplementarIntegracionescon.NetoJava-BusinessProcess.NET}

.NET の実装 {#Webinar:ImplementingIntegrationswith.NetorJava-.NETImplementation}

どのビジネスホストとも同様に、ビジネスプロセスにはコールバックの OnInit() と OnTearDown() メソッドがあります。 具体的に、ビジネスプロセスのメソッドは以下のとおりです。

<th>
  説明
</th>
<td>
  ビジネスプロセスに送信されるメッセージごとに実行されます。 プロセスの最初のアクションを実装する場所であり、他のコンポーネント(プロセスまたはオペレーション)に非同期配信を行います。
</td>
<td>
  非同期呼び出しの応答ごとに 1 回実行されます。 レスポンスをマージして結果を保存できます。
</td>
<td>
  ビジネスプロセスの実行の最後に 1 回実行されます。 プロセスの最終レスポンスメッセージが作成されます。
</td>
メソッド
OnRequest(message)
OnResponse
OnComplete

ビジネスプロセスの実行時間は長期(数時間から数日、非同期レスポンスを待機)になる可能性があることに注意しておくことが重要です。 これを可能にするために、IRIS フレームワークはプロセスの実行を中断して再開することができます。 プロセス中に維持したいすべての値は、IRIS が永続的に保存するクラスのプロパティに追加しておく必要があります。 [persistent] という表記で指示する必要があります。

この例では、最小限の実装が行われており、ビジネスプロセスは受信する PEX メッセージを宛先にルーティングします。

管理ポータルで変更可能な 2 つの変数が使用されています。

FirstProcess

class FirstProcess: InterSystems.EnsLib.PEX.BusinessProcess     {         //呼び出しのタイムアウト
          public string Timeout = "PT10S";

          public string TargetConfigName;

          public override void OnInit()
          {
              //プロパティが正しく入力されていることを確認
              if (TargetConfigName == null)
              {
                  LOGWARNING("Missing value for TargetConfigName; It must be assigned a value in RemoteSettings");
              }
              else
              {
                  LOGINFO("TargetConfigname=" + TargetConfigName);
              }
          }
</td>

 

メッセージを受信すると、TargetConfigName に非同期に送信されます。

FirstProces:OnRequest

public override object OnRequest(object request)         {             LOGINFO("OnRequest");             SendRequestAsync(TargetConfigName, (InterSystems.EnsLib.PEX.Message)request, true); //ResponseRequired=true             SetTimer(Timeout, "HasTimedOut");             return null;         }

OnResponse では、レスポンスをマージすることができます。

FirstProcess:OnResponse

public override object OnResponse(object request, object response, object callRequest,  object callResponse, string completionKey)        {            LOGINFO("OnResponse, CompletionKey=" + completionKey);            if (completionKey!= "HasTimedOut")            {                response = (FirstMessage)callResponse;            }            LOGINFO("Response:" + response.ToString());            return response;        }

プロセスの最後に、レスポンスが返されます。

FirstProcess:OnComplete

public override object OnComplete(object request, object response)       {           LOGINFO("OnComplete");           return response;       }

InterSystems IRIS での PEX ビジネスプロセス {#Webinar:ImplementarIntegracionescon.NetoJava-BusinessProcessPEXenIntersystemsIRIS}

EnsLib.PEX.BusinessProcess ビジネスプロセスを追加し、必要に応じて構成し、メッセージを BO に直接送信する代わりに新しいプロセスに送信するように「PEX.Webinar.FirstProcess」ビジネスサービスの TargetCongiNmae を変更します。 

コンポーネントの「Settings」(設定)は以下のように定義されます。

<th>
  値
</th>
<td>
  PEX.Webinar.FirstDemo.FirstProcess
</td>
<td>
  Timeout=PT20STargetConfigName=PEX.Webinar.FirstOperation
</td>
<td>
  44444
</td>
<td>
  C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\netstandard2.0\PEX.Webinar.FirstDemo.dll
</td>
パラメーター
Remote Classname(リモートクラス名)
Remote Settings(リモート設定)
Gateway Port(ゲートウェイポート)
Gateway Extra Classpath(ゲートウェイ追加クラスパス)

トレースの結果は以下のようになります。

まとめ

PEX では、統合を .NET または Java で非常に流ちょうに実装でき、これらの言語の経験が豊富な開発者に対して InterSystems IRIS 相互運用性レイヤーの全能力と堅牢性を提供しています。