J2EEコンテナであるJBossを使ってEJBの勉強をしてみました。以下、作業メモです。
例えば、sayHello()メソッドでStringを返却するEJBを作る場合以下の物が必要です。
これとさまざまなDD(Deployment Descriptor)ファイルを作成し、サーバにデプロイしておくことで、ビジネスロジックを使用したいヒト(プログラム)は、
このようにすることによって、ビジネスロジックがどこで実行されたかを気にしないで結果を得ることができるようになります。つまり可用性が向上するわけですね。
さて、先ほど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>
この記事は
現在のアクセス:27741