8.6. J2EE および JNDI - アプリケーションコンポーネント環境
- アプリケーションコンポーネントのビジネスロジックは、コード化しENC からの情報にアクセスする必要があります。コンポーネントプロバイダーは、コンポーネントに対して標準の配備記述子を使い、必要とされる ENC エントリを指定します。このエントリは、実行時にコンポーネントが必要とする情報とリソースの宣言をしています。
- このコンテナーが提供するツールでは、コンポーネントのデプロイヤーを使うことで、コンポーネント開発者が作成したENC 参照をこの参照を満たすデプロイメント環境エンティティへマッピングできます。
- コンポーネントデプロイヤーは、コンテナツールを使い最終的なデプロイメントができるようコンポーネントを準備します。
- コンポーネントコンテナーは、デプロイメントパッケージ情報を使ってランタイム時に完全なコンポーネントENC を構築します。
javax.naming.InitialContext
オブジェクトを作成してからjava:comp/env
名配下にあるネーミング環境を検索します。アプリケーションコンポーネントの環境エントリは ENC に直接格納されるか、あるいはサブコンテキスト内に格納されます。 例8.4「ENCアクセスのサンプルコード」 でコンポーネントがENC にアクセスする際に使うコードの典型的な行を示しています。
例8.4 ENCアクセスのサンプルコード
// Obtain the application component's ENC Context iniCtx = new InitialContext(); Context compEnv = (Context) iniCtx.lookup("java:comp/env");
Bean1
は EJB Bean2
のENC 要素にアクセスできず、逆方向でも同様にアクセスできなくなっています。同様に、Web アプリケーションWeb1
は、WEb アプリケーションWeb2
、Bean1
、あるいはBean2
のENC 要素にアクセスできません。また、任意のクライアントコードはアプリケーションサーバー VM 内外を問わず実行されている場合、コンポーネントのjava:comp
JNDI コンテキストにアクセスできません。ENC の目的は、コンポーネントのデプロイ環境タイプに関係なくアプリケーションコンポーネントが依存できる分離型の読み取り専用名前空間を提供することです。各コンポーネントが独自のENC コンテンツを定義するため、ENC は他のコンポーネントから分離する必要があります。たとえば、コンポーネントA
と B
が同名定義していても別のオブジェクトを参照している可能性があります。また、別の例を挙げますと、EJB Bean1
は環境エントリjava:comp/env/red
を定義し、RGB 色の赤に対して 16 進数を参照している場合があり、一方で Web アプリケーションWeb1
は、同名をデプロイメント環境言語ロケールの赤表示にバインドしている可能性もあります。
java:comp
配下の名前、java:
配下の名前、その他の名前です。前述したように、java:comp
コンテキストとそのサブコンテキストは、特定のコンテキストに紐付けられたアプリケーションコンポーネントに対してのみ利用可能になっています。java:
直下のサブコンテキストやオブジェクトバインディングは、JBoss サーバーの下層マシン内でのみ表示され、リモートクライアントからは見えません。コンテキストあるいはオブジェクトがシリアル化に対応していれば、その他のコンテキストやオブジェクトバインディングはリモートクライアントに提供されます。これらのネーミングスコープの分離の実施方法については 「JBoss Naming Service アーキテクチャー」を参照してください。
java:
コンテキストへのバインディングを制限すると便利な例は、関連データベースプールが常駐するJBoss サーバー内でのみ利用可能なjavax.sql.DataSource
の接続ファクトリでしょう。一方で、EJB ホームインターフェースは、リモートクライアントからアクセスできるはずのグローバルな表示名にバインドされるでしょう。
8.6.1. ENC の使用規則
ejb-jar.xml
配備記述子および Web コンポーネント用の標準 web.xml
配備記述子内に宣言されます。次のような様々な種類の情報が JNDI 内に格納、検索されます。
env-entry
要素により宣言された通りの環境エントリejb-ref
とejb-local-ref
要素により宣言された通りのEJB 参照resource-ref
要素が宣言した通りのリソースマネージャー接続ファクトリ参照resource-env-ref
要素に定義された通りのリソース環境参照
8.6.1.1. 環境エントリ
env-entry
を使い宣言されます。env-entry
要素には以下の子要素が含まれます:
- エントリの詳細を提供する任意のdescription 要素
java:comp/env
に相対となるエントリ名を渡すenv-entry-name要素- エントリ値の java タイプを与えるenv-entry-type要素。このエントリ値のタイプは以下のいずれかでなければなりません。
java.lang.Byte
java.lang.Boolean
java.lang.Character
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Short
java.lang.String
- 文字列としてエントリ値を与えるenv-entry-value 要素
ejb-jar.xml
配備記述子からのenv-entry
フラグメントに関する例が例8.5「ejb-jar.xml env-entry のフラグメント例」に提供されています。env-entry
は完全名かつ値の指定であるため、JBoss 固有の配備記述子要素はありません。例8.6「ENC env-entry アクセスコード」では、配備記述子で宣言されているmaxExemptions
値、taxRate
値、env-entry
値へアクセスするための、サンプルコードを提示しています。
例8.5 ejb-jar.xml env-entry のフラグメント例
<!-- ... --> <session> <ejb-name>ASessionBean</ejb-name> <!-- ... --> <env-entry> <description>The maximum number of tax exemptions allowed </description> <env-entry-name>maxExemptions</env-entry-name> <env-entry-type>java.lang.Integer</env-entry-type> <env-entry-value>15</env-entry-value> </env-entry> <env-entry> <description>The tax rate </description> <env-entry-name>taxRate</env-entry-name> <env-entry-type>java.lang.Float</env-entry-type> <env-entry-value>0.23</env-entry-value> </env-entry> </session> <!-- ... -->
例8.6 ENC env-entry アクセスコード
InitialContext iniCtx = new InitialContext(); Context envCtx = (Context) iniCtx.lookup("java:comp/env"); Integer maxExemptions = (Integer) envCtx.lookup("maxExemptions"); Float taxRate = (Float) envCtx.lookup("taxRate");
8.6.1.2. EJB参照
java:comp/env/ejb
コンテキスト内にまとめるよう推奨しています。
ejb-ref
要素を使い配備記述子で宣言します。各 ejb-ref
要素は、参照アプリケーションコンポーネントが参照されるエンタープライズ bean に対して持つインターフェース要件を記述します。ejb-ref
要素には以下の子要素が含まれます。
- 参照の目的を示すオプションのdescription 要素。
- ejb-ref-name 要素で、
java:comp/env
コンテキストに対して相対となる参照名を指定します。推奨のjava:comp/env/ejb
コンテキスト配下に参照を置くには、ejb-ref-name
値に対して、ejb/link-name
形式を使います。 - EJB の種類を指定するejb-ref-type 要素。
Entity
あるいはSession
でなければなりません。 - EJB ホームインターフェースの完全修飾クラス名を提供するhome 要素。
- EJB リモートインターフェースの完全修飾クラス名を提供するremote 要素。
- オプションの ejb-link 要素で同じ EJB JAR または同じ J2EE アプリケーションユニットにある別のエンタープライズ bean に参照をリンクします。
ejb-link
値は参照される bean のejb-name
になります。同じejb-name
を持つエンタープライズ bean が複数ある場合、値はパス名前を使用して、参照コンポーネントを含むejb-jar
ファイルの場所を指定します。パス名は参照ejb-jar
ファイルに相対的となります。Application Assembler は参照される bean のejb-name
を#
で区切ってパス名に追加します。これにより同じ名前を持つ複数の bean が一意に識別可能となります。
ejb-ref
要素を含むアプリケーションコンポーネントにスコープ設定されます。つまり、EJB 参照は実行時には他のアプリケーションコンポーネントからアクセスできず、他のアプリケーションコンポーネントは名前の衝突を起こさずejb-ref
要素を同じejb-ref-name
で定義できます。例8.7「ejb-jar.xml 内 ejb-ref 記述子の部分例」 では、ejb-ref
の使用方法を説明するejb-jar.xml
フラグメントを提示しています。例8.7「ejb-jar.xml 内 ejb-ref 記述子の部分例」 にて宣言されているShoppingCartHome
参照にアクセスするためのコード例は、例8.8「ENC ejb-ref アクセスコード」に提供されています。
例8.7 ejb-jar.xml 内 ejb-ref 記述子の部分例
<!-- ... --> <session> <ejb-name>ShoppingCartBean</ejb-name> <!-- ...--> </session> <session> <ejb-name>ProductBeanUser</ejb-name> <!--...--> <ejb-ref> <description>This is a reference to the store products entity </description> <ejb-ref-name>ejb/ProductHome</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <home>org.jboss.store.ejb.ProductHome</home> <remote> org.jboss.store.ejb.Product</remote> </ejb-ref> </session> <session> <ejb-ref> <ejb-name>ShoppingCartUser</ejb-name> <!--...--> <ejb-ref-name>ejb/ShoppingCartHome</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>org.jboss.store.ejb.ShoppingCartHome</home> <remote> org.jboss.store.ejb.ShoppingCart</remote> <ejb-link>ShoppingCartBean</ejb-link> </ejb-ref> </session> <entity> <description>The Product entity bean </description> <ejb-name>ProductBean</ejb-name> <!--...--> </entity> <!--...-->
例8.8 ENC ejb-ref アクセスコード
InitialContext iniCtx = new InitialContext(); Context ejbCtx = (Context) iniCtx.lookup("java:comp/env/ejb"); ShoppingCartHome home = (ShoppingCartHome) ejbCtx.lookup("ShoppingCartHome");
8.6.1.3. jboss.xml
および jboss-web.xml
でのEJB 参照
jboss.xml
EJB 配備記述子はEJB 参照に2通りに作用します。まず、session
の jndi-name
の子要素とentity
要素により、ユーザがEJB ホームインターフェースに対してデプロイメントJNDI 名を指定することができます。EJB に対し jndi-name
をjboss.xml
で指定しない場合、ホームインターフェースは、ejb-jar.xml
ejb-name
値の配下にバインドされます。例えば、例8.7「ejb-jar.xml 内 ejb-ref 記述子の部分例」 にあるShoppingCartBean
のejb-name
を持つセッションEJB では、jboss.xml
jndi-name
の指定がないため、ホームインターフェースはJNDI 名の配下にバインドされます。
ejb-ref
関連のjboss.xml
記述子に関する2つ目の用途は、コンポーネントのENC ejb-ref
の参照先を設定します。ejb-link
要素を使って別の企業アプリケーションにあるEJBを参照することはできません。ご利用中のejb-ref
が外部のEJBにアクセスする必要がある場合、jboss.xml
ejb-ref/jndi-name
要素を使って、配備されたEJB ホームのJNDI 名を指定することができます。
jboss-web.xml
記述子は、Web アプリケーションのENCejb-ref
の参照先を設定するためだけに利用されます。JBoss ejb-ref
のコンテンツモデルは以下の通りです。
- ejb-jar.xml あるいはweb.xml標準記述子内のejb-ref-name 要素に相当する ejb-ref-name 要素。
- デプロイメント環境でEJB ホームインターフェースのJNDI 名を指定する
jndi-name
要素。
jboss.xml
記述子の部分例となっています。
ProductBeanUser
ejb-ref
のリンク先は、jboss/store/ProductHome
のデプロイメント名に設定されます。ProductBean
のデプロイメントJNDI 名は、jboss/store/ProductHome
と設定されます。
例8.9 jboss.xml ejb-ref の部分例
<!-- ... --> <session> <ejb-name>ProductBeanUser</ejb-name> <ejb-ref> <ejb-ref-name>ejb/ProductHome</ejb-ref-name> <jndi-name>jboss/store/ProductHome</jndi-name> </ejb-ref> </session> <entity> <ejb-name>ProductBean</ejb-name> <jndi-name>jboss/store/ProductHome</jndi-name> <!-- ... --> </entity> <!-- ... -->
8.6.1.4. EJB のローカル参照
java:comp/env/ejb
コンテキスト内に、エンタープライズ bean への参照をすべて整理するよう推奨しています。
ejb-local-ref
要素を使って宣言されます。各 ejb-local-ref
要素は、参照されるエンタープライズ bean に対する、参照アプリケーションのインターフェース要件を記述しています。ejb-local-ref
要素には以下の子要素が含まれます。
- 参照の目的を示すオプションのdescription 要素。
- ejb-ref-name 要素で、
java:comp/env
コンテキストに対して相対となる参照名を指定します。推奨のjava:comp/env/ejb
コンテキスト配下に参照を置くには、ejb-ref-name
値に対して、ejb/link-name
形式を使います。 - EJB の種類を指定するejb-ref-type 要素。
Entity
あるいはSession
でなければなりません。 - EJB ローカルホームインターフェースの完全修飾クラス名を提供するlocal-home。
- EJB ローカルインターフェースの完全修飾クラス名を提供するlocal 要素。
ejb-jar
ファイルまたは、同じJ2EE アプリケーションユニット内にある別のエンタープライズ bean への参照にリンクするejb-link要素。ejb-link
値は、参照されたbean のejb-name
となっています。同じejb-name
を持つエンタープライズ bean が複数存在する場合、この値はパス名を使い、参照コンポーネントを含むejb-jar
ファイルの場所を指定します。Application Assembler は、#
で区切られたパス名に参照 bean のejb-name
を付けます。これにより、同名を持つ bean が複数あっても一意に識別できるようになります。JBoss ではejb-link
要素を指定し、ローカル参照と対応するEJBを一致させる必要があります。
ejb-local-ref
要素を含むアプリケーションコンポーネントにスコープ化されます。つまり、EJB ローカル参照は、ランタイム時に他のアプリケーションコンポーネントからアクセスできず、別のアプリケーションコンポーネントは名前の衝突なしに同じejb-ref-name
を持つejb-local-ref
要素を定義する場合があるのです。例8.10「ejb-jar.xml ejb-local-ref 記述子の部分例」では、ejb-local-ref
の用途について例示するejb-jar.xml
のフラグメントが提供されています。例8.11「ENC ejb-local-ref アクセスコード」 のコード例にて、例8.10「ejb-jar.xml ejb-local-ref 記述子の部分例」で宣言されるProbeLocalHome
参照へのアクセスについて例示しています。
例8.10 ejb-jar.xml ejb-local-ref 記述子の部分例
<!-- ... --> <session> <ejb-name>Probe</ejb-name> <home>org.jboss.test.perf.interfaces.ProbeHome</home> <remote>org.jboss.test.perf.interfaces.Probe</remote> <local-home>org.jboss.test.perf.interfaces.ProbeLocalHome</local-home> <local>org.jboss.test.perf.interfaces.ProbeLocal</local> <ejb-class>org.jboss.test.perf.ejb.ProbeBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Bean</transaction-type> </session> <session> <ejb-name>PerfTestSession</ejb-name> <home>org.jboss.test.perf.interfaces.PerfTestSessionHome</home> <remote>org.jboss.test.perf.interfaces.PerfTestSession</remote> <ejb-class>org.jboss.test.perf.ejb.PerfTestSessionBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> <ejb-ref> <ejb-ref-name>ejb/ProbeHome</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>org.jboss.test.perf.interfaces.SessionHome</home> <remote>org.jboss.test.perf.interfaces.Session</remote> <ejb-link>Probe</ejb-link> </ejb-ref> <ejb-local-ref> <ejb-ref-name>ejb/ProbeLocalHome</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local-home>org.jboss.test.perf.interfaces.ProbeLocalHome</local-home> <local>org.jboss.test.perf.interfaces.ProbeLocal</local> <ejb-link>Probe</ejb-link> </ejb-local-ref> </session> <!-- ... -->
例8.11 ENC ejb-local-ref アクセスコード
InitialContext iniCtx = new InitialContext(); Context ejbCtx = (Context) iniCtx.lookup("java:comp/env/ejb"); ProbeLocalHome home = (ProbeLocalHome) ejbCtx.lookup("ProbeLocalHome");
8.6.1.5. リソースマネージャー接続ファクトリの参照
resource-ref
要素により定義されています。Deployer
は、jboss.xml
と jboss-web.xml
記述子を使って、リソースマネージャー接続ファクトリの参照を実際の運用環境にあるリソースマネージャー接続ファクトリにバインドします。
resource-ref
要素は、1つのリソースマネージャー接続ファクトリの参照を記述します。resource-ref
要素は、以下の子要素で構成されます:
- 参照の目的を示すオプションのdescription 要素。
java:comp/env
コンテキストを起点とした参照名を指定するres-ref-name 要素。どのサブコンテキストにres-ref-name
を配置するかを決定するリソースタイプに基づいた命名規則について、次の段落にて説明します。- リソースマネージャー接続ファクトリの完全修飾名を指定するres-type 要素。
- アプリケーションコンポーネントコードがリソースのサインオンをプログラムで実行するか、あるいはコンテナーがデプロイヤー提供の主体マッピング情報に基づいたリソースへサインオンするか示すres-auth 要素。
Application
あるいはContainer
のいずれかでなければなりません。 - 任意のres-sharing-scope 要素。現在、JBoss では対応していません。
- JDBC
DataSource
参照は、java:comp/env/jdbc
のサブコンテキストで宣言する必要があります。 - JMS 接続ファクトリは
java:comp/env/jms
サブコンテキストで宣言する必要があります。 - JavaMail 接続ファクトリは
java:comp/env/mail
サブコンテキストにて宣言する必要があります。 - URL 接続ファクトリは、
java:comp/env/url
サブコンテキストにて宣言する必要があります。
resource-ref
要素の用途を示すweb.xml
記述子のフラグメント例です。例8.13「ENC resource-ref アクセスのサンプルコード」 は、アプリケーションコンポーネントが resource-ref
により宣言されている DefaultMail
リソースへアクセスする際に使うコードを提供しています。
例8.12 web.xml resource-ref 記述子のフラグメント
<web> <!-- ... --> <servlet> <servlet-name>AServlet</servlet-name> <!-- ... --> </servlet> <!-- ... --> <!-- JDBC DataSources (java:comp/env/jdbc) --> <resource-ref> <description>The default DS</description> <res-ref-name>jdbc/DefaultDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <!-- JavaMail Connection Factories (java:comp/env/mail) --> <resource-ref> <description>Default Mail</description> <res-ref-name>mail/DefaultMail</res-ref-name> <res-type>javax.mail.Session</res-type> <res-auth>Container</res-auth> </resource-ref> <!-- JMS Connection Factories (java:comp/env/jms) --> <resource-ref> <description>Default QueueFactory</description> <res-ref-name>jms/QueueFactory</res-ref-name> <res-type>javax.jms.QueueConnectionFactory</res-type> <res-auth>Container</res-auth> </resource-ref> <web>
例8.13 ENC resource-ref アクセスのサンプルコード
Context initCtx = new InitialContext(); javax.mail.Session s = (javax.mail.Session) initCtx.lookup("java:comp/env/mail/DefaultMail");
8.6.1.6. jboss.xml と jboss-web.xml でのリソースマネージャー接続ファクトリの接続
jboss.xml
EJB 配備記述子とjboss-web.xml
Web アプリケーションの配備記述子の目的は、jboss-web.xml
要素により定義された論理名からJBoss でデプロイされるリソースファクトリのJNDI 名へのリンクを提供することです。jboss.xml
あるいはjboss-web.xml
記述子にresource-ref
要素を提供することでリンク可能です。JBoss resource-ref
要素には、以下の子要素が含まれています:
- res-ref-name要素。これは、
ejb-jar.xml
あるいはweb.xml
の標準記述子にある該当のresource-ref
要素のres-ref-name
と一致しなければなりません。 - 任意のres-type 要素。リソースマネージャー接続ファクトリの完全修飾クラス名を指定します。
- jndi-name要素。これは、JBoss にデプロイされるように、リソースファクトリのJNDI 名を指定します。
- res-url要素。これは、
resource-ref
がタイプjava.net.URL
の場合にURL文字列を指定します。
jboss-web.xml
のサンプル記述子を提示しています。このフラグメントでは例8.12「web.xml resource-ref 記述子のフラグメント」にあるresource-ref
要素のサンプルマッピングが示されています。
例8.14 jboss-web.xml resource-ref 記述子の例
<jboss-web> <!-- ... --> <resource-ref> <res-ref-name>jdbc/DefaultDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <jndi-name>java:/DefaultDS</jndi-name> </resource-ref> <resource-ref> <res-ref-name>mail/DefaultMail</res-ref-name> <res-type>javax.mail.Session</res-type> <jndi-name>java:/Mail</jndi-name> </resource-ref> <resource-ref> <res-ref-name>jms/QueueFactory</res-ref-name> <res-type>javax.jms.QueueConnectionFactory</res-type> <jndi-name>QueueConnectionFactory</jndi-name> </resource-ref> <!-- ... --> </jboss-web>
8.6.1.7. リソース環境の参照
resource-env-ref
要素で定義されています。Deployer
は、jboss.xml
と jboss-web.xml
記述子を使うことで、リソース環境の参照を対象の運用環境にある実際の管理オブジェクトの場所にバインドします。
resource-env-ref
要素はそれぞれ、参照される管理オブジェクトに対し参照するアプリケーションコンポーネントが必要とする要件を記述します。resource-env-ref
要素には、以下の子要素が含まれます:
- 参照の目的を示すオプションのdescription 要素。
java:comp/env
コンテキストを起点とした参照名を指定するresource-env-ref-name 要素。規則は関連のリソースファクトリタイプに対応するサブコンテキスト内にその名前を配置します。たとえば、MyQueue
という名前の JMS キュー参照はjms/MyQueue
のresource-env-ref-name
を持っているはずです。- 参照されるオブジェクトの完全修飾クラス名を指定するresource-env-ref-type 要素。例えば、JMS キューの場合、値は
javax.jms.Queue
となります。
resource-ref-env
要素の宣言例を示しています。例8.16「ENC resource-env-ref アクセスコード」 では、resource-env-ref
により宣言されたStockInfo
キューを検索する方法を示すコードを提供しています。
例8.15 ejb-jar.xml resource-env-ref のフラグメント例
<session> <ejb-name>MyBean</ejb-name> <!-- ... --> <resource-env-ref> <description>This is a reference to a JMS queue used in the processing of Stock info </description> <resource-env-ref-name>jms/StockInfo</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type> </resource-env-ref> <!-- ... --> </session>
例8.16 ENC resource-env-ref アクセスコード
InitialContext iniCtx = new InitialContext(); javax.jms.Queue q = (javax.jms.Queue) envCtx.lookup("java:comp/env/jms/StockInfo");
8.6.1.8. リソース環境参照と jboss.xml、jboss-web.xml
jboss.xml
EJB 配備記述子とjboss-web.xml
Web アプリケーションの配備記述子の目的は、resource-env-ref-name
要素により定義された論理名からJBoss でデプロイされる管理オブジェクトのJNDI 名へのリンクを提供することです。jboss.xml
あるいはjboss-web.xml
記述子にresource-env-ref
要素を提供することでリンク可能です。JBoss jboss-web.xml
要素には、以下の子要素が含まれています:
resource-env-ref-name
要素。ejb-jar.xml
あるいはweb.xml
の標準記述子からの該当のresource-env-ref
要素にあるresource-env-ref-name
と一致しなければなりません。- JBoss でデプロイされるようにリソースのJNDI 名を指定する
jndi-name
要素。
StockInfo
resource-env-ref
に関するマッピングサンプルを示すjboss.xml
記述子の例を提供しています。
例8.17 jboss.xml resource-env-ref 記述子のフラグメント例
<session> <ejb-name>MyBean</ejb-name> <!-- ... --> <resource-env-ref> <resource-env-ref-name>jms/StockInfo</resource-env-ref-name> <jndi-name>queue/StockInfoQueue</jndi-name> </resource-env-ref> <!-- ... --> </session>