Top / J2EE / EJB

J2EEコンテナであるJBossを使ってEJBの勉強をしてみました。以下、作業メモです。

EJBの使い方

例えば、sayHello()メソッドでStringを返却するEJBを作る場合以下の物が必要です。

これとさまざまなDD(Deployment Descriptor)ファイルを作成し、サーバにデプロイしておくことで、ビジネスロジックを使用したいヒト(プログラム)は、

このようにすることによって、ビジネスロジックがどこで実行されたかを気にしないで結果を得ることができるようになります。つまり可用性が向上するわけですね。

まずはJNDI名と、EJBたちの関係

さて、先ほどJNDI経由でHomeインタフェースを取得すると言いましたが、EJBではオブジェクトを取得する際、必ずInitialContext?を経由します。この機構をJNDIといいます。

InitialContext?はあらかじめ、Stringのキー値とオブジェクトを対にしてコンテナに登録しておき、そのキー値でオブジェクトを検索し取得するのですが、そのキー値とオブジェクトの関係を理解しないと相当ややこしいです。

先の例で行くと、

initContext = new InitialContext();
Object ref = initContext.lookup("HelloEJBHoge");
HelloHome home = (HelloHome) PortableRemoteObject.narrow(ref,HelloHome.class);

とルックアップするのですが、この"HelloEJBHoge"がキー値で、HelloHome? が登録されているオブジェクトです。

話を整理すると、

ということですが、当然のように

という疑問がわき起こります。もっと具体的にいうと

ということです。

考察

さて先の疑問を解決したいと思います。まだTry and Errorです。。。

まず、hello.HelloHome?に名前を付けます。これはJ2EEの仕様内であるejb-jar.xmlによって行われます。

<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN'
  'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
  <enterprise-beans>
  <session>
    <ejb-name>HelloEJB</ejb-name>
    <home>hello.HelloHome</home> <-ココ
    <remote>hello.Hello</remote>
    <ejb-class>hello.HelloBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Container</transaction-type>
   </session>
  </enterprise-beans>
</ejb-jar>

これで、hello.HelloHome?にはHelloEJBというEJB名が付けられました。

さらに、このEJB名"HelloEJB"とコンテナ側に登録されている"HelloEJBHoge"は、JBoss独自ファイルである、jboss.xmlで関連づけられます。*2

<?xml version="1.0"?>
<jboss>
  <enterprise-beans>
  <session>
    <ejb-name>HelloEJB</ejb-name>
    <jndi-name>HelloEJBHoge</jndi-name>
  </session>
  </enterprise-beans>
</jboss>

これでHelloEJBHogeというキーとhello.HelloHome?が関連づけられました。HelloEJBHogeでlookupすればhello.HelloHome?を取得できそうです。実際にやってみると

public static void main(String[] args) throws NamingException,
    RemoteException, CreateException {
  InitialContext initContext = null;
  try {
    initContext = new InitialContext();
    Object ref = initContext.lookup("HelloEJBHoge");
    HelloHome home = (HelloHome) PortableRemoteObject.narrow(ref,
        HelloHome.class);
    Hello hello = home.create();
    System.out.println(hello.sayHello());
  } finally {
    if (initContext != null) {
      initContext.close();
    }
  }
}

これで確かに稼動しました!。*3

クライアントからではなく、サーブレットなどからアクセスする

context.lookup("java:comp/env/ejb/HelloEJB");

これでweb.xml内のejb-refを ejb/HelloEJB で検索します。

 <ejb-ref>
   <ejb-ref-name>ejb/HelloEJB</ejb-ref-name>
   <ejb-ref-type>Session</ejb-ref-type>
   <home>hello.HelloHome</home>
   <remote>hello.Hello</remote>
   <ejb-link>HelloEJB</ejb-link>
 </ejb-ref>

この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / J2EE / EJB

現在のアクセス:27437


*1 っつってもHello EJBってかえすだけ
*2 WebSphereにはWebSphereの独自ファイルがあります
*3 Eclipseでやったときは、実行時のクラスパスに${JBOSS_HOME}/client内のJarにパスを通さないとダメかも。。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS