Jakarta EE(Java EE) のリソース定義方法まとめ

f:id:Naotsugu:20211220205917p:plain


はじめに

データソースやJMSといったリソースの(アプリケーションサーバに依存しない) Jakarta EE 仕様内の定義方法まとめです。


アプリケーション・コンポーネントのネームスペース

リソースを定義する際には、そのスコープを考慮する必要があります。最初にアプリケーション・コンポーネントのスコープについて見ておきましょう。

アプリケーション・コンポーネントは4つの名前空間があり、それぞれ異なるスコープが定義されています。

  • java:comp

    • enterprise bean などのコンポーネント毎の名前空間で、コンポーネントを跨いで共有されない
    • ただし、Webモジュール内のコンポーネントは独自の名前空間は持たず、共有される。これは歴史的な互換性維持のための仕様であり、Webモジュールでは java:compjava:module は区別されない
  • java:module

    • モジュール内のすべてのコンポーネントで共有される
    • 例えば、単一の enterprise bean モジュール内の enterprise bean や、web モジュール内の全てのコンポーネントで共有される
  • java:app

    • 単一のアプリケーション(ear などの単一のデプロイ単位)内のコンポーネントで共有される
  • java:global

    • アプリケーションサーバにデプロイされた全てのアプリケーションで共有される
    • サーバインスタンスで共有(複数サーバから成るクラスタ間を含む)

リソース参照およびリソース定義のJNDI名前空間のデフォルト値は、 java:comp/env です。一部のコンテキストは java:compjava:module 名前空間で定義することができないものがあり、その場合はデプロイエラーとなります。

application.xml 記述子で宣言する環境項目は、java:app または java:global の JNDI 名を指定する必要があります(java:app/env/myString または java:global/someValue など)。


リソース定義で使用するJNDI名は、上記コンポーネントのネームスペースを把握した上で設定してください。多くの場合 java:app で定義することになるでしょう。


リソースの定義

代表的なリソースは、web.xmlejb-jar.xmlapplication.xmlapplication-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 へのネームスペースの読み替えが必要です)。

blog1.mammb.com

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")