JBossでEJB3

JBossとJBossIDEをひさびさに使ったついでに、世間でうわさのEJB3というのをはじめて(今更)さわってみた。

インストール

  • JBoss4.0.3はZIP版を解凍してインストールした場合は、別途EJB3コンテナ(\jboss-EJB-3.0_xxx)をダウンロードして追加インストールする必要あり。手動でファイルのコピーや削除が必要(INSTALL.html参照)。
  • JARのインストーラ版の場合は、ejb3やallを選択すればそのまま利用可。

ファイル配置

ステートレスセッションビーンを作ってみた。unpackデプロイで確認。

ejb3test.ear/            EAR
  myejb.ejb3/            EJB3
    hoge/
       Echo.class        EJBのインターフェイス
       EchoBean.class    EJBの実装
       EchoClient.class  EJBを呼び出すクラス
  hoge.war/              WEBアプリ
    hoge.jsp             JSP
  META-INF/
    application.xml
Echo.java
package hoge;

import javax.ejb.Remote;

@Remote
public interface Echo {
    public String sayEcho(String message);
}
EchoBean.java
package hoge;

import javax.ejb.Stateless;

public @Stateless class EchoBean implements Echo {
	
    public String sayEcho(String message){
        System.out.println(message);
        return message;
    }	
}
EchoClient.java
package hoge;

import javax.naming.InitialContext;

public class EchoClient {

    public static String sayEcho(String message) {
        try {
            InitialContext ctx = new InitialContext();
            Echo echo = (Echo)ctx.lookup(Echo.class.getName());
            String result = echo.sayEcho(message);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    public static void main(String[] args) throws Exception {
        String result = sayEcho("hello2");
        System.out.println(result);
    }
}
hoge.jsp
<%=hoge.EchoClient.sayEcho("ccc") %>
application.xml
<?xml version="1.0" encoding="UTF-8"?>
<application version="1.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">

    <display-name>hoge ear</display-name>

    <module>
        <ejb>myejb.ejb3</ejb>
    </module>
    <module>
        <web>
            <web-uri>hoge.war</web-uri>
            <context-root>hoge</context-root>
        </web>
    </module>


</application>

実行

  • 一応動いた。JSPからの呼び出しは普通に動いた。
  • EchoClientのmainからの実行は、jbossall-client.jarをクラスパスに追加して実行。動いたが、クライアント側では正常にメッセージが帰ってきたが、サーバ側で、java.net.SocketException: Connection resetとかエラーになる。call by valueだかなんだかの設定がいるのかも。よく知らない。
  • もう満足(淡白)。チュートリアルにはエンティティビーンとか作る説明もあるです。
  • あ、EclipseのJBossIDEのEJB3プロジェクトから作りました(といっても、これはクラスパス通してるだけだと思うが)。デプロイは、プロジェクトの場所を直接deploy以下においた。
  • 安定して動くなら、XDocletのタグよりEJB3アノテーションを使った方がすっきりしそう。標準だし。