Skip to main content

Java 逆プロキシ・オブジェクトの使用法

Java Native SDK は Java 外部サーバ接続を最大限に活用して、InterSystems IRIS と Java アプリケーション間の完全に透過的な双方向通信を可能にします。

逆プロキシ・オブジェクトは、外部サーバ・ゲートウェイ接続を介して ObjectScript ターゲット・オブジェクトを制御するための Java オブジェクトです。逆プロキシ・オブジェクトを使用してターゲットのメソッドを呼び出して、ターゲットのプロパティ値を取得または設定し、ネイティブの Java オブジェクトのように簡単にターゲット・オブジェクトを操作できます。

このセクションでは、以下のトピックについて説明します。

外部サーバの概要

外部サーバ接続によって、InterSystems IRIS ターゲット・オブジェクトと Java オブジェクトは同じ接続を使用して、同じコンテキスト (データベース、セッション、トランザクション) で自由に相互作用することができます。外部サーバのアーキテクチャについては "InterSystems 外部サーバの使用法" で詳しく説明していますが、ここでは、外部サーバ接続を、一方の側のプロキシ・オブジェクトがもう一方の側のターゲット・オブジェクトを制御できる単純なブラック・ボックスとして考えることができます。

外部サーバ接続
InterSystems IRIS 上の ObjectScript アプリケーションをホスト VM 上の Java アプリケーションに接続するオブジェクト・ゲートウェイ

図に示すように、フォワード・プロキシ・オブジェクトは Java オブジェクトを制御する ObjectScript プロキシです (詳細は、"InterSystems 外部サーバの使用法" の “外部言語の操作” を参照)。Java 逆プロキシは反対方向に動作し、Java アプリケーションが InterSystems IRIS ターゲット・オブジェクトを制御できるようにします。

逆プロキシ・オブジェクトの作成

逆プロキシ・オブジェクトを作成するには、ObjectScript クラス・インスタンスの OREF を取得して (通常は、クラスの %New() メソッドを呼び出して)、IRISObject にキャストします。classMethodObject() メソッドを使用して、逆プロキシ・オブジェクトを作成し、返すことができます (詳細は、“ObjectScript クラス・メソッドの呼び出し” を参照)。

%New() メソッドが新しいターゲット・インスタンスを正常に作成すると、そのインスタンスの逆プロキシ・オブジェクトが生成されます。例えば、以下の呼び出しによって、ObjectScript クラス Demo.Test のインスタンスを制御する、test という逆プロキシ・オブジェクトが作成されます。

   IRISObject test = (IRISObject)irisjv.classMethodObject("Demo.Test","%New");
  • classMethodObject() は、Demo.Test という ObjectScript クラスの %New() メソッドを呼び出して、そのクラスの新しいターゲット・インスタンスを作成します。

  • %New() への呼び出しでクラスの有効なインスタンスが返された場合、新しいインスタンスの逆プロキシが生成され、classMethodObject() はそれを Object として返します。

  • Java では、ObjectIRISObject にキャストされ、逆プロキシ変数 test が作成されます。

変数 test は、Demo.Test の新しいターゲット・インスタンスの Java 逆プロキシ・オブジェクトです。以下のセクションでは、test を使用して Demo.Test ターゲット・インスタンスのメソッドとプロパティにアクセスします。

ターゲット・オブジェクトの制御

逆プロキシ・オブジェクトは IRISObject のインスタンスです。ターゲット・インスタンス・メソッドを呼び出すメソッド invoke()invokeVoid()、およびターゲットのプロパティの読み取りと書き込みを行うアクセサ get()set() を提供します。このセクションの例では、逆プロキシを使用して、ObjectScript クラス Demo.Test のターゲット・インスタンスを制御します。このクラスには、メソッド initialize()add()、およびプロパティ name の宣言が含まれています。

ObjectScript クラス Demo.Test のメソッドとプロパティの宣言

クラス 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() メソッド

IRISObject.set() メソッドは、IRIS.set() でサポートされるすべてのデータ型を含む、任意の Java オブジェクトをプロパティ値として受け入れます (“クラス IRIS のサポートされているデータ型” を参照)。

汎用の get() メソッドに加えて、IRISObject は、getBoolean()getBytes()getDouble()getIRISList()getLong()getObject(),getString()、および invokeVoid() のデータ型固有のメソッドを提供します。

IRISObject invoke() メソッド

IRISObject invoke メソッドは、IRIS クラス・メソッド呼び出しと同じセットのデータ型をサポートしています (“クラス・メソッドの呼び出し” を参照)。

汎用の invoke() メソッドに加えて、IRISObject は、invokeBoolean()invokeBytes()invokeDouble()invokeIRISList()invokeLong()invokeObject()invokeString()、および invokeVoid() のデータ型固有のメソッドを提供します。

サポートされる標準のデータ型のメソッドのほかに、IRISObjectinvokeStatusCode() も提供します。これは、ObjectScript %Status 戻り値の内容を取得します (“%Status エラー・コードの取得” を参照)。

invoke メソッドすべては、methodNameString 引数に加え、0 個以上のメソッド引数を取ります。これは以下のいずれかの型にできます : IntegerShortStringLongDoubleFloatbyte[]BooleanTimeDateTimestampIRISList、または IRISObject。接続が双方向の場合、任意の Java オブジェクトを引数として使用できます。

すべての引数の数よりも少ない数の引数を渡すか、末尾の引数に対して null を渡すことで、引数リストで末尾の引数を省略できます。非 null 引数が null 引数の右側に渡されると、例外がスローされます。

FeedbackOpens in a new tab