// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。

***コンテンツ一覧 [#we76f7eb]
#ls2


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

***EJBの使い方 [#l6778de5]
例えば、sayHello()メソッドでStringを返却するEJBを作る場合以下の物が必要です。
-sayHello()メソッドをインタフェースに持つ、Helloインターフェース(extends EJBObject)
-実際にビジネスロジック((っつってもHello EJBってかえすだけ))を記述する、HelloBean(implements SessionBean)
-HelloインタフェースをCreateするメソッドを持つ、HelloHome インタフェース(extends EJBHome)

これとさまざまなDD(Deployment Descriptor)ファイルを作成し、コンテナにデプロイしておくことで、ビジネスロジックを使用したいヒト(プログラム)は、
-JNDI経由で、Homeインタフェースの取得
-Homeインタフェースから、実際のビジネスロジックをcreate
-createしたビジネスロジックを実行
という手順となります。

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



***まずはJNDI名と、EJBたちの関係 [#u1713768]
さて、先ほど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 が登録されているオブジェクトです。

話を整理すると、
-コンテナには、HelloEJBHogeというキーで、hello.HelloHomeオブジェクトが登録されている。
-InitialContextをそのキー値でlookupすることで、hello.HelloHomeオブジェクトを取得する

ということです。そこで''そもそもコンテナにオブジェクトを登録する方法は?''、もっと具体的にいうと''InitialContextをlookupする際のキー"HelloEJBHoge"と、hello.HelloHomeオブジェクトはどうやって関連づけられるのでしょうか??''という疑問がわき起こります。


***考察 [#p0b2925c]
さて先の疑問を解決したいと思います。まだ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で関連づけられます。((WebSphereにはWebSphereの独自ファイルがあります))
 <?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が関連づけられました。これらのクラスファイルやDDファイルをコンテナにデプロイすることで、JNDIへの登録から何からが完了したことになります。ちなみにejb-jar.xmlとjboss.xmlはejbのjarの/META-INF内に配置します。



ようやくこれで、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();
     }
   }
 }
これで確かに稼動しました!。ちなみにEclipseから実行したときは、実行時のクラスパスに${JBOSS_HOME}/client/jbossall-client.jarにパスを通さないとダメみたい。。 
 javax.naming.NoInitialContextException: Cannot instantiate class: 
 org.jnp.interfaces.NamingContextFactory [Root exception is 
 java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
  at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
  at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
  at javax.naming.InitialContext.init(Unknown Source)
なんてエラーが表示されしまうかも。。。






***クライアントからではなく、サーブレットなどからアクセスする [#b6921602]
さて、いわゆるローカルな(?)Lookupはこれで良さそうですが、サーブレットなどからEJBにアクセスするためにはjava:comp/envを使ったENCによるJNDI検索をする必要があるみたいです。つまりInitialContextをlookupするときに
 context.lookup("java:comp/env/ejb/HelloEJB");
てやる例のヤツです。

さて、
 context.lookup("java:comp/env/ejb/HelloEJB");
と指定すると、web.xml内のejb-refを ejb/HelloEJB で検索します。web.xmlには以下のEJB参照を記述しました。。
  <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>
これで、ejb-linkのところでjboss.xmlのejb-nameを見に行って、そこのjndi-nameでlookupする、と理解したんだけど、うまくいかない。。。。。。以下のエラーが表示されてしまいます。

 EJBException in method: public abstract hello.Hello hello.HelloHome.create() 
 throws java.rmi.RemoteException,javax.ejb.CreateException:
 javax.ejb.EJBException: Invalid invocation, check your deployment packaging, 
 method=public abstract hello.Hello hello.HelloHome.create() throws
 java.rmi.RemoteException,javax.ejb.CreateException

でも、わざと
  <ejb-link>HelloEJB</ejb-link>
をjboss.xmlにないHelloEJBaとかすると
 javax.naming.NamingException: ejb-ref: ejb/HelloEJB, no ejb-link in web.xml 
 and no jndi-name in jboss-web.xml)
なんていわれるから、DDたちはあってるような気がする。。。

また、ENCを使わないでクライアントでやったように直接
 Object boundObject = context.lookup("HelloEJBHoge");
とやっても、ENCでやったときと同じエラーが出ちゃいます。

:2005/11/22追記|どうも、EARファイルへのパッケージングのやり方が悪かったみたいです。WARファイルの中にEJBのファイルも入れてたんだけど、それがNGのようです。ちゃんとWARはWEBコンテナにデプロイしたいもののみ、EJB-JARはEJBコンテナにデプロイしたいもののみを入れなくてはいけないようです。


***jboss-web.xmlを使う [#a0eab205]
JBossでは先に書いた <ejb-link>HelloEJB</ejb-link> とjboss.xmlのejb-nameによるJNDI名との関連づけだけではなく、jboss-web.xmlによる関連づけも可能です。たぶんweb.xmlにはejb-linkを書かないで、jboss-web.xmlに
 <ejb-ref>
   <ejb-ref-name>ejb/HelloEJB</ejb-ref-name>
   <jndi-name>HelloEJBHoge</jndi-name>
 </ejb-ref>
と書くだけのようです。こっちの方が、きれいですね。ちなみにjboss-web.xmlはwarのWEB-INF/直下に配置します。web.xmlの隣に置いておきましょう。

:2005/11/22追記|「JBossでは」というよりも、同じEARに入れられたEJBを参照するときは<ejb-link>で、外部のEJBを参照するときはjboss-web.xmlで関連づける、という決まりになってるみたいですね。


***関連リンク [#n768272e]
-[[Webコンテナ設定:http://neverbird.sourceforge.jp/manual/fancy/ch07s22.html]] ココには非常に詳しくjboss-web.xmlなどの設定が書いてあります。


----
この記事は
#vote(おもしろかった[6],そうでもない[7])
-作ったearファイルをRational Application Developerで動かしたらうごいたぞー。。。なんで??? -- [[きの]] &new{2005-11-10 19:25:06 (木)};
-JBossの掲示板 http://www.jbossgroup.com/index.html?module=bb&op=viewforum&f=47 を検索してみたところ、クラスローダがどうのとか、ようするにパッケージングに問題がありそうな感じ。 -- [[きの]] &new{2005-11-11 17:30:15 (金)};
-急がばまわれで、チュートリアルをダウンロードしてきて、一からAntでパッケージングしたところ、ちゃんと稼動しました!!!! -- [[きの]] &new{2005-11-11 17:32:00 (金)};
- What do you want to do when you've finished?  -- [[Wxpspzch]] &new{2012-01-26 (木) 05:53:15};
- Insufficient funds  -- [[Eurnqivs]] &new{2012-01-26 (木) 06:18:20};
- Directory enquiries <a href=" http://www.netvibes.com/niqicaquqe#Preteen_Nude_Poses ">Free Preteentits Pics</a>  qkm <a href=" http://www.netvibes.com/baganugyr#Polish_Preteen_Nudes ">Nude Turkish Preteen</a>  =-((( <a href=" http://www.netvibes.com/iqutykesu#Nn_Sexy_Preteens ">Preteen Bikini Waals</a>  %O <a href=" http://www.netvibes.com/uiesipe#Preteen_Spanking_Videos ">Preteen Spanking Videos</a>  61266 <a href=" http://www.netvibes.com/hybepyyk#Preteens_Sleep_Underwear ">Youn Preteen Models</a>  =DDD <a href=" http://www.netvibes.com/iitapalu#Preteen_Schoolgirl_Toplist ">Preteens Tight Bikinis</a>  %DDD <a href=" http://www.netvibes.com/ogyjeepo#Preteen_Asian_Dvd ">Little Preteen Galleries</a>  coa <a href=" http://www.netvibes.com/sokoeij#Latvian_Preteen_Models ">Preteen Lesbians Jpg</a>  7558 <a href=" http://www.netvibes.com/ypuitany#Sex_Games_Preteen ">Preteen Underwear Bbs</a>  834109 <a href=" http://www.netvibes.com/ylihomada#Nude_Preteen_Galliries ">Preteen Nude Nudis</a>  :-D  -- [[Jydaplph]] &new{2012-02-05 (日) 11:22:34};
- Could I have a statement, please? <a href=" http://www.netvibes.com/egytunuje#Preteen_Beauty_Photos ">Only Preteens Picturies</a>  071412 <a href=" http://www.netvibes.com/atinutoi#Fake_Preteen_Models ">Maxwell Top Preteen</a>  8577 <a href=" http://www.netvibes.com/ihoduryi#Brazil_Beach_Preteen ">Preteens Gallerias Desnudas</a>  835425 <a href=" http://www.netvibes.com/jehiqojac#Preteen_Art_Collection ">Preteen Bodies Cute</a>  562 <a href=" http://www.netvibes.com/oityleno#Galleries_Preteens_Pantyhose ">Model Preteens Strawberry</a>  99636 <a href=" http://www.netvibes.com/piqeduloo#Preteen_Dating_Sites ">Shocking Preteens Photos</a>  131190 <a href=" http://www.netvibes.com/saqohilyfa#Preteen_Sandra_Dasha ">Nonude Preteens Videos</a>  :-(( <a href=" http://www.netvibes.com/ocyrimam#Pre_Teens_Cumshots ">Babe Pre Teen</a>  8922 <a href=" http://www.netvibes.com/enibegehyf#Preteen_Art_Girls ">Young Preteen Top</a>  >:( <a href=" http://www.netvibes.com/niytomop#Japan_Preteens_Models ">Preteen Underage Modelz</a>  %-O  -- [[Ijmskxzt]] &new{2012-02-05 (日) 12:39:13};
- Hold the line, please <a href=" http://www.netvibes.com/kibegureq#Really_preteen_pics ">nude preteen barby</a>  039597 <a href=" http://www.netvibes.com/ykihusun#Top100_preteen_bbs ">preteen ranking site</a>  505030 <a href=" http://www.netvibes.com/yymigima#Preteen_bbs_harcore ">board3 nude preteen</a>  aee <a href=" http://www.netvibes.com/isubifega#Preteen_gallery_links ">pthc preteen pics</a>  >:-OO <a href=" http://www.netvibes.com/sipyresef#Preteen_gymnast_picture ">preteen site link</a>  556 <a href=" http://www.netvibes.com/sucakesai#Little_preteen_gangbang ">graceful preteen girls</a>  1638 <a href=" http://www.netvibes.com/gasoimim#Russian_preteens_bbs ">litle preteen nudes</a>  ebkr <a href=" http://www.netvibes.com/ihujucily#Blue_mania_preteens ">hard preteens russian</a>  8]] <a href=" http://www.netvibes.com/elapuuu#Peeing_on_preteen ">preteen dream bbs</a>  qlb <a href=" http://www.netvibes.com/inetayja#Model_preteen_girls ">preteen tgp list</a>  >:[  -- [[Ksmvozgc]] &new{2012-02-05 (日) 12:50:40};
- What do you do for a living? <a href=" http://www.netvibes.com/ulanumadyn#Russian_preteen_action ">yo 13 preteen</a>  xtknu <a href=" http://www.netvibes.com/unutyalaq#Exotic_nonnude_preteen ">dark preteen bbs</a>  qdwrew <a href=" http://www.netvibes.com/ofujasuki#Sandra_preteen_pussy ">top50 preteen portal</a>  dsevs <a href=" http://www.netvibes.com/hagudimob#Preteen_modeling_photo ">preteen cherry clips</a>  >:-P <a href=" http://www.netvibes.com/ajopusury#Preteen_gorgeous_model ">preteen boys nudists</a>  43626 <a href=" http://www.netvibes.com/itekisyto#Naturalist_preteens_pics ">nymphet jpg preteen</a>  :-[ <a href=" http://www.netvibes.com/utyytudi#Model_preteen_petite ">preteen nudist child</a>  >:DDD <a href=" http://www.netvibes.com/eboritaom#Nonude_girls_preteen ">pre teen fashions</a>  jiwl <a href=" http://www.netvibes.com/qomacyjil#Dolli_preteen_nude ">naked preteen naturalists</a>  %))) <a href=" http://www.netvibes.com/mimiomene#Preteen_beauty_forum ">preteen magazine fantasy</a>  wdwk  -- [[Qlxkbvfu]] &new{2012-02-05 (日) 13:52:25};
- Do you know each other?  <a href=" http://www.netvibes.com/sehamuka#Preteen_nymphets_lolita_underage ">dark collect bbs lolitas</a>  %-D <a href=" http://www.netvibes.com/lirebyko#Home_lolita_comchild_models ">lolia models private pics</a>  rfph <a href=" http://www.netvibes.com/abolaiga#Baby_lolita_girl_nude ">lolita girls almost nude</a>  69834 <a href=" http://www.netvibes.com/esukofetyf#12_year_lolita_foto ">lolita davidovich rape video</a>  tyw <a href=" http://www.netvibes.com/byygabi#Hardcore_lolita_asian_porn ">loli bbs preteen tits</a>  527886 <a href=" http://www.netvibes.com/ycyhakiy#Hungarian_nude_loli_link ">sexy little panties lolitas</a>  cqmlaa <a href=" http://www.netvibes.com/afeaynep#Preteen_lolita_incest_pic ">preteen lolita incest pic</a>  hxre <a href=" http://www.netvibes.com/uquregemu#Lolita_bbs_naked_preteen ">lolita bbs naked preteen</a>  vgz <a href=" http://www.netvibes.com/edacyohe#Top_lolita_cp_site ">illegal preteen lolita porn</a>  142 <a href=" http://www.netvibes.com/jagoihuo#Dark_lolli_bbs_preteen ">dark lolli bbs preteen</a>  =-[[  -- [[Mhegdzmi]] &new{2012-02-05 (日) 13:58:47};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

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