glassfish へのリソース設定はリソースファイルを使うべし その3


Application Scoped Resources

前回まででは、リソースをサーバに設定していました。これにより、サーバ上のアプリケーションから共通的にリソースを利用できるようになります。
しかしアプリケーションのデプロイやアンデプロイを繰り返していると不要なリソースが残ってしまいます。JavaEE6では以下のようなアプリケーション・コンポーネント・ネームスペースで以下のスコープが定義されています。


このスコープ定義とともにリソースを定義すると、アプリケーションのデプロイやアンデプロイに応じて自動的にリソースの作成や破棄が行われます。


glassfish-resources.xml の配備例

ear
  -> META-INF
      -> application.xml
      -> glassfish-resources.xml [アプリケーションスコープ(java:app)]
  -> web-module
      -> WEB-INF
          -> web.xml
          -> glassfish-web.xml
          -> glassfish-resources.xml [モジュールスコープ(java:module)]
  -> ejb-module  
      -> META-INF
          -> ejb-jar.xml
          -> glassfish-ejb-jar.xml
          -> glassfish-resources.xml [モジュールスコープ(java:module)]

WebアプリケーションによるApplication Scoped Resourcesの設定

以下のような glassfish-resources.xml をWEB-INFに作成

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
  <jdbc-connection-pool
      name="java:app/SampleWebAppPool"
      datasource-classname="org.apache.derby.jdbc.ClientDataSource"
      res-type="javax.sql.DataSource">
    <property name="URL" value="jdbc:derby://localhost:1527/sample"/>
    <property name="serverName" value="localhost"/>
    <property name="PortNumber" value="1527"/>
    <property name="DatabaseName" value="sample"/>
    <property name="User" value="app"/>
    <property name="Password" value="app"/>
  </jdbc-connection-pool>

  <jdbc-resource enabled="true"
                 jndi-name="java:app/jdbc/SampleWebAppDs"
                 object-type="user"
                 pool-name="java:app/SampleWebAppPool">
    <description/>
  </jdbc-resource>

</resources>

各リソースの名前にjava:app/を付与している点に注意


persistence.xml でも java:app/ を付けて指定。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="SampleWebAppPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:app/jdbc/SampleWebAppDs</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>


この状態でデプロイするとアプリケーションスコープのリソースが定義されます。

スコープ定義を省略すると、

前述の例では java:app/ を付けてスコープ定義をしましたが、Webアプリケーションの場合は WEB-INF に glassfish-resources.xml を配置しておけば、勝手に java:app スコープとしてリソース反映されます。



java:app が付与されていますね。


ただし、WEB-INF 内の glassfish-resources.xmljava:global などと定義すると、エラーとなってデプロイできません。

processing glassfish-resources.xml(s) in the archive  -- リソース[ java:global/SampleWebAppPool ]にスコープ[ java:global/ ]を指定することはできません。
このリソースが受け入れる範囲は[ java:app/ ]です。詳細はserver.logを参照してください。