- はじめに
- アプリケーション・コンポーネントのネームスペース
- リソースの定義
- データソース リソース
- メッセージング・コネクタ・ファクトリ リソース
- メッセージング・デスティネーション リソース
- メール・セッション リソース
- コネクション・ファクトリ リソース
- 管理対象オブジェクト リソース
はじめに
データソースやJMSといったリソースの(アプリケーションサーバに依存しない) Jakarta EE 仕様内の定義方法まとめです。
アプリケーション・コンポーネントのネームスペース
リソースを定義する際には、そのスコープを考慮する必要があります。最初にアプリケーション・コンポーネントのスコープについて見ておきましょう。
アプリケーション・コンポーネントは4つの名前空間があり、それぞれ異なるスコープが定義されています。
java:comp
- enterprise bean などのコンポーネント毎の名前空間で、コンポーネントを跨いで共有されない
- ただし、Webモジュール内のコンポーネントは独自の名前空間は持たず、共有される。これは歴史的な互換性維持のための仕様であり、Webモジュールでは
java:comp
とjava:module
は区別されない
java:module
- モジュール内のすべてのコンポーネントで共有される
- 例えば、単一の enterprise bean モジュール内の enterprise bean や、web モジュール内の全てのコンポーネントで共有される
java:app
- 単一のアプリケーション(ear などの単一のデプロイ単位)内のコンポーネントで共有される
java:global
- アプリケーションサーバにデプロイされた全てのアプリケーションで共有される
- サーバインスタンスで共有(複数サーバから成るクラスタ間を含む)
リソース参照およびリソース定義のJNDI名前空間のデフォルト値は、 java:comp/env
です。一部のコンテキストは java:comp
や java:module
名前空間で定義することができないものがあり、その場合はデプロイエラーとなります。
application.xml 記述子で宣言する環境項目は、java:app
または java:global
の JNDI 名を指定する必要があります(java:app/env/myString
または java:global/someValue
など)。
リソース定義で使用するJNDI名は、上記コンポーネントのネームスペースを把握した上で設定してください。多くの場合 java:app
で定義することになるでしょう。
リソースの定義
代表的なリソースは、web.xml
や ejb-jar.xml
、application.xml
、application-client.xml
といったデプロイメント記述子で定義できる他、以下のアノテーションを利用して定義できます。
@DataSourceDefinition
: data-source 要素@JMSConnectionFactoryDefinition
: jms-connection-factory 要素@JMSDestinationDefinition
: jms-destination 要素@MailSessionDefinition
: mail-session 要素@ConnectionFactoryDefinition
: connection-factory 要素@AdministeredObjectDefinition
: administered-object 要素
これらのアノテーションで定義したリソース定義は、アプリケーションのデプロイ時に、デプロイメント記述子で上書きすることができるため、開発時に便利です。
アノテーションは、サーブレットや enterprise bean などのコンテナ管理クラスに付与することで有効化されます。
上記アノテーションは、いずれも、末尾に s を付けたアノテーションで、リソースを複数定義することもできます(例えば @DataSourceDefinitions
など)
データソース リソース
デプロイメント記述子で以下の例のように定義できます。
<data-source> <name>java:app/MyDataSource</name> <class-name>com.example.MyDataSource</class-name> <server-name>myserver.com</server-name> <port-number>6689</port-number> <database-name>myDatabase</database-name> <user>lance</user> <password>secret</password> </data-source>
@DataSourceDefinition
アノテーションを使用して定義することもできます。
@DataSourceDefinition( name="java:app/MyDataSource", className="com.example.MyDataSource", portNumber=6689, serverName="myserver.com", user="lance", password="secret")
persistence.xml を含めた定義例は以下を参照してください(Jakarta EE の場合は、javax
-> jakarta
へのネームスペースの読み替えが必要です)。
Jakarta EE Platform 仕様では、デフォルトのデータソース提供が課せられています。
ですので、データソース定義をせずとも、デフォルトのデータソースに java:comp/DefaultDataSource
というJNDI名でアクセスすることができます。
メッセージング・コネクタ・ファクトリ リソース
デプロイメント記述子で以下の例のように定義できます。
<jms-connection-factory> <name>java:app/MyJMSCF</name> <interface-name>jakarta.jms.QueueConnectionFactory</interface-name> <resource-adapter>myJMSRA</resource-adapter> </jms-connection-factory>
@JMSConnectionFactoryDefinition
アノテーションを使用して定義することもできます。
@JMSConnectionFactoryDefinition( name="java:app/MyJMSCF", interfaceName="jakarta.jms.QueueConnectionFactory", resourceAdapter="myJMSRA")
Jakarta EE Platform 仕様では、デフォルトのメッセージング・コネクタ・ファクトリ提供が課せられています。
ですので、データソース定義をせずとも、デフォルトのメッセージング・コネクタ・ファクトリに *java:comp/DefaultJMSConnectionFactory*
というJNDI名でアクセスすることができます。
メッセージング・デスティネーション リソース
デプロイメント記述子で以下の例のように定義できます。
<jms-destination> <name>java:app/MyJMSDestination</name> <interface-name>jakarta.jms.Queue</interface-name> <resource-adapter>myJMSRA</resource-adapter> <destination-name>myQueue1</destination-name> </jms-destination>
@JMSDestinationDefinition
アノテーションを使用して定義することもできます。
@JMSDestinationDefinition( name="java:app/MyJMSQueue", interfaceName="jakarta.jms.Queue", destinationName="myQueue1")
メール・セッション リソース
デプロイメント記述子で以下の例のように定義できます。
<mail-session> <name>java:app/mail/MySession</name> <store-protocol>imap</store-protocol> <transport-protocol>smtp</transport-protocol> <host>somewhere.myco.com</host> <user>linda</user> <password>secret</password> <from>some.body@myco.com</from> </mail-session>
@MailSessionDefinition
アノテーションを使用して定義することもできます。
@MailSessionDefinition( name="java:app/mail/MySession", host="somewhere.myco.com", from="some.body@myco.com")
コネクション・ファクトリ リソース
デプロイメント記述子で以下の例のように定義できます。
<connection-factory> <name>java:app/myConnectionFactory</name> <interface-name>com.eis.ConnectionFactory</interface-name> <resource-adapter>MyEISRA</resource-adapter> </connection-factory>
@ConnectionFactoryDefinition
アノテーションを使用して定義することもできます。
@ConnectionFactoryDefinition( name="java:app/myConnectionFactory", interfaceName="com.eis.ConnectionFactory", resourceAdapter="MyESRA")
管理対象オブジェクト リソース
リソースアダプタ固有の情報を管理する管理対象オブジェクトは、デプロイメント記述子で以下の例のように定義できます。
<administered-object> <name>java:app/MyAdminObject</name> <class-name>com.extraServices.AdminObject</class-name> <resource-adapter>myESRA</resource-adapter> </administered-object>
@AdministeredObjectDefinition
アノテーションを使用して定義することもできます。
@AdministeredObjectDefinition( name="java:app/myAdminObject", className="com.extraServices.AdminObject", resourceAdapter="myESRA")