これは InterSystems FAQ サイトの記事です。
Java ゲートウェイを使用することで、Java クラスのモジュールを InterSystems IRIS から実行できます。
【メモ】Java ゲートウェイは、外部 Java オブジェクトを InterSystems IRIS 内のネイティブ・オブジェクトと同じようにインスタンス化し、Javaオブジェクトを操作するための方法です。
詳細は以下ドキュメントをご参照ください。
Java ゲートウェイについて
Java ゲートウェイを使用する手順は以下の通りです。
1) Java ゲートウェイサーバを開始する
2) プロキシオブジェクト(ダイナミック・プロキシ・オブジェクト)を作成して Java オブジェクトを操作する
1) Java ゲートウェイサーバを開始する
Java ゲートウェイサーバを開始する方法は 3 種類あります。以下のいずれかの方法で、Java ゲートウェイサーバを開始します。
A) 管理ポータルの「オブジェクトゲートウェイ」を利用する
B) プロダクションにJavaゲートウェイサービスを追加する
C) java コマンドを使用する
A)~C) の方法は以下の通りです。
A) 管理ポータルの「オブジェクトゲートウェイ」を利用する
管理ポータル > [システム管理] > [構成] > [接続性] > [オブジェクトゲートウェイ] の画面で Java ゲートウェイサーバを作成します。
設定保存後、「開始」をクリックして Java ゲートウェイサーバを開始します。
開始後の画面は以下の通りです。
これで、Java ゲートウェイサーバの開始は終了です。停止する場合は、オブジェクトゲートウェイの設定画面で「停止」のリンクをクリックします。
B) プロダクションにJavaゲートウェイサービスを追加する
任意のネームスペースにプロダクションを作成し、EnsLib.JavaGateway.Service クラスを「サービス」に追加します。
管理ポータル > [Interoperability] > [一覧] > [プロダクション] > [新規]ボタンクリック > パッケージ名、プロダクション名(=クラス名)を指定し OK ボタンクリック
サービスの右側にある + のボタンをクリックし [EnsLib.JavaGateway.Service] を追加します。
設定を行うため、EnsLib.JavaGateway.Service をクリックします(クラス名の字の部分をクリックします)。
画面右側の「設定」タブで、アドレス/ポート を設定します。
この後、プロダクションを「開始する」ボタンで開始することで、Java ゲートウェイサーバも開始します。
停止する場合は、プロダクションを「停止する」ボタンで停止してください。
詳細は、ドキュメントもご参照ください。
Java ゲートウェイのビジネスサービスの追加
C) java コマンドを使用する
以下のコマンドで開始できます。
java -classpath [IRISインストールディレクトリ]\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar;[IRISインストールディレクトリ]\dev\java\lib\JDK18\intersystems-gateway-3.1.0.jar com.intersystems.gateway.JavaGateway ポート番号 ログファイルフルパス プロキシクラスの識別子 ホスト名
実行例) IRISのインストールディレクトリが c:\InterSystems\IRIS1 、ホスト名は localhost、ポート番号は 12345 で開始する例
java -classpath C:\InterSystems\IRIS1\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar;C:\InterSystems\IRIS1\dev\java\lib\JDK18\intersystems-gateway-3.1.0.jar com.intersystems.gateway.JavaGateway 12345 c:\kit\javag.log abc localhost
詳細は、ドキュメントもご参照ください。
コマンド・プロンプトの使用法
2) プロキシオブジェクト(ダイナミック・プロキシ・オブジェクト)を作成して Java オブジェクトを操作する。
上記3手法のいずれか1つで Java ゲートウェイサーバを開始してから実行します。
なお、Java 側のクラスや Jar ファイルが更新された場合、Java ゲートウェイサーバの再起動が必要です。ご注意ください。
テストに使用している Java クラス(test.java)は以下の通りです。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class test {
public int num = 1234;
public String data;
// test1 は文字列を返す
public static String test1() { return "abc"; }
// test2 は test3()で作成したリストの個数を返す
public static int test2(List obj) { return obj.size(); }
// test3 は 可変個の引数として文字列を受け取り、testインスタンスを作成しListに格納して戻す
public static List test3(String... input) {
List testlist=new ArrayList();
for (String str : input) {
test obj=new test();
obj.data=str;
testlist.add(obj);
}
return testlist;
}
}
例では、 c:\temp\test.java に配置した状態でコンパイルを実行し、c:\temp\test.class を作成しています。
IRIS から test.class のインスタンスを生成するコードは以下の通りです。
// クラス/JARファイルの位置を指定するためリストオブジェクトを作成
set class=##class(%ListOfDataTypes).%New()
// 作成したJavaクラスの場所をリストに追加
do class.Insert("c:\temp")
// Javaゲートウェイサーバに接続するためのインスタンス生成
set GW=##class(%Net.Remote.Gateway).%New()
// 第1引数:ホスト名/第2引数:ポート番号/第3引数:ネームスペース/第5引数:クラスファイルを指定したリスト
set st=GW.%Connect("localhost",55555,"USER",,class)
// 1が返れば、接続成功
write st
// 1以外が戻った時にエラーメッセージ表示方法
write $system.Status.GetErrorText(st)
// ダイナミックプロキシオブジェクトを利用して test.classのインスタンス生成
set testobj=##class(%Net.Remote.Object).%New(GW,"test")
// test1()メソッドの実行
write testobj.test1()
// インスタンス変数 num の表示
write testobj.num
// Javaクラスに用意した test3()メソッドを利用して testインスタンスをListに格納して返送
set newobj=testobj.test3("あ","い","abc")
// test3()の結果を変数に設定し、test2()に渡して何個のリストが格納されているか確認(3が返る予定)
write testobj.test2(newobj)
// 接続切断
set st=GW.%Disconnect()