こちらのシンプルな EJB を使用して、EJB クライアントと EJB の関係とその定義のしかたを見ていきたいと思います。
今回はさらに話をシンプルにするために Web クライアント (JSP) の方しかデプロイしていないものを使用しています。
まず Web コンポーネントを格納している WAR ファイルの WEB-INF/web.xml の内容です。
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> <display-name>ConverterWAR</display-name> <servlet> <servlet-name>index</servlet-name> <display-name>index</display-name> <jsp-file>/index.jsp</jsp-file> </servlet> <session-config> <session-timeout>30</session-timeout> </session-config> <ejb-ref> <ejb-ref-name>ejb/TheConverter</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>ConverterHome</home> <remote>Converter</remote> </ejb-ref> </web-app> |
以下の <ejb-ref> セクションで、この Web クライアント (JSP ファイル) の中で、ある EJB を使用しようとする時に予定している名前と、その時に返ってくると予定しているホームインターフェイスとリモートインターフェイスを指定しています。
<ejb-ref>
<ejb-ref-name>ejb/TheConverter</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>ConverterHome</home>
<remote>Converter</remote>
</ejb-ref>
EJB を呼び出すクライアントは、実際に EJB がどういう環境に配備され、どういう
JNDI 名でルックアップできるようになるかはわかりません。
しかし、JNDI 名をルックアップしないと EJB をアクセスすることができないため、いわばハードコードしてしまっています。これはもう静的(Static)に埋め込まれてしまっているので、あとで動的に変更する、ということができるものでもありません。
META-INF/web.xml上で定義されているのは、あくまでこのコンポーネントを使用する人に対して、この中にはこういうものがあって、どういう仕様になっているか、ということです。言ってみれば取扱説明書みたいなものですね。
ここでも、この名前で JNDI ルックアップを行い、こういう EJB (タイプ、ホームインターフェイス、リモートインターフェイス)
を使おうと思っています、ということを公開しています。
こちらが Web コンポーネントから呼び出される EJB の META-INF/ejb-jar.xml です。
こちらは EJB の仕様の記述ということで、ejb-jar ファイルの名前とその中に入っている EJB の属性 (名前、タイプ、ホームインターフェイス、リモートインターフェイス、セキュリティなど) を定義しています。こちらも取扱説明書みたいなものです。
この EJB をどういう JNDI 名で呼び出せるようにするかはアプリケーション・アセンブラーまたはデプロイヤーのお仕事、ということになります。ですので、ここの記述にはありません。
つまり、先の Web コンポーネントはいわば勝手に「ejb/TherConverter」を呼んでいるが、この EJB がどういうように呼ばれるかはここの記述にはない、ということになります。Web コンポーネントはどうやってこの EJB にたどりつくのでしょうか?!
| <?xml version="1.0" encoding="UTF-8"?> <!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> <display-name>ConverterJAR</display-name> <enterprise-beans> <session> <display-name>ConverterBean</display-name> <ejb-name>ConverterBean</ejb-name> <home>ConverterHome</home> <remote>Converter</remote> <ejb-class>ConverterBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Bean</transaction-type> <security-identity> <description></description> <use-caller-identity></use-caller-identity> </security-identity> </session> </enterprise-beans> </ejb-jar> |
こうした Web コンポーネント(WAR ファイル)/EJB コンポーネント(JAR ファイル)にまとめ、ディスクリプターを記述/生成するのは
Bean デベロッパーのお仕事ということになっています。
実際、Bean を開発した当事者が公開してくれないとわからないものではありますからね。
Web コンポーネント(WAR ファイル)/EJB コンポーネント(JAR ファイル)をまとめたものが、アプリケーションと呼ばれ、拡張子
.ear のファイルになります。
この EAR ファイルには META-INF/application.xml というものがあり、これが
EJB アプリケーション (EAR ファイル) に含まれている ejb-jar ファイルと WAR
ファイルを定義しています。
また、WAR ファイルについてはコンテキスト・ルートの設定もここで定義されています。ここの設定で
/Converter/ というコンテキストでアクセスできるようになっています。
このように個々の Web コンポーネントや EJB コンポーネントをまとめて、ひとつのアプリケーションにするのはアプリケーション・アセンブラーのお仕事ということになります。
また、アプリケーション・アセンブラーが ejb-jar.xml の中の ejb-link や security-role-link などを編集/追加して、アプリケーションに含まれる EJB コンポーネント同士の依存関係を修正することがあります。
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'> <application> <display-name>ConverterApp</display-name> <description></description> <module> <ejb>ejb-jar-ic.jar</ejb> </module> <module> <web> <web-uri>war-ic.war</web-uri> <context-root>Converter</context-root> </web> </module> </application> |
次にまとめられたアプリケーションに対して、これを実行環境に配備する、という仕事があります。
これがデプロイヤーと言われる人のお仕事になります。
なんにせよ、「実際に実行できるようにする」というのがこのデプロイヤーという人のお仕事なので、実際にはセキュリティなどのいろいろな実行環境とのマッピングがあり、たいへんお仕事になります。
基本的には「アプリケーション」まではいわゆる「論理的」に整合したものであり、この「デプロイメント」のフェイズで実環境との整合が図られるわけです。
また、そういう意味では「アプリケーション」はある実行環境に特化していることはなく、ここである実行環境固有の設定や状況が現れるわけです。
デプロイメント・ツールを使って変更を行った ear ファイルの中には META-INF/sun-j2ee-ri.xml
というものがあり、ここに <j2ee-ri-specific-information> というセクションがあります。
まさしく J2EE RI に Specific な情報がここでまとめられている、というわけです。
ちなみに、このファイルは名前からわかるように Sun J2EE RI 固有のものとなっています。
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE j2ee-ri-specific-information PUBLIC '-//Sun Microsystems Inc.//DTD J2EE Reference Implementation 1.3//EN' 'http://localhost:8000/sun-j2ee-ri_1_3.dtd'> <j2ee-ri-specific-information> <rolemapping /> <web> <module-name>war-ic.war</module-name> <context-root>Converter</context-root> <ejb-ref> <ejb-ref-name>ejb/TheConverter</ejb-ref-name> <jndi-name>MyConverter</jndi-name> </ejb-ref> </web> <enterprise-beans> <module-name>ejb-jar-ic.jar</module-name> <unique-id>0</unique-id> <ejb> <ejb-name>ConverterBean</ejb-name> <jndi-name>MyConverter</jndi-name> <ior-security-config> <transport-config> <integrity>supported</integrity> <confidentiality>supported</confidentiality> <establish-trust-in-target>supported</establish-trust-in-target> <establish-trust-in-client>supported</establish-trust-in-client> </transport-config> <as-context> <auth-method>username_password</auth-method> <realm>default</realm> <required>false</required> </as-context> <sas-context> <caller-propagation>supported</caller-propagation> </sas-context> </ior-security-config> <gen-classes /> </ejb> </enterprise-beans> </j2ee-ri-specific-information> |
このファイルの中で、Web からアクセスしている ejb/TherConverter という名前を MyConverter という JNDI名に割り当て、同時に対象となる EJB にも MyConverter という JNDI名を割り当てています。この MyConverter という JNDI名を仲介として、やっと Web コンポーネントと EJB は会えるようになっています。
<web>
<module-name>war-ic.war</module-name>
<context-root>Converter</context-root>
<ejb-ref>
<ejb-ref-name>ejb/TheConverter</ejb-ref-name>
<jndi-name>MyConverter</jndi-name>
</ejb-ref>
</web>
<enterprise-beans>
<module-name>ejb-jar-ic.jar</module-name>
<unique-id>0</unique-id>
<ejb>
<ejb-name>ConverterBean</ejb-name>
<jndi-name>MyConverter</jndi-name>
結局、現在の J2EE の仕様では、このデプロイヤーのする仕事を表現する記述ファイルがないため、各J2EE サーバー実装には必ずベンダー固有のこういったファイルがあります。たとえば JBOSS の場合は jboss.xml とか jboss-web.xml といったファイルを使用しています。
|
|