- PR -

EJBのJNDI lookupについて

1
投稿者投稿内容
stepx2
会議室デビュー日: 2003/11/05
投稿数: 6
投稿日時: 2003-11-11 11:57
お世話になっております。

JBoss3.2.2を利用してEJBについて勉強しているのですが、
JNDIについて混乱していまして
ご質問させて頂きたいと思います。

ejb-jarファイルにパッケージングされる
jboss.xmlに次のように記述したEJBをデプロイしました。
コード:
<!-- jboss.xmlの抜粋 -->
<entity>
	<ejb-name>Member</ejb-name>
	<jndi-name>ejb/remote/Member</jndi-name>
	<method-attributes>
	</method-attributes>
</entity>



この場合、このBean(MemberHome)をlookupするときに次のようにすれば
できることを確認しました。
コード:
InitialContext context = new InitialContext();
Object objref = context.lookup("ejb/remote/Member");
MemeberHome home = (MemberHome)PortableRemoteObject.narrow(objref, MemberHome.class);



そこでご質問なのですが、
1.EJBの仕様書によれば、java:comp/env/ejb/MemberHomeのような記述が
 JNDI位置情報として推奨されているとのことですが、
 推奨されている記述を採用したい場合は
 jboss.xmlファイルの<jndi-name>要素にこれ("java:comp/env/...")を
 記述すればよいのでしょうか。

2.JNDIの位置情報を変更しても、プログラムを変更することなくデプロイできるように
 EJB参照という仕組みがあるということを知りました。
 EJB参照を利用する場合、ejb-jarファイルの<ejb-ref-name>要素のボディには
 何を指定したらよいのでしょうか。
 jboss.xmlの<jndi-name>に指定した値を指定するのでしょうか。
 また、lookupする時に指定するjndi文字列には<ejb-ref-name>で指定した値を
 指定するようにすればよいのでしょうか。

<ejb-ref>(ejb-jarファイル)、<jndi-name>(jboss.xmlファイル)、
lookup時のJNDI文字列の間の関係についてご教示頂ければと思います。
よろしくお願いします。
乳牛
常連さん
会議室デビュー日: 2003/04/15
投稿数: 22
投稿日時: 2003-11-11 12:36
木下牛です。

>1.EJBの仕様書によれば、java:comp/env/ejb/MemberHomeのような記述が
> JNDI位置情報として推奨されているとのことですが、
> 推奨されている記述を採用したい場合は
> jboss.xmlファイルの<jndi-name>要素にこれ("java:comp/env/...")を
> 記述すればよいのでしょうか。

java:comp/env/* はENC名といって呼び出し側の設定になります。
なので呼び出されるEJBのDD(Deployment Descriptor)にはjava:comp/env*
と書く必要はありません。(書いてはいけません)
EJBをデプロイしたときにつけられるJNDI名はアプリケーションサーバによって
微妙に違います。JBossでは素直に
ejb/remote/Member
というJNDIになるかもしれませんが、他のアプリケーションサーバでは
java/ejb/remote/Member
とか勝手にプリフィックスをつけてくれたりするものもあります。(JBoss2.4.x
のデータソースなんかはそうだったような・・・)
なので、直接のJNDI名をコード中に書いてしまうと他のアプリケーションサーバ
に移植するときにコードの修正が必要になり、ポータビリティが落ちます。
そこで、コンポーネント内だけで通用するENC名と実JNDI名のマッピングをして
(これはアプリケーションサーバ固有のDDに記述します)コードではENC名で
EJBやデータソースを取得するようにします。それが、ejb-ref-nameの設定にな
ります。ejb-ref-nameがENC名になります。JBossの場合、別のEJBが先のMember
EJBを呼ぶ場合次のように記述します。
ejb-jar.xml------------------------
:
<ejb-ref>
<ejb-ref-name>ejb/Member</ejb-ref-name>
:
</ejb-ref>
:
-----------------------------------
jboss.xml--------------------------
<ejb-ref>
<ejb-ref-name>ejb/Member</ejb-ref-name>
<jndi-name>ejb/remote/Member</jndi-name>
</ejb-ref>
-----------------------------------

こうすると、
context.lookup("java:comp/env/ejb/Member");
で、見つけることが出来ます。

2.4.xのドキュメントですが参考までに
http://neverbird.sourceforge.jp/manual/fancy/ch07s13.html
stepx2
会議室デビュー日: 2003/11/05
投稿数: 6
投稿日時: 2003-11-11 13:10
木下牛様
返信ありがとうございます。


引用:

木下牛さんの書き込み (2003-11-11 12:36) より:
java:comp/env/* はENC名といって呼び出し側の設定になります。
なので呼び出されるEJBのDD(Deployment Descriptor)にはjava:comp/env*
と書く必要はありません。(書いてはいけません)


ENC名というのですね。
恥ずかしながらはじめて知りました。
また、呼び出し側の設定なのですね。

引用:

ejb-jar.xml------------------------
:
<ejb-ref>
<ejb-ref-name>ejb/Member</ejb-ref-name>
:
</ejb-ref>
:
-----------------------------------
jboss.xml--------------------------
<ejb-ref>
<ejb-ref-name>ejb/Member</ejb-ref-name>
<jndi-name>ejb/remote/Member</jndi-name>
</ejb-ref>
-----------------------------------
こうすると、
context.lookup("java:comp/env/ejb/Member");
で、見つけることが出来ます。


なるほど。
jboss.xmlファイルに<ejb-ref-name>要素を記述することで、
ENC名と実際のJNDI名をマッピングするのですね。

設定ファイルやサンプルコードを記述していただいたおかげで、
私のような未熟者でも誤解することなく、
理解することができました。
詳細かつ丁寧なご説明本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)