0 フォロワー · 11 投稿

NET Framework(ドットネットと発音)は、Microsoftが開発したソフトウェアフレームワークであり、主にMicrosoft Windows上で実行されます。

公式サイト

InterSystemsデータプラットフォームでの.NETのサポート

記事 Megumi Kakechi · 4月 22, 2025 5m read

先日、お客様よりタイトルのご質問をいただき、サンプルコードを作成しました。せっかくですので、こちらでも共有したいと思います。

今回は、データベースの空き容量情報を取得する、%SYS.DatabaseQueryクラスのFreeSpaceクエリを使用したサンプルとします。

C#.Net と VB.Net で作成してみました。


★C#.Net

0
0 55
記事 Megumi Kakechi · 2月 6, 2024 4m read

需要はそんなに多くはないのですが、時折「Native SDK (Native API) for .NET の使い方」に関するご質問を受けることがありますので、簡単に試せるサンプルをご紹介します。

Native SDK (Native API) for .NET を使用すると、ObjectScript のクラスメソッドを、ネイティブの .NET メソッドを呼び出すのと同じように、.NET アプリケーションから簡単に呼び出すことができます。
また、グローバルへのアクセスも簡単に行えます。
こちらの記事では、VB.NET のサンプルコードをご紹介します。

以下の手順で実行していきます。

  1. 前準備
  2. IRISサーバに接続し、IRISオブジェクトを作成する。
  3. クラスメソッドを実行する(ユーザ作成メソッド&参照渡し引数)
  4. クラスメソッドを実行する - その2(クラスライブラリメソッドを実行&戻り値あり)
  5. グローバルにアクセスする
  6. 切断する


★1.前準備

Visual Studio のプロジェクトメニューから参照の追加をクリックして、以下のファイルを選択します。
(使用している .NET(Core) または .NET Framework バージョンに合わせて、それに対応するファイルを選択します。
 以下の例は、フレームワークに .Net 6.0 を選んでいるため、net6.0 を選択しています。)

0
0 272
記事 Toshihiko Minamoto · 12月 28, 2023 35m read

はじめに {#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 相互運用性レイヤーの全能力と堅牢性を提供しています。

0
0 186
記事 Toshihiko Minamoto · 8月 7, 2023 7m read

この記事では、.Net/Java ゲートウェイを簡単にコンテナ化する方法を説明します。

この例では、Apache Kafka との統合を開発します。

Java/.Net と相互運用するために、PEX を使用しています。

アーキテクチャ

このソリューションは完全に docker で実行し、以下のように構成されます。

Java ゲートウェイ

まず、メッセージを Kafka に送信する Java オペレーションを開発しましょう。 このコードはお好きな IDE で書くことができ、こちらのようになります。

要約すると:

  • 新しい PEX ビジネスオペレーションを開発するには、抽象型の com.intersystems.enslib.pex.BusinessOperation クラスを実装する必要があります。
  • public プロパティはビジネスホスト設定です。
  • OnInit メソッドは Kafka への接続を初期化し、InterSystems IRIS へのポインターを取得するために使用されます。
  • OnTearDown は、(プロセスのシャットダウン時に)Kafka から切断するために使用されます。
  • OnMessagedc.KafkaRequest メッセージを受け取って、Kafka に送信します。

では、これを Docker にパックしましょう!

これがこの例の dockerfile です。

FROM eclipse-temurin:8-jre-alpine AS builder

ARG APP_HOME=/tmp/app

COPY src $APP_HOME/src

COPY --from=intersystemscommunity/jgw:latest /jgw/*.jar $APP_HOME/jgw/

WORKDIR $APP_HOME/jar/
ADD https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/2.5.0/kafka-clients-2.5.0.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar .
ADD https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar .

WORKDIR $APP_HOME/src

RUN javac -classpath $APP_HOME/jar/*:$APP_HOME/jgw/* dc/rmq/KafkaOperation.java && \
    jar -cvf $APP_HOME/jar/KafkaOperation.jar dc/rmq/KafkaOperation.class

FROM intersystemscommunity/jgw:latest

COPY --from=builder /tmp/app/jar/*.jar $GWDIR/

1 行ずつ見ながら、ここに何が起きているのかを確認しましょう(マルチステージ docker ビルドを理解していることが前提です)。

FROM eclipse-temurin:8-jre-alpine AS builder

最初のイメージは JDK 8 です(openjdk:8 イメージは廃止されたことに注意してください。代わりに推奨されているものを使用します)。

ARG APP_HOME=/tmp/app
COPY src $APP_HOME/src

/src フォルダから /tmp/app フォルダにソースをコピーしています。

COPY --from=intersystemscommunity/jgw:latest /jgw/*.jar $APP_HOME/jgw/

Java ゲートウェイソースを /tmp/app/jgw フォルダにコピーしています。

WORKDIR $APP_HOME/jar/
ADD https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/2.5.0/kafka-clients-2.5.0.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar .
ADD https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar .

WORKDIR $APP_HOME/src

RUN javac -classpath $APP_HOME/jar/*:$APP_HOME/jgw/* dc/rmq/KafkaOperation.java && \
    jar -cvf $APP_HOME/jar/KafkaOperation.jar dc/rmq/KafkaOperation.class

これですべての依存関係が追加され、jar ファイルのコンパイルに javac/jar が呼び出されます。 実際のプロジェクトでは、Maven または Gradle の使用をお勧めします。

FROM intersystemscommunity/jgw:latest

COPY --from=builder /tmp/app/jar/*.jar $GWDIR/

そして最後に、jar がベース jgw イメージにコピーされます(ベースイメージは、ゲートウェイと関連タスクの開始も処理します)。

.Net ゲートウェイ

次は、Kafka からメッセージを受け取る .Net サービスです。 このコードはお好きな IDE で書くことができ、こちらのようになります。

要約すると:

  • 新しい PEX ビジネスサービスを開発するには、抽象型の InterSystems.EnsLib.PEX.BusinessService クラスを実装する必要があります。
  • public プロパティはビジネスホスト設定です。
  • OnInit メソッドは Kafka への接続を初期化し、トピックを購読し、InterSystems IRIS へのポインターを取得するために使用されます。
  • OnTearDown は、(プロセスのシャットダウン時に)Kafka から切断するために使用されます。
  • OnMessage は Kafka からのメッセージを入力として使用し、他の相互運用性ホストに Ens.StringContainer メッセージを送信します。

では、これを Docker にパックしましょう!

これがこの例の dockerfile です。

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build

ENV ISC_PACKAGE_INSTALLDIR /usr/irissys
ENV GWLIBDIR lib
ENV ISC_LIBDIR ${ISC_PACKAGE_INSTALLDIR}/dev/dotnet/bin/Core21

WORKDIR /source
COPY --from=store/intersystems/iris-community:2020.2.0.211.0 $ISC_LIBDIR/*.nupkg $GWLIBDIR/

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and publish app and libraries
COPY . .
RUN dotnet publish -c release -o /app

# final stage/image
FROM mcr.microsoft.com/dotnet/core/runtime:2.1
WORKDIR /app
COPY --from=build /app ./

# Configs to start the Gateway Server
RUN cp KafkaConsumer.runtimeconfig.json IRISGatewayCore21.runtimeconfig.json && \
    cp KafkaConsumer.deps.json IRISGatewayCore21.deps.json

ENV PORT 55556

CMD dotnet IRISGatewayCore21.dll $PORT 0.0.0.0

1 行ずつ見ていきましょう。

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build

このアプリの構築には、完全な .Net Core 2.1 SDK を使用します。

ENV ISC_PACKAGE_INSTALLDIR /usr/irissys
ENV GWLIBDIR lib
ENV ISC_LIBDIR ${ISC_PACKAGE_INSTALLDIR}/dev/dotnet/bin/Core21

WORKDIR /source
COPY --from=store/intersystems/iris-community:2020.2.0.211.0 $ISC_LIBDIR/*.nupkg $GWLIBDIR/

正式な InterSystems Docker イメージから .Net Gateway NuGets をビルダーイメージにコピーします。

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and publish app and libraries
COPY . .
RUN dotnet publish -c release -o /app

ライブラリを構築します。

# final stage/image
FROM mcr.microsoft.com/dotnet/core/runtime:2.1
WORKDIR /app
COPY --from=build /app ./

ライブラリ dll を、実際に実行する最終コンテナにコピーします。

# Configs to start the Gateway Server
RUN cp KafkaConsumer.runtimeconfig.json IRISGatewayCore21.runtimeconfig.json && \
    cp KafkaConsumer.deps.json IRISGatewayCore21.deps.json

現在、.Net ゲートウェイは起動時にすべての依存関係を読み込む必要があるため、考えられるすべての依存関係を認識するようにしています。

ENV PORT 55556

CMD dotnet IRISGatewayCore21.dll $PORT 0.0.0.0

すべてのインターフェースでリッスンするポート 55556 でゲートウェイを開始します。

以上です!

こちらは、すべてをまとめて実行する完全な docker-compose です(Kafka とメッセージを見るための Kafka UI も含まれています)。

このデモを実行するには、以下を行う必要があります。

  1. インストール:
  2. 実行:
git clone https://github.com/intersystems-community/pex-demo.git cd pex-demo docker-compose pull docker-compose up -d

 

注意事項: Java ゲートウェイと .Net ゲートウェイライブラリは、InterSystems IRIS クライアントと同じバージョンのものである必要があります。

0
0 189
記事 Hiroshi Sato · 10月 14, 2022 2m read

IRISでは.Net Binding機能が非推奨になったため、VisM.OCXの置き換えのために用意していたCaché版Cache Directエミュレータ(.Net Binding機能を使用していたため)の使用も非推奨となりました。
そこでIRISのNative API機能を使用して書き換えたものを作成し、OpenExchange(以下のFAQトピックを参照してください)に登録しています。

FAQのトピック


Caché版Cache Directエミュレータを使っているアプリケーションをIRISに移行するためには、IRIS用のCache Directエミュレータに置き換えて、アプリケーションのコードをいくつか書き換える必要があります。

内容は、それぞれのプロジェクトに含まれるコンソールアプリケーションサンプル(consoleApp.cs)を比較することで大体理解できると思いますが、以下にその手順について説明します。

1. IRISの.Net Native API用のdllの参照設定を追加します。

Visual Studioのプロジェクト設定から参照の追加を選び、以下のファイルを追加してください。

c:\InterSystems\IRIS\dev\dotnet\bin\v4.6.2
InterSystems.Data.IRISClient.dll

2.  using句

0
0 341
記事 Hiroshi Sato · 7月 2, 2020 21m read

初めに

VisM.OCXはVisual Basicでクライアント・サーバー型のアプリケーション開発を支援するためにInterSystemsが提供してきたツールです。


誕生から既に20年以上が経過した非常に古いテクノロジーです。


OCX規格(ActiveXコンポーネント)は、マイクロソフト社が推進してきた規格ですが、やがてマイクロソフト社が後継となる.Net Frameworkをリリースし、その新しいフレームワークへの移行を強力に推進すると同時に、OCX規格は非推奨機能となっています。

一方で下位互換性のため、.Net Framework配下でOCXを動作可能とする仕組みが用意されており、結果としてOCXは、.Net Framework環境下で動作可能です。

従って、VisM.OCXも.Net対応のプログラミング言語C#やVB.NETからそのまま利用することができます。

しかしながら.Net Framework上で動作するとは言え、.Net Frameworkが用意する安全性の高い資源管理や強固なセキュリティ機能の恩恵を受けることができず、いわゆるマネージドコードとして動作できないという制約を抱えています。

1
0 1612
質問 Kobata Makoto · 2月 28, 2022

皆様こんにちは。

Native API for .NETを使用して、%Stream.GlobalBinaryタイプのプロパティを持つデータを作成しようとしています。

%Stream.GlobalBinaryタイプのプロパティ(binaryData)に書き込む部分は以下のようになっています。

Using obj As InterSystems.Data.IRISClient.ADO.IRISObject = iris.ClassMethodObject("User.Sample","%New")

        Using prop As InterSystems.Data.IRISClient.ADO.IRISObject = obj.GetObject("binaryData")

                prop.InvokeStatusCode("Write", binary)

        End Using

        obj.InvokeStatusCode("%Save")

End Using

この”Write”メソッド部分ですが、1.5MB程度の制限がかかってしまい、1.5MBを超えるようなデータが登録できません。

※実際にはエラーとはならず、1.5MBまでしか書き込まれていない状態のようです。

どなたか解決方法等ご教授いただけないでしょうか。

8
0 277
記事 Tomoko Furuzono · 6月 29, 2021 2m read

これは、InterSystems FAQサイトの記事です。
以下の7つの技術を用いて、VB.NETからInterSystems IRISへ接続し使用することができます。

(A) InterSystems IRIS ADO.NET Managed Provider を利用する
InterSystems ADO.NET Managed Provider では、ADO.NET 準拠データベースとして InterSystems IRIS にアクセスでき、データへの簡単なリレーショナル・アクセスを提供します。特に ADO.NET を以前に使用したことのあるユーザにお勧めです。
詳細は、以下ドキュメントをご参照ください。
InterSystems IRIS ADO.NET Mnaged Providerについて

0
0 815
記事 Toshihiko Minamoto · 2月 23, 2021 6m read

Java Business Host から PEX への移行

InterSystems IRIS 2020.1 および InterSystems IRIS for Health 2020.1 で PEX がリリースされ、Java Business Host を使うよりも優れたかたちで Java プログラムをプロダクション環境に取り込めるようになりました。 PEX は、相互運用性のコンポーネントを構築するための API をすべて提供するほか、Java と .NET の両方で使用できます。 Java Business Host は非推奨となり、今後のリリースで廃止される予定です。

PEX を使うメリット

  • デベロッパーはプロダクションのすべてのコンポーネントを、Java と .Net のどちらでも構築できる
  • コンポーネント間で一層複雑なメッセージ構造の受け渡しができる
  • シンプルな設定
  • 開発のワークフローがシンプルな上に、ObjectScript を使う必要がない

ここからは、既存の Java Business Host のコードを PEX に移行する方法に注目します。

概要

PEX で使用されるクラスとインターフェースは、Java Business Host (JBH) のものとは異なります。 本記事では、その相違点を要約して解説しますが、詳細は完全なドキュメントをご覧ください。

ビジネスサービスを Java Business Host から PEX に変換する

PEX のビジネスサービスを構築するには、com.intersystems.gateway.bh.BusinessService の代わりに、com.intersystems.enslib.pex.BusinessService を実装する必要があります。

PEX で使用されるビジネスサービスの設計パターンは、サービスがスレッドを開始してメッセージを作成するというものから、サービスが定期的に呼び出される関数を実装してメッセージを作成するというものに一変しました。

JBH では、以下のようなコードが使われています。

  @Override
  public boolean OnInit(Production p) throws Exception {
    production = p;

    if (messageThread == null) {
      Messager messager = new Messager();
      messageThread = new Thread(messager);
      messageThread.start();
    }

    return true;
  }

一方の PEX では、関数を 3 つ実装するだけで OK です。

  public void OnInit() throws Exception {
    // 初期化
    return;
  }

  public Object OnProcessInput(Object messageInput) throws Exception {
    // ここで SendMessage() か SendMessageAsync() を呼び出します

    return null;
  }

  public void OnTearDown() throws Exception {
    // シャットダウン
    return;
  }

また、設定はどのように使用され、メッセージはどのように配信され、ログはどのように記録されるのかも変更する必要があります。 詳しくは後ほど解説します。

ビジネスオペレーションを Java Business Host から PEX に変換する

PEX のビジネスオペレーションを構築するには、com.intersystems.gateway.bh.BusinessOperation の代わりに com.intersystems.enslib.pex.BusinessOperation を実装する必要があります。

ビジネスオペレーションの設計パターンは、JBH も PEX も構造的には同じですが、2 つのメインエントリーポイントへのパラメーターが変更されています。

OnInit() の変更点

PEX の OnInit() はパラメーターを受け取りません。

OnMessage() の変更点

PEX の場合、OnMessage() には、JBH で使用される String の代わりに、ジェネリック型の Object が与えられます。 これにより、プロダクションの作成者は好きなメッセージを渡すことができます。

JBH では、アプリケーションに以下のようなコードが使われていたのではないでしょうか

  public boolean OnMessage(String message) throws Exception {
    // ビジネスロジックを実行
    return true;
  }

PEX では、パラメーターにジェネリック型の Java Object が使用されます。適切にキャストする必要がありますが、String を使った場合よりも一層複雑なメッセージを送信できます。 以下は、ファイルストリームであるリクエストを抽出する方法を示した例です。

  public Object OnMessage(Object request) throws Exception {
    com.intersystems.jdbc.IRISObject streamContainer = (com.intersystems.jdbc.IRISObject)request;
    com.intersystems.jdbc.IRISObject str = (com.intersystems.jdbc.IRISObject)streamContainer.get("Stream");
    String originalFilename = (String)streamContainer.get("OriginalFilename");

    Long contentSize = (Long)str.get("Size");
    String content = (String)str.invoke("Read", contentSize);

    // ビジネスロジックを実行

    return null;
  }

また、設定が使用される方法、メッセージが配信される方法、ログが記録される方法も変更する必要があります。 詳しくは後ほど解説します。

設定

設定の宣言が簡単になりました。

JBH では、設定は SETTINGS 文字列を使って宣言され、以下のようなコードで取り込まれていました。

  String setting = production.GetSetting("Min");
  if (!setting.isEmpty()) {
    min = Integer.parseInt(setting);
  }

PEX の場合、設定は単純に public メンバフィールドとなります。 これらは、クラスがインスタンス化されるときに自動的に設定されます。

  public int Min = 0;

public メンバーフィールドは、Java の基本データ型 (String や int など) であれば、何でもプロダクション環境で設定できます。

メッセージ

メッセージはよりパワフルに送信できます。 JBH では、メッセージは文字列として送信されます。 一方の PEX を使うと、メッセージは、 ObjectScript で定義されるオブジェクトの場合であれは、オブジェクト (IRISObject) として送信され、Java で定義されているクラスの場合であれば、com.intersystems.enslib.pex.Message のサブクラスとして送信されます。

JBH の場合は、以下のようなコードが使われます

  production.SendRequest(value.toString());

PEX の場合だと、以下のようなコードが使われます

  MyExampleMessageClass req = new MyExampleMessageClass("message to send"); 
  SendRequestAsync(Target, req);

ログ

ログ機能はすべて似たようなものですが、名前だけが違います。

PEX で情報メッセージをログするときは、LOGINFO() を使います。

  LOGINFO("Received message");

オブジェクトのゲートウェイ

Java Business Host では、専用のゲートウェイが必要でしたが、 PEX では、Java ゲートウェイ 1 つで、Java のすべてのニーズに対応できます。 また、ゲートウェイはたくさん使うこともできます。 これはあなた次第です。 こちらの Java ゲートウェイの手引き がおすすめです。

結論とフィードバック

まだ PEX を試していないという方は、ぜひぜひお試しください。 PEX を使えば、少ないコードで解決できるビジネスの問題の幅をぐっと広げることができます。また、今はすべての作業を .NET で実行できるようにもなりました。

JBH のアプリケーションを PEX へ移行させることに関するご質問や問題は、私か WRC までご連絡ください。

0
0 206
記事 Hiroshi Sato · 8月 18, 2020 8m read

IRISでは.Net Bindingは非推奨機能となりました。


.Net Bindingを使ったアプリケーションは、IRISで提供されている.Net Native APIを利用して書き換えることができます。

ここでは、実際に書き換えをおこなったサンプルコードを示しながら、具体的な方法を説明していきます。

CacheDirect(VisM)エミュレーター

OpenExchangeに登録しているVisMエミュレーターは、元々Cachéの.Net Bindingを使用して作成されました。


それをIRISの標準機能で動作可能にするために、.Net Native APIを使用して書き換えをおこないました。

以下にどのように書き換えを行ったかを順を追って説明します。

 

参照の変更

まず以前の参照を削除します。

Visual Studioのソリューションエクスプローラーの所で参照をクリックします。

表示されるInterSystems.Data.CacheClientを削除します。
(右クリックして削除を選ぶ)

次にプロジェクトメニューから参照の追加をクリックして、以下の2つのファイルを選択します。
(プロジェクトの.Net Frameworkバージョンに合わせて、それに対応するファイルを選択する
以下の例は、v4.5を選択)

0
0 650
記事 Hiroshi Sato · 7月 27, 2020 13m read

初めに

Caché ActiveX Bindingは、Visual Basicでクライアント・サーバー型のアプリケーション開発を支援するためにInterSystemsが提供してきたツールです。

CacheActiveX.dllとCacheObject.dllの2種類のバージョンが存在します。

IRISでは、CacheActiveX.dllは動作可能です。

CacheObject.dllはサポートしていません。

いずれにしろ誕生から既に20年以上が経過した非常に古いテクノロジーでマイクロソフト社も非推奨の古い規格ですので、今後も使い続けるのは得策ではありません。

Caché ActiveX Bindingの機能はIRISに用意されている.Net Native APIと.Net Managed Providerの機能を使って書き換え可能です。

ここでは、Caché ActiveX Bindingを使って書かれていたサンプルアプリケーションをIRISで動作するように移植した作業内容について解説します。

このサンプルは、以下のgithubサイトから入手可能です。

ADBKサンプル
 

ADBKアプリケーション

このサンプルアプリケーションは、20年以上も前にVB6サンプルとして作成されました。
 

VB6プロジェクトを.Netプロジェクトに変換
 

0
0 623