Java 逆プロキシ・オブジェクトの使用法
Java Native SDK は Java 外部サーバ接続を最大限に活用して、InterSystems IRIS と Java アプリケーション間の完全に透過的な双方向通信を可能にします。
逆プロキシ・オブジェクトは、外部サーバ・ゲートウェイ接続を介して ObjectScript ターゲット・オブジェクトを制御するための Java オブジェクトです。逆プロキシ・オブジェクトを使用してターゲットのメソッドを呼び出して、ターゲットのプロパティ値を取得または設定し、ネイティブの Java オブジェクトのように簡単にターゲット・オブジェクトを操作できます。
このセクションでは、以下のトピックについて説明します。
外部サーバの概要
外部サーバ接続によって、InterSystems IRIS ターゲット・オブジェクトと Java オブジェクトは同じ接続を使用して、同じコンテキスト (データベース、セッション、トランザクション) で自由に相互作用することができます。外部サーバのアーキテクチャについては "InterSystems 外部サーバの使用法" で詳しく説明していますが、ここでは、外部サーバ接続を、一方の側のプロキシ・オブジェクトがもう一方の側のターゲット・オブジェクトを制御できる単純なブラック・ボックスとして考えることができます。
外部サーバ接続
図に示すように、フォワード・プロキシ・オブジェクトは Java オブジェクトを制御する ObjectScript プロキシです (詳細は、"InterSystems 外部サーバの使用法" の “外部言語の操作” を参照)。Java 逆プロキシは反対方向に動作し、Java アプリケーションが InterSystems IRIS ターゲット・オブジェクトを制御できるようにします。
逆プロキシ・オブジェクトの作成
逆プロキシ・オブジェクトを作成するには、ObjectScript クラス・インスタンスの OREF を取得して (通常は、クラスの %New() メソッドを呼び出して)、IRISObject にキャストします (詳細は、“ObjectScript メソッドおよび関数の呼び出し” を参照)。以下のメソッドを使用して、逆プロキシ・オブジェクトを生成できます。
%New() メソッドが新しいターゲット・インスタンスを正常に作成すると、そのインスタンスの逆プロキシ・オブジェクトが生成されます。例えば、以下の呼び出しによって、ObjectScript クラス Demo.Test のインスタンスを制御する、test という逆プロキシ・オブジェクトが作成されます。
IRISObject test = (IRISObject)irisjv.classMethodObject("Demo.Test","%New");
-
classMethodObject() は、Demo.Test という ObjectScript クラスの %New() メソッドを呼び出して、そのクラスの新しいターゲット・インスタンスを作成します。
-
%New() への呼び出しでクラスの有効なインスタンスが返された場合、新しいインスタンスの逆プロキシが生成され、classMethodObject() はそれを Object として返します。
-
Java では、Object は IRISObject にキャストされ、逆プロキシ変数 test が作成されます。
変数 test は、Demo.Test の新しいターゲット・インスタンスの Java 逆プロキシ・オブジェクトです。以下のセクションでは、test を使用して Demo.Test ターゲット・インスタンスのメソッドとプロパティにアクセスします。
ターゲット・オブジェクトの制御
逆プロキシ・オブジェクトは IRISObject のインスタンスです。ターゲット・インスタンス・メソッドを呼び出すメソッド invoke() と invokeVoid()、およびターゲットのプロパティの読み書きを行うアクセサ get() と set() を提供します。このセクションの例では、逆プロキシを使用して、ObjectScript クラス Demo.Test のターゲット・インスタンスを制御します。このクラスには、メソッド initialize() と add()、およびプロパティ name の宣言が含まれています。
ObjectScript クラス Demo.Test のメソッドとプロパティの宣言
Class Demo.Test Extends %Persistent
Method initialize(initialVal As %String)
Method add(val1 As %Integer, val2 As %Integer) As %Integer
Property name As %String
以下の例では、最初の行で Demo.Test の新規インスタンスの test という名前の逆プロキシ・オブジェクトを作成します (前のセクションの説明を参照)。残りのコードでは、test を使用して Demo.Test ターゲット・インスタンスを制御します。
逆プロキシ・オブジェクトによる Demo.Test のインスタンスの制御
// Create an instance of Demo.Test and return a proxy object for it
IRISObject test = (IRISObject)irisjv.classMethodObject("Demo.Test","%New");
// instance method test.initialize() is called with one argument, returning nothing.
test.invokeVoid("initialize", "Test One");
// instance method test.add() is called with two arguments, returning an int value.
int sum = test.invoke("add",2,3); // adds 2 plus 3, returning 5
// The value of property test.name is set and then returned.
test.set("name", "Einstein, Albert"); // sets the property to "Einstein, Albert"
String name = test.get("name"); // returns the new property value
上の例では、IRIS.classMethodObject() への呼び出しによって逆プロキシ・オブジェクト test が作成され、以下のメソッドを使用して Demo.Test ターゲット・インスタンスのメソッドとプロパティにアクセスしています。
-
IRISObject.invokeVoid() はターゲット・インスタンス・メソッド initialize() を起動します。このメソッドは、文字列引数を受け入れますが、値は返しません。
-
IRISObject.invoke() は、ターゲット・インスタンス・メソッド add() を起動します。このメソッドは、2 つの整数の引数を受け入れて、合計を整数として返します。
-
IRISObject.set() は、新しい値をターゲット・プロパティ name に割り当てます。
-
IRISObject.get() は、ターゲット・プロパティ name の値を返します。
また、これらのメソッドのデータ型固有のバージョンもありますが、これらについては以下のセクションで説明します。
IRISObject のサポートされているデータ型
前のセクションの例では、汎用の set()、get()、および invoke() メソッドを使用しましたが、IRISObject クラスでサポートされるデータ型用にデータ型固有のメソッドも提供します。
IRISObject set() メソッドおよび get() メソッド