Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

はじめてのEJBリモート呼出し

バッチ実行の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?
でした。

クライアントのプロジェクトは最終的にこんな構成。
f:id:kikutaro777:20131120150201j:plain

サーバサイド

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 + "さん!";
    }   
}

これだけです。

サーバサイドの最終的な構成はこんな感じ。
f:id:kikutaro777:20131120150712j:plain

実行結果

クライアントのプログラムを実行すると

f:id:kikutaro777:20131120150754j:plain

となりました。

GlassFishではgf-client.jarを参照しないとエラーになる点と、JNDIによるルックアップが初めてだったので、どう記述するかわからなかった点を除けば簡単に書けました。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村