Application Scoped Resources
前回まででは、リソースをサーバに設定していました。これにより、サーバ上のアプリケーションから共通的にリソースを利用できるようになります。
しかしアプリケーションのデプロイやアンデプロイを繰り返していると不要なリソースが残ってしまいます。JavaEE6では以下のようなアプリケーション・コンポーネント・ネームスペースで以下のスコープが定義されています。
- java:comp : コンポーネントのネームスペース
- java:module : ejb-jar.xmlで定義されている全てのEJBモジュールで共有されるネームスペース
- java:app : アプリケーションの全てのモジュール(EJBコンポーネントやWebコンポーネントなどが含まれるear)で共有されるネームスペース
- java:global : サーバのアプリケーション全てで共有されるネームスペース
このスコープ定義とともにリソースを定義すると、アプリケーションのデプロイやアンデプロイに応じて自動的にリソースの作成や破棄が行われます。
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.xml で java:global などと定義すると、エラーとなってデプロイできません。
processing glassfish-resources.xml(s) in the archive -- リソース[ java:global/SampleWebAppPool ]にスコープ[ java:global/ ]を指定することはできません。 このリソースが受け入れる範囲は[ java:app/ ]です。詳細はserver.logを参照してください。