J2EEアプリケーションで、アプリケーション・サーバー独自の機能にアクセスして活用すれば、単にJ2EEの機能を利用する以上の力を手に入れられます。アプリケーション・サーバーの拡張機能を作ることさえ可能になります。
このサンプル・アプリケーションはGeronimoに定義されている全てのデータベース・コネクションをリストするものです。既存のスキーマやテーブルもリストできますし、コネクションのいずれかを選んでデータベースへの接続をテストすることもできます。更に、リストされたテーブルのレコードを見ることもできます。
この記事を読み終えれば、貴方はアプリケーションからGeronimo固有のリソースにアクセスし、効率的にそれらを使用できるようになります。
この記事は以下のセクションから構成されています。
アプリケーションの概要
この記事で扱うサンプル・アプリケーションを使えば、Geronimoサーバーにデプロイされたデータベースのコネクション・プールをテストすることができます。この機能はGeronimo管理コンソールの拡張機能と見做すこともできます。なぜなら、現在のバージョンでは、データベース・プールがデプロイされた後にコネクションをテストする機能は含まれていないからです。
以下の図でアプリケーションの流れを説明します。
アプリケーションのウエルカム・ページはgeronimoアプリケーション・サーバーにデプロイされているデータベースのコネクション・プールのリストを表示する掲示板のような役割を果たします。一番目のページからコネクション・プールのテストをすることができます。特定のコネクション・プールがコネクションを取得するためにユーザー名とパスワードを要求する場合は、表示されるポップアップ・ウインドウに詳細を入力してください。データベース中のコネクション・プールに関連付けられたのスキーマとテーブルのリストは Schemas and Tables ページに表示されます。そのページからテーブルの中身にアクセスすることができます。
アプリケーションのコンテンツ
インベントリー・アプリケーションは以下のパッケージから構成されています。
- org.apache.geronimo.samples.dbtester.beans
- DBManagerBean - (Geronimoカーネルへのアクセスを含む)殆どのアプリケーション・ロジックを扱うアプリケーションの心臓部です。
- org.apache.geronimo.samples.dbtester.web
- ContentTableServlet - データベースのテーブルからコンテンツを入手し、それらをプレゼンテーション層に渡します。
- ListTablesServlet - データベース・プールに関連付けられているスキーマとテーブル群のリストを入手します。
下記はこのアプリケーションのwebアプリケーション・ファイルのリストです。
|- jsp |- common_error.jsp |- popup.jsp |- table_content.jsp |- table_list.jsp |- WEB-INF |- geronimo-web.xml |- web.xml |- index.jsp
geronimo-web.xml はWebアプリケーションのクラスローダーへロードされる際の依存関係のリストを定義するものです。今回は、特に依存関係はありません。特定のプロジェクトに関する情報(例えば、モジュールのユニークな識別子や、何らかの依存関係など)は<environment>タグの内側に記述します。後で他のデプロイされるアプリケーションから参照しやすくするために、このモジュールにユニークな識別子のようなものを付与するのは良い考えです。このモジュールはorg.apache.geronimo.samples.dbtester グループに所属しています。<context-root>タグで記述されたパスがこのWebアプリケーションをアクセスする際のURLの最初のセグメントになります。つまり、このアプリケーションへアクセスするためのURLは http://<hostname>:<port>/dbtester となります。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2"> <environment> <moduleId> <groupId>${pom.groupId}</groupId> <artifactId>${pom.artifactId}</artifactId> <version>${version}</version> <type>war</type> </moduleId> </environment> <context-root>/dbtester</context-root> </web-app>
最終的なWARの構造は下記のようになります。
|- WEB-INF |- classes |- org |- apache |- geronimo |- samples |- dbtester |- web.xml |- geronimo-web.xml
web.xml でプレゼンテーション層とサービス層を結ぶコントロール層として機能する2つのサーブレットを定義しています。
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <description>dbtester Servlet Sample</description> <servlet> <display-name>ContentTableServlet</display-name> <servlet-name>ContentTableServlet</servlet-name> <servlet-class>org.apache.geronimo.samples.dbtester.web.ContentTableServlet</servlet-class> </servlet> <servlet> <display-name>ListTablesServlet</display-name> <servlet-name>ListTablesServlet</servlet-name> <servlet-class>org.apache.geronimo.samples.dbtester.web.ListTablesServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ContentTableServlet</servlet-name> <url-pattern>/listContent</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ListTablesServlet</servlet-name> <url-pattern>/listTables</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
このアプリケーションでの重要なポイントは、どのようにしてGeronimo カーネルへアクセスしデプロイされているデータベース・プールのリストを入手するか、です。このタスクはDBManagerBean クラスで実装されています。
private void init(){ Kernel kernel = KernelRegistry.getSingleKernel(); Set cfList = kernel.listGBeans(new AbstractNameQuery(ConnectionFactorySource.class.getName())); for(Iterator iterator = cfList.iterator();iterator.hasNext();){ AbstractName name = (AbstractName)iterator.next(); try { Object rs = kernel.invoke(name, "$getResource", new Object[]{}, new String[]{}); if(rs instanceof javax.sql.DataSource){ DataSource ds = (DataSource)rs; poolMap.put(name.getArtifact().getArtifactId(), ds); } } catch (GBeanNotFoundException e) { e.printStackTrace(); } catch (NoSuchOperationException e) { e.printStackTrace(); } catch (InternalKernelException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
アプリケーションは、JDBCドライバーが提供しているメタデータを利用すればスキーマとそのスキーマに所属するテーブルのリストを入手することができます。データに関係するレコードを入手し、データベースのコンテンツを表示するためにはResultSetメタデータを使います。以下のコード抜粋はDataSourceからスキーマとテーブルを入手する方法を示しています。
public Map getTableList(String poolName) throws SQLException { tableMap = new HashMap(); if(poolMap.containsKey(poolName)){ DataSource ds = (DataSource)poolMap.get(poolName); Connection con = null; try { con = ds.getConnection(); DatabaseMetaData metaData = con.getMetaData(); String[] tableTypes = {"TABLE"}; ResultSet rs = metaData.getTables(null, null, null, tableTypes); while(rs.next()){ String schemaName = rs.getString("TABLE_SCHEM"); String tableName = rs.getString("TABLE_NAME"); ArrayList tableList = null; if(tableMap.containsKey(schemaName)){ tableList = (ArrayList)tableMap.get(schemaName); tableList.add(tableName); }else { tableList = new ArrayList(); tableList.add(tableName); } tableMap.put(schemaName, tableList); } } catch (SQLException e) { throw e; }finally { if(con != null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } return tableMap; }
利用ツール
このDB Listサンプル・アプリケーションを開発・ビルドするために使用したツールは以下の通りです。
Eclipse
このサンプル・アプリケーションの開発にはEclipse IDEを使用しました。Eclipse IDEはとてもパワフルで広く知られたオープンソースの開発ツールです。Geronimoアプリケーション・サーバー用の統合プラグインも利用可能になっています。Eclipseは http://www.eclipse.org からダウンロードできます。
Apache Maven 2
MavenはエンタープライズJavaプロジェクト向けのとてもよく知られたオープンソースのビルドツールで、ビルド・プロセスでの様々な面倒な作業を任せられるように設計されています。Mavenはプロジェクト構造とその中身を記述するという宣言的アプローチを採用しており、その点がAntや従来型のmakeで採用しているタスク・ベースのアプローチとは異なります。この特長により全社的な開発標準の適用を徹底しやすいですし、スクリプトを作成・保守する手間も減らせます。Maven1で採用されていた宣言的なライフサイクル・ベースのアプローチは、伝統的なビルド方法からラジカルに決別するものでしたが、Maven2はこの点を更に推し進めたもにになっています。Maven2は http://maven.apache.org からダウンロードできます。
サンプル・アプリケーションのビルドとデプロイ
dbtesterアプリケーションを以下のリンクからダウンロードしてください。
上記のzipファイルを解凍すると dbtester ディレクトリーが作られます。
ソース・コード
このサンプルのソースコードはSVNからチェックアウトできます。
svn checkout http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/dbtester
ビルド
dbtester アプリケーションはユーザーがソースコードからのビルドを行いやすくするためにMaven2の pom.xml
と共に配布されています。コマンド・プロンプトのウインドウを開き、dbtester ディレクトリーに移動して mvn clean install コマンドを入力してください。すると dbtester の下の target フォルダーに dbtester-war-2.0-SNAPSHOT.war ファイルが作られます。これで dbtester WebアプリケーションをGeronimoアプリケーション・サーバーにデプロイする準備ができました。
デプロイ
サンプル・アプリケーションのデプロイは非常に簡単で、Geronimo管理コンソールから行います。
- Console Navigation パネルから Deploy New リンクをたどります。
- Archive の入力ボックスで dbtester/target フォルダーの dbtester-war-2.0-SNAPSHOT.war ファイルを指定します。
- Install ボタンを押し、サーバーにアプリケーションをデプロイします。
サンプル・アプリケーションのテスト
サンプル・アプリケーションをテストするには、ブラウザーを開いて http://localhost:8080/dbtester とタイプします。dbtesterアプリケーションのインデックス・ぺージがロードされ、Geronimoにデプロイされているデータベース・プールのリストが一覧形式で表示されます。
このサンプル・アプリケーションはデータベース・プールを直接テストすることができます。更に、データベースの中身をリストすることもできます。
サマリー
この記事ではJ2EEアプリケーションからGeronimo関連の機能にアクセスする方法を示しました。これらの機能を作り上げるためのサンプル・アプリケーションのビルド、デプロイ、テストの方法を、順を追って試してみました。このサンプル・アプリケーションはGeronimoにデプロイされたデータベース・コネクションの確認用に使うこともできます。