サンプル・コード
Java ゲートウェイのサンプル・コードは、Ensemble インストールの EnsLib.JavaGateway.Test クラスにあります。これらのサンプルでは、Ensemble プロキシ・クラスを生成および使用する方法を紹介しています。これらの方法については、サンプルに関する以下の節で説明します。
この章で説明する各メソッドでは、プロキシ・クラスと Java クラスとの通信に使用するポート番号を port 引数で指定し、Java ゲートウェイ・サーバを実行しているマシンを host 引数で指定します。port 引数は必須です。host はオプションであり、指定しなかった場合のデフォルトは "127.0.0.1" (ローカル・マシン) です。
Java ゲートウェイのサンプルの設定
サンプル・コードを実行する準備のために、この章で説明する各サンプルで、以下の手順を完了する必要があります。
-
Java ゲートウェイ・サーバを起動します (JMS の場合は、JMS ゲートウェイ・サーバを起動します)。
-
ターミナル・セッションを開始し、Ensemble ネームスペースに切り替えます (JMS の例の場合、ターミナル・セッションが 2 つ必要です)。
-
サンプル・コードを初めて実行する場合、または Java クラスの変更やリコンパイルを行った場合は、インポート・コードを必ず実行してください。
EnsLib.JavaGateway.Test に含まれるサンプル・コードのいずれかを実行する準備を行うときには、初めての場合でも、Java コードの更新やリコンパイルを行った後でも、EnsLib.JavaGateway.InterfaceEnablerOpens in a new tab にある対応するインポート・メソッドを実行する必要があります。これにより、必要な Java クラスがインポートされます。インポート・メソッドの具体的なサンプルは、実行するサンプルの種類によって異なります。以下に例を示します。
-
Ensemble で提供されている Java クラスのサンプルをインポートするには、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.InterfaceEnabler).ImportJGSamples(port,host)
-
JDBC インタフェースをインポートするには、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.InterfaceEnabler).ImportJDBC(port,host)
-
InterSystems JBoss Person EJB をインポートするには、以下のコマンドをすべて 1 行で入力します。
Do ##class(EnsLib.JavaGateway.InterfaceEnabler).ImportPersonJBoss(PersonEJBJar, j2eeJarFile,port,host)
ここで、PersonEJBJar は PersonEJB.jar ファイル (InterSystems EJB Boss プロジェクションによって生成されます) を指し、j2eeJarFile はシステム上の J2EE jar ファイルを指します。以下に例を示します。
c:/myj2ee/j2ee.jar
-
SonicMQ ConnectionFactory (Queue および Topic) をインポートし、SonicMQ JMS サーバへの接続を許可するには、以下のコマンドを (すべて 1 行で) 入力します。
Do ##class(EnsLib.JavaGateway.InterfaceEnabler).ImportSonicJMS(sonicBrokerJar, sonicContextJar,port,host)
ここで、sonicBrokerJar は、Sonic broker.jar ファイルを指します。以下に例を示します。
C:/Program Files/SonicSoftware/SonicMQ/lib/broker.jar
また、sonicContextJar は Sonic mfcontext.jar ファイルを指します。以下に例を示します。
C:/Program Files/SonicSoftware/SonicMQ/lib/mfcontext.jar
-
すべての J2EE インタフェース (EJB、JCA、JTA、Java XML、JTA など) をインポートするには、以下のコマンドを (すべて 1 行で) 入力します。
Do ##class(EnsLib.JavaGateway.InterfaceEnabler).ImportJ2EE(j2eeJarFile, port,host)
ここで、j2eeJarFile はシステム上の J2EE jar ファイルを指します。以下に例を示します。
c:/myj2ee/j2ee.jar
これらのインポート・メソッドに加えて、EnsLib.JavaGateway.InterfaceEnablerOpens in a new tab クラスは、jar ファイルまたはディレクトリ名が指定された場合に、その jar ファイルまたはディレクトリで利用可能なすべてのクラスを表示する、便利なメソッドを提供します。
Do ##class(EnsLib.JavaGateway.InterfaceEnabler).Browse(jarName,port,host)
プレーン Java サンプルの実行
Test() メソッドは、Ensemble と共に配布される基本クラスのサンプルの使用方法を示します。これを実行するには、まず、インポートが必要な場合には ImportJGSamples() を使用してサンプルを設定します。次に、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.Test).Test(port,host)
TestArrays() メソッドは、配列の使用方法を示します。これを実行するには、まず、インポートが必要な場合には ImportJGSamples() を使用してサンプルを設定します。次に、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.Test).TestArrays(port,host)
JDBC サンプルの実行
以下の例は、Caché JDBC ドライバとの接続を確立し、いくつかの標準 JDBC コードを実行します。これを実行するには、まず、インポートが必要な場合には ImportJDBC() を使用してサンプルを設定します。次に、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.Test).JDBC(port,host,jdbcPort,jdbcHost)
このサンプル・コードは、対応している JDBC ドライバを持つ任意のデータベースに対して機能します。接続パラメータ (JDBC ドライバ・クラス名、URL、ユーザ名、およびパスワード) を、適切な値に置き換えてください。詳細は、"クラスリファレンス" の JDBCOpens in a new tab メソッドのエントリを参照してください。
jdbcPort の値は、デフォルトでは 1972 になります。多くの場合、これは Ensemble インスタンスに対して正しい値ではありません。
EJB ゲートウェイ・サンプルの実行
以下の例は、Caché Basic または ObjectScript のコードで JBoss バージョン 4.0.1 を使用して、サンプル Entity Bean (Caché EJB プロジェクションで生成されたものです) にアクセスする方法を示しています。これを実行するには、まず、インポートが必要な場合には ImportPersonJBoss() を使用してサンプルを設定します。次に、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.Test).PersonJBoss(JBossRoot,port, host)
ここで、JBossRoot は JBoss ルートを指します。以下に例を示します。
c:/jboss-4.0.1sp1
この例は、任意のアプリケーション・サーバに対して機能するように、簡単に変更できます。CLASSPATH を適切に設定し、適切な接続パラメータおよびコンテキスト・パラメータを使用します。
JMS ゲートウェイ・サンプルの実行
以下の例は、Pub/Sub (Topic) および P2P (Queue) JMS ゲートウェイを、SonicMQ JMS サーバに対して使用する方法を示しています。この例を通じて、SonicMQ に添付されているサンプル Topic/Queue が使用されています。
JMS ゲートウェイを使用するには、J2EE SDK の j2ee.jar ファイルに含まれている java.jms.* ライブラリが必要です。
下の例は、任意の JMS サーバに対して機能するように変更できます。CLASSPATH を適切に設定し、適切な Queue/Topic の接続ファクトリを使用します。また、対応する接続ファクトリをインポートするように ImportSonicJMS() メソッドを変更する必要があり、適切なサンプル Topic/Queue を使用する必要があります。
JMS ポイントツーポイント (P2P) のサンプル
以下の例は、JMS ベースの Queue メッセージ送信者および受信者を生成し、それらを Ensemble セッションから制御する方法を示します。このサンプルを実行するには、まず、インポートが必要な場合には ImportSonicJMS() を使用してサンプルを設定します。次に、以下の手順を実行します。
-
1 つのターミナル・セッションで、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.Test).JMSQueueReceiver(sonicBrokerJar,port,host)
ここで、sonicBrokerJar は、Sonic broker.jar ファイルを指します。以下に例を示します。
C:/Program Files/SonicSoftware/SonicMQ/lib/broker.jar
このサンプルは、SonicMQ が提供するサンプル・キューを使用して、SonicMQ JMS サーバに接続します。その後、受信メッセージを待機し、メッセージを受信するとターミナル画面に表示します。
-
もう一方のターミナル・セッションで、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.Test).JMSQueueSender(sonicBrokerJar,port,host)
このサンプルは、SonicMQ が提供するサンプル・キューを使用して、SonicMQ JMS サーバに接続します。その後、ループにとどまり、ユーザにメッセージの入力を求めます。
-
送信者側では、メッセージの入力を求められます。
-
メッセージを入力して Enter を押します。
-
メッセージが受信者側に表示されます。
-
このサンプルは、両方のターミナル・セッションを閉じるか、メッセージ・テキストとして QUIT を入力するまで実行されます。
JMS Publish/Subscribe (Pub/Sub) のサンプル
以下の例は、Caché Basic または ObjectScript コードで JMS ベースのトピック・パブリッシャおよびサブスクライバを生成し、それらを使用してメッセージを送信する方法を示しています。これを実行するには、まず、インポートが必要な場合には ImportSonicJMS() を使用してサンプルを設定します。次に、以下の手順を実行します。
-
1 つのターミナル・セッションで、以下のコマンドを実行します。
Do ##class(EnsLib.JavaGateway.Test).JMSSubscriber(sonicBrokerJar,port,host)
ここで、sonicBrokerJar は、Sonic broker.jar ファイルを指します。以下に例を示します。
C:/Program Files/SonicSoftware/SonicMQ/lib/broker.jar
このサンプルは、SonicMQ が提供するサンプル・トピックを使用して、SonicMQ JMS サーバに接続します。その後、トピック接続を確立し、単一メッセージを受信するまで待機します。
-
もう一方のターミナル・セッションで、以下のコマンドを実行します。
Do ##class(EnsLib.JavaGateway.Test).JMSPublisher(sonicBrokerJar,port,host)
このサンプルは、SonicMQ が提供するサンプル・トピックを使用して、SonicMQ JMS サーバに接続します。その後、トピック接続を確立し、単一メッセージを作成および送信します。
-
パブリッシャがサブスクライバに 1 つのメッセージ ("Hello JMS!") を送信し、両方とも終了します。
Java 命名規則とディレクトリ・インタフェース (JNDI) のサンプル
このサンプルは、JMS Pub/Sub のサンプルとほとんど同じですが、JMSPublisher() は実際に接続を作成することに対して、JNDIPublisher() メソッドは JNDI レジストリ内の TopicConnectionFactory オブジェクトを検索することによって接続を確立するという点が異なります。JNDIPublisher() でオブジェクトが見つからない場合は、オブジェクトの (再) バインドを行い、戻ってオブジェクトを再検索します。
JNDI サンプルを使用する JMS は、JMS に対してカスタマイズされます。ただし、JNDI を使用して、Enterprise Java Beans (EJB) など、他のコンテキストのファクトリ・オブジェクトを取得することができます。
このサンプルを実行するには、まず、インポートが必要な場合には ImportSonicJMS() を使用してサンプルを設定します。次に、以下の手順を実行します。
-
1 つのターミナル・セッションで、以下のコマンドを入力します。
Do ##class(EnsLib.JavaGateway.Test).JMSSubscriber(sonicBrokerJar,port,host)
ここで、sonicBrokerJar は、Sonic broker.jar ファイルを指します。以下に例を示します。
C:/Program Files/SonicSoftware/SonicMQ/lib/broker.jar
-
もう一方のターミナル・セッションで、以下のコマンドを (すべて 1 行で) 入力します。
Do ##class(EnsLib.JavaGateway.Test).JNDIPublisher(sonicBrokerJar, sonicContextJar,port,host)
ここで、sonicContextJar は Sonic mfcontext.jar ファイルを指します。以下に例を示します。
C:/Program Files/SonicSoftware/SonicMQ/lib/mfcontext.jar
-
パブリッシャがサブスクライバに 1 つのメッセージ ("Hello JMS!") を送信し、両方とも終了します。
ステートレス・サービス・モードの例
ここでは、GSON を使用したシンプルな実装を紹介します。この実装は、2 つの都市間の Google ディレクションを取得して、それらのディレクションを JSON 形式で Caché に送り返します。GSON の詳細は、https://code.google.com/p/google-gson/Opens in a new tab を参照してください。
Java コード :
package jsonservice;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.net.URL;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class Directions implements com.intersys.gateway.Service {
public byte[] execute(byte[] args) throws Throwable {
JsonElement inputJSON = new JsonParser().parse(new
BufferedReader(new InputStreamReader(new ByteArrayInputStream(args), "UTF-8")));
JsonObject jsonObject = inputJSON.getAsJsonObject();
String origin = jsonObject.get("origin").toString();
String destination = jsonObject.get("destination").toString();
URL URLsource = new URL("http://maps.googleapis.com/maps/api/directions/json?
origin="+origin+"&destination="+destination+"&sensor=false");
BufferedReader in = new BufferedReader(new InputStreamReader(URLsource.openStream(),"UTF-8"));
JsonElement outputJSON = new JsonParser().parse(in);
in.close();
jsonObject = outputJSON.getAsJsonObject();
String response = jsonObject.toString();
return response.getBytes();
}
}
上記のサービスを Caché/Ensemble から呼び出すには、以下を実行します。
Set classPath=##class(%ListOfDataTypes).%New()
// add GSON to the classpath
Do classPath.Insert("c:/service/gson-1.4.jar")
// add the location of the above Service to the classpath
Do classPath.Insert("c:/service/")
// invoke the service
Write ##class(%Net.Remote.Gateway).%RemoteService("127.0.0.1",55555,"jsonservice.Directions","{""origin"" :
""philadelphia"", ""destination"" : ""boston""}",classPath)
JSON 解析ツール (GSON) は、このシンプルな例では必須というわけではありません。