バッチ実行のexeプログラムからEJBのロジックを直接呼び出したりできないか?という質問を受けて、あれ、そういう感じのEJB呼び出しって金魚本で読んだような…と思って本を開きながら@Remoteのアノテーション辺りを実際に試してみました。
今日作ったのはすごく簡単なサンプルですが、動いてちょっと感動(^^;
ビジネスロジックがうまくEJBに集約されてれば、Webシステム構築後に別途追加のバッチが発生して、外側からロジックを呼び出したい場合でも割と気軽に呼べるのかな?と思ったり。
環境は
OS:Windows 7 Professional 64bit
IDE:NetBeans 7.3
AP:GlassFish 3.1.2.2
でした。
クライアントアプリケーション
Java SEのアプリケーションで作りました。
(NetBeansの「ファイル」->「新規プロジェクト」->「Java」->「Javaアプリケーション」)
呼び出すEJBのインタフェースを定義しました。
package ejbclient;
public interface EjbInterface{
public String getName(String name);
}
mainは以下のような定義です。
package ejbclient;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EjbClient {
public static void main(String[] args) {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
try {
InitialContext ic = new InitialContext(props);
EjbInterface ejb = (EjbInterface) ic.lookup("java:global/EjbRemote/EjbService!ejbclient.EjbInterface");
System.out.println(ejb.getName("kikutaro"));
} catch (NamingException ex) {
}
}
}
で、GlassFishのgf-client.jarを追加しないと
javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory
というエラーになるので、追加しました。
gf-client.jarはGlassFishのインストールフォルダ(自分の環境ではC:\Program Files\glassfish-3.1.2.2\glassfish\lib)に存在しました。
解決の参考にしたのは
How to setup JNDI for Glassfish 3.1.2 for a stand-alone client?
でした。
クライアントのプロジェクトは最終的にこんな構成。
サーバサイド
NetBeansの「ファイル」->「新規プロジェクト」->「Java Web」->「Webアプリケーション」でJava EE6として作成しました。
コードはStatelessなEJBクラスを1つ定義しただけです。
ライブラリの参照としてさきほど作ったクライアントのjarを参照させました。
今回はとりあえずプロジェクト参照でやっています。
EJBは
package jp.co.kke.ejb;
import ejbclient.EjbInterface;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote(EjbInterface.class)
public class EjbService implements EjbInterface{
@Override
public String getName(String name) {
return "こんにちは" + name + "さん!";
}
}
これだけです。
サーバサイドの最終的な構成はこんな感じ。
実行結果
クライアントのプログラムを実行すると
となりました。
GlassFishではgf-client.jarを参照しないとエラーになる点と、JNDIによるルックアップが初めてだったので、どう記述するかわからなかった点を除けば簡単に書けました。