Interstage Business Application Server V9.2.0 オープン Java フレームワークユーザーズガイド Windows/Solaris/Linux B1X1-0015-02Z0(00) 2009 年 11 月
まえがき 本書の目的 本書は Interstage Business Application Server オープン Java フレームワークユーザーズガイド です 本書は Interstage Business Application Server が提供するオープン Java フレームワークについて説明します 本書は 以下の方を対象にしています システム構築担当者 アプリ開発者 運用設計者 前提知識本書を読む場合 以下の知識が必要です 使用するOSに関する基本的な知識 Javaに関する基本的な知識 J2EEに関する基本的な知識 インターネットに関する基本的な知識 リレーショナルデータベースに関する基本的な知識 Interstage Application Serverに関する基本的な知識 Interstage Studioに関する以下の知識 - Webアプリケーション開発 Strutsに関する基本的な知識 Spring Frameworkに関する基本的な知識 ibatisに関する基本的な知識 TERASOLUNAに関する基本的な知識 本書の構成 本書は 以下のように構成されています 第 1 章概要 Interstage Business Application Server が提供するオープン Java フレームワークの概要について説明します 第 2 章 Struts Struts を使用した Web アプリケーションの開発について説明します 第 3 章 Spring Framework Spring Framework を使用した業務アプリケーションの開発について説明します 第 4 章 ibatis ibatis を使用したデータアクセス層のアプリケーションの開発について説明します 第 5 章 TERASOLUNA TERASOLUNA を使用したアプリケーションの開発について説明します 第 6 章オープン Java フレームワークにおけるログ機能の利用オープン Java フレームワークにおけるログ機能の利用について説明します 第 7 章標準ログサーバアプリケーションの開発における操作について説明します 第 8 章バックアップ リストアおよびクラスタバックアップ リストアおよびクラスタの利用について説明します 付録 A TERASOLUNA のサンプルアプリケーション TERASOLUNA アプリケーションのサンプルの作成方法および 動作方法を説明します - i -
付録 B 謝辞 免責文 ライセンス文オープン Java フレームワークに関わる謝辞 免責文そしてライセンス文について記載しています 製品名称 本書では 以下の製品名称を略称で表記しています 製品名称 Microsoft(R) Windows(R) 2000 Professional Microsoft(R) Windows(R) 2000 Server Microsoft(R) Windows(R) 2000 Advanced Server Microsoft(R) Windows Server(R) 2003, Standard Edition Microsoft(R) Windows Server(R) 2003 R2, Standard Edition Microsoft(R) Windows Server(R) 2003, Enterprise Edition Microsoft(R) Windows Server(R) 2003 R2, Enterprise Edition Microsoft(R) Windows Server(R) 2003, Standard x64 Edition Microsoft(R) Windows Server(R) 2003 R2, Standard x64 Edition Microsoft(R) Windows Server(R) 2003, Enterprise x64 Edition Microsoft(R) Windows Server(R) 2003 R2, Enterprise x64 Edition Microsoft(R) Windows Server(R) 2008 Standard Microsoft(R) Windows Server(R) 2008 Standard without Hyper-V Microsoft(R) Windows Server(R) 2008 Enterprise Microsoft(R) Windows Server(R) 2008 Enterprise without Hyper-V Microsoft(R) Windows Server(R) 2008 Datacenter Microsoft(R) Windows Server(R) 2008 Datacenter without Hyper-V Microsoft(R) Windows Server(R) 2008 R2 Foundation Microsoft(R) Windows Server(R) 2008 R2 Standard Microsoft(R) Windows Server(R) 2008 R2 Enterprise Microsoft(R) Windows Server(R) 2008 R2 Datacenter Microsoft(R) Windows Server(R) 2008 R2 for Itanium-Based Systems Microsoft(R) Windows(R) XP Professional x64 Edition Microsoft(R) Windows(R) XP Home Edition Microsoft(R) Windows(R) XP Professional Windows Vista(R) Ultimate Windows Vista(R) Business Windows Vista(R) Home Premium Windows Vista(R) Home Basic Windows Vista(R) Enterprise Windows(R) 7 Ultimate Windows(R) 7 Enterprise Windows(R) 7 Professional および Windows(R) 7 Home Premium Microsoft(R) Windows(R) 2000 Advanced Server Microsoft(R) Windows(R) 2000 Server および Microsoft(R) Windows(R) 2000 Professional Microsoft(R) Windows(R) XP Professional x64 Edition Microsoft(R) Windows(R) XP Professional および Microsoft(R) Windows(R) XP Home Edition Windows Vista(R) Ultimate Windows Vista(R) Business Windows Vista(R) Home Premium Windows Vista(R) Home Basic および Windows Vista(R) Enterprise Microsoft(R) Windows Server(R) 2003, Standard Edition Microsoft(R) Windows Server(R) 2003 R2, Standard Edition Microsoft(R) Windows Server(R) 2003, Enterprise Edition Microsoft(R) Windows 略称 Windows Windows 2000 Windows XP Windows Vista Windows Server 2003またはWindows Server - ii -
製品名称 Server(R) 2003 R2, Enterprise Edition Microsoft(R) Windows Server(R) 2003, Standard x64 Edition Microsoft(R) Windows Server(R) 2003 R2, Standard x64 Edition Microsoft(R) Windows Server(R) 2003, Enterprise x64 Edition および Microsoft(R) Windows Server(R) 2003 R2, Enterprise x64 Edition Microsoft(R) Windows Server(R) 2008 Standard Microsoft(R) Windows Server(R) 2008 Standard without Hyper-V Microsoft(R) Windows Server(R) 2008 Enterprise Microsoft(R) Windows Server(R) 2008 Enterprise without Hyper-V Microsoft(R) Windows Server(R) 2008 Datacenter Microsoft(R) Windows Server(R) 2008 Datacenter without Hyper-V Microsoft(R) Windows Server(R) 2008 R2 Foundation Microsoft(R) Windows Server(R) 2008 R2 Standard Microsoft(R) Windows Server(R) 2008 R2 Enterprise Microsoft(R) Windows Server(R) 2008 R2 Datacenter および Microsoft(R) Windows Server(R) 2008 R2 for Itanium-Based Systems Windows(R) 7 Ultimate Windows(R) 7 Enterprise Windows(R) 7 Professional および Windows(R) 7 Home Premium Solaris(TM) オペレーティングシステム 略称 Windows Server 2008 または Windows Server Windows 7 Solaris Solaris(TM) 9 オペレーティングシステム Solaris 9 Solaris(TM) 10 オペレーティングシステム Solaris 10 Red Hat Enterprise Linux AS v.4 および Red Hat Enterprise Linux 5 Java 2 SDK, Standard Edition および Java Development Kit Java 2 Runtime Environment, Standard Edition および Java Runtime Environment Oracle Database 10g Standard Edition および Oracle Database 10g Enterprise Edition Oracle Database 11g Standard Edition および Oracle Database 11g Enterprise Edition Symfoware Server Enterprise Edition 9.1/10.0 Linux JDK JRE Oracle または Oracle10g Oracle または Oracle11g Symfoware Server( 注 ) Symfoware Server Enterprise Edition 9.0/9.1/10.0 および Symfoware Server Enterprise Extended Edition 9.0/9.1/10.0 Symfoware Server Enterprise Edition 9.0/9.1/10.0 および Symfoware Server Enterprise Extended Edition 9.0/9.1/10.0 Interstage Studio Enterprise Edition 9.2 Interstage Studio 注 ) Symfoware Server と Interstage Business Application Server に同梱している Symfoware/RDB とを総称する場合 Symfoware と表記します 著作権 Copyright 2009 FUJITSU LIMITED - iii -
2009 年 11 月第 2 版 - iv -
目次 第 1 章概要...1 1.1 Interstage Business Application Server が提供するオープン Java フレームワーク...1 1.2 動作環境...1 1.2.1 アプリケーション開発時に必要なソフトウェア...1 1.2.2 アプリケーション実行時に必要なソフトウェア...2 1.2.3 資源要件...3 1.3 運用モデル...3 1.3.1 基本的な構成...3 1.3.2 Spring Framework を利用した Web-AP 分散構成...6 第 2 章 Struts...7 2.1 Struts の概要...7 2.1.1 Struts カスタムタグライブラリ...7 2.1.2 ActionServlet...8 2.1.3 Validator...8 2.1.4 DataSource...8 2.1.5 国際化対応...8 2.1.6 一貫したログの出力...8 2.2 Struts の環境作成...8 2.2.1 IJServer の作成...8 2.2.2 クラスパスの設定...9 2.2.3 アプリケーションの配備...9 2.3 Struts アプリケーションの開発...10 2.3.1 Struts アプリケーションに必要な資材の準備...10 2.3.2 Model の作成...11 2.3.3 View の作成...13 2.3.4 Controller の動作を定義する設定ファイルの作成...15 2.3.5 配備記述子 (web.xml) の作成...16 2.3.6 Web アプリケーションの作成...17 2.3.7 Spring Framework との連携...17 2.3.8 ibatis との連携...17 2.4 Struts IDE による Struts アプリケーションの作成...17 2.4.1 基本的な操作...17 2.4.2 Spring Framework と連携するアプリケーションの作成...33 2.5 Struts の運用 保守...33 2.5.1 起動 停止...33 2.5.2 ログ...33 2.6 注意事項...34 2.7 チューニング...35 2.8 トラブルシューティング...36 2.8.1 ワークユニット起動時の異常...36 第 3 章 Spring Framework...37 3.1 Spring Framework の概要...37 3.1.1 DI コンテナ...37 3.1.2 トランザクション抽象化レイヤ...38 3.1.3 JDBC 抽象化レイヤ...38 3.1.4 O/R マッピング連携...38 3.1.5 AOP...38 3.1.6 MVC フレームワーク...39 3.1.7 JTA によるトランザクション制御機能...39 3.1.8 IJServer 間連携...39 3.1.9 Symfoware のエラーコードに対応した JDBC サポート機能...40 3.1.10 一貫したログの出力...40 3.2 Spring Framework の環境作成...40 - v -
3.2.1 IJServer の作成...40 3.2.2 クラスパスの設定...40 3.2.3 アプリケーションの配備...41 3.3 Spring Framework アプリケーションの開発...41 3.3.1 AP 層の作成...42 3.3.2 Web 層の作成...45 3.3.3 定義ファイルの作成...47 3.3.4 リモート機能による IJServer 間連携...50 3.3.5 Symfoware のエラーコードに対応した例外クラス...57 3.3.6 Struts との連携...58 3.3.7 ibatis との連携...65 3.4 Spring IDE による Spring Framework アプリケーションの作成...65 3.4.1 基本的な操作...65 3.4.2 Struts と連携するアプリケーションの作成...82 3.5 Spring Framework の運用 保守...88 3.5.1 起動 停止...88 3.5.2 ログ...88 3.5.3 複数 IJServer による分離型での運用...89 3.6 注意事項...91 3.6.1 Spring Framework アプリケーションで JTA を利用する場合の注意事項...91 3.6.2 Spring Framework アプリケーション作成時の注意事項...92 3.7 チューニング...92 3.8 トラブルシューティング...92 3.8.1 アプリケーション配備時の異常...92 3.8.2 ワークユニット起動時の異常...92 3.8.3 アプリケーション実行時の異常...92 第 4 章 ibatis...94 4.1 ibatis の概要...94 4.1.1 O/R マッピング...95 4.1.2 コネクション管理...95 4.1.3 トランザクション管理...96 4.1.4 一貫したログの出力...96 4.2 ibatis の環境作成...96 4.2.1 データベース接続の設定...96 4.2.2 IJServer の作成...96 4.2.3 クラスパスの設定...97 4.2.4 アプリケーションの配備...97 4.3 ibatis アプリケーションの開発...97 4.3.1 ibatis の基本設計...98 4.3.2 ibatis アプリケーションに必要な設定ファイルの作成...98 4.3.3 ibatis アプリケーションの実行クラスの作成 (Spring Framework と連携しない場合 )...101 4.3.4 Struts との連携...102 4.3.5 Spring Framework との連携...102 4.4 ibatis の運用 保守...104 4.4.1 起動 停止...104 4.4.2 ログ...104 4.5 注意事項...105 4.5.1 データベース固有の注意点...105 4.6 チューニング...106 4.7 トラブルシューティング...106 4.7.1 アプリケーション実行時の異常...106 第 5 章 TERASOLUNA...107 5.1 TERASOLUNA の概要...107 5.1.1 提供機能...107 5.1.2 システムモデル...108 5.2 TERASOLUNA の環境作成...109 - vi -
5.2.1 IJServer の作成...110 5.2.2 クラスパスの設定...110 5.2.3 ワークマネージャの設定 (TERASOLUNA-Batch のみ )...112 5.2.4 TERASOLUNA フレームワークが出力するログの設定...113 5.3 TERASOLUNA の開発...113 5.3.1 ブランクプロジェクトのインポート...113 5.3.2 ファイルパスの修正...114 5.3.3 データベースの設定...114 5.3.4 TERASOLUNA アプリケーションが出力するログの設定...116 5.3.5 アプリケーションの開発...116 5.3.6 ワークマネージャのスレッドプールサイズの調整 (TERASOLUNA-Batch)...117 5.3.7 配備アプリケーションの変更手順...118 5.3.8 デバッグ方法...118 5.4 TERASOLUNA の運用 保守...118 5.4.1 起動 停止...118 5.4.2 ログ...118 5.4.3 異常発生時の対処...118 5.5 注意事項...118 5.5.1 共通の注意事項...118 5.5.2 TERASOLUNA Batch Framework for Java 使用時の注意事項...118 5.6 チューニング...119 5.6.1 TERASOLUNA Batch Framework for Java のチューニング...119 5.7 トラブルシューティング...121 5.7.1 TERASOLUNA Batch Framework for Java のトラブルシューティング...121 第 6 章オープン Java フレームワークにおけるログ機能の利用...122 6.1 commons-logging API 仕様に準拠したログ機能...122 6.1.1 commons-logging API 仕様に準拠したログ機能の概要...122 6.1.2 commons-logging API 仕様に準拠したログ機能の環境作成...122 6.1.3 アプリケーションログの出力レベルについて...125 6.2 ログ機能の利用方法...126 6.2.1 commons-logging API を用いてログ出力する...126 6.2.2 LogComposer クラスを用いてログを出力する...126 6.2.3 ExtMessageComposer クラスを用いてログを出力する...127 6.2.4 ExtDataComposer クラスを用いてログを出力する...128 6.2.5 ExtTimeComposer クラスを用いてログを出力する...129 6.2.6 ULogComposer クラスを用いてログを出力する...131 6.3 注意事項...136 6.4 トラブルシューティング...136 第 7 章標準ログ...139 7.1 標準ログの概要...139 7.2 標準ログの定義...139 7.3 標準ログの出力レベル...141 7.4 サブシステム名...142 7.5 標準ログの基本フォーマット...143 7.6 標準ログのメッセージ本文...144 7.6.1 システムログ...144 7.6.2 性能ログ...147 7.7 注意事項...150 7.8 トラブルシューティング...150 第 8 章バックアップ リストアおよびクラスタ...151 8.1 バックアップ リストア資源の一覧...151 8.2 バックアップの手順...151 8.2.1 アプリケーションサーバの停止...151 8.2.2 アプリケーションサーバ環境資源のバックアップ...151 8.2.3 アプリケーションサーバの起動...152 - vii -
8.3 リストアの手順...152 8.3.1 アプリケーションサーバの停止...152 8.3.2 アプリケーションサーバ環境資源のリストア...152 8.3.3 アプリケーションサーバの起動...152 8.4 クラスタ構成...152 付録 A TERASOLUNA のサンプルアプリケーション...153 A.1 サンプルの導入方法...153 A.2 TERASOLUNA Server Framework for Java (Web 版 ) のサンプル...153 A.2.1 サンプルの構成...153 A.2.2 動作方法...155 A.3 TERASOLUNA Server Framework for Java (Rich 版 ) のサンプル...156 A.3.1 サンプルの構成...156 A.3.2 動作方法...158 A.4 TERASOLUNA Batch Framework for Java のサンプル...159 A.4.1 サンプルの作成方法...159 A.4.2 サンプルの動作方法...164 付録 B 謝辞 免責文 ライセンス文...167 B.1 Apache License のライセンス文...167 B.2 AspectJ のライセンス文...172 B.3 Spring IDE のライセンス文...174 B.4 ASM のライセンス文...177 - viii -
第 1 章概要 1.1 Interstage Business Application Server が提供するオープン Java フレームワーク Interstage Business Application Server は オープンソースのフレームワークとして人気のある Struts Spring Framework ibatis そしてそれらを統合した汎用フレームワークである TERASOLUNA を提供します 各フレームワークについて以下に説明します Struts Web アプリケーションに Model View Controller の MVC 構造を適用して Web アプリケーションの開発を容易にするフレームワークです Spring Framework DI(Dependency Injection) 機能や AOP(Aspect Oriented Programming) により POJO(Plain Old Java Object) クラスを組み合わせてアプリケーションを作成することを可能にして 業務アプリケーションの開発を容易にするフレームワークです ibatis Java オブジェクトと RDB のデータ構造の違いを吸収してマッピング (O/R マッピング ) することにより データアクセス層のアプリケーションの開発を容易にするフレームワークです TERASOLUNA Struts Spring Framework ibatis を統合した汎用フレームワークです Web アプリケーション向け リッチクライアント向け バッチアプリケーション向けのフレームワークがあります Struts Spring Framework ibatis のオリジナルのマニュアルおよび javadoc は Interstage Business Application Server のマニュアル CD-ROM 内に格納されています TERASOLUNA のマニュアルについては 下記のサイトを参照してください ( http://sourceforge.jp/projects/terasoluna/ ) 一貫したログの出力 Interstage Business Application Server では 上記のフレームワークを組み合わせた際に 1 つのリクエストに対して 1 つの コンテキスト ID を紐付けてログを出力することができます 各フレームワークが出力するログに一貫して同じ ID がついているため どのリクエストの処理がどのような処理ルートを実行したかをログから判別することができます 詳細は 第 7 章標準ログ を参照してください 1.2 動作環境 1.2.1 アプリケーション開発時に必要なソフトウェア アプリケーション開発時に必要なソフトウェアについて説明します アプリケーション開発環境項番機能名製品名バージョン レベル 1 オープン Java フレームワークを利用したアプリケーションの開発 ( 注 1) Interstage Studio Enterprise Edition ( 注 2) 9.2.0 注 1) 注 2) Spring Framework の IJServer 連携機能を使用する場合は CORBA サービスクライアントおよび CORBA サービスディベロップメントツールをインストールする必要があります また JNDI を使用するアプリケーションを作成する場合は CORBA サービスまたは CORBA サービスクライアントをインストールする必要があります Java EE ワークベンチは使用できません - 1 -
データベース関連 アプリケーション開発に必要なデータベース関連のソフトウェアついては 1.2.2 アプリケーション実行時に必要なソフトウェア の データベース関連 を参照してください 1.2.2 アプリケーション実行時に必要なソフトウェア アプリケーション実行時に必要なソフトウェアについて説明します Java 実行環境 項番機能名製品名バージョン レベル 1 オープン Java フレームワークを利用したアプリケーション 注 1) 本製品が提供するアプリケーションサーバの IJServer (J2EE) ( 注 1) - 対応する JDK のバージョンは 5.0 です V8 互換モードの IJServer は使用できません データベース関連 サポート対象のデータベースは各 JDBC ドライバのマニュアルを参照してください Symfoware を使用したアプリケーションを運用する場合 項番プラットフォームサポートする JDBC ドライババージョン レベル 1 Windows(R) Symfoware Server クライアント機能 9.0.0 以降 2 Solaris Symfoware Server クライアント機能 9.0.0 以降 3 RHEL-AS4(x86)/AS4(EM64T) Symfoware Server クライアント機能 9.0.0 以降 4 RHEL5(x86)/(Intel64) Symfoware Server クライアント機能 9.0.0 以降 5 RHEL-AS4(IPF) Symfoware Server クライアント機能 9.0.0 以降 6 RHEL5(IPF) Symfoware Server クライアント機能 9.0.0 以降 注 ) ibatis の一部の機能において Symfoware Server のバージョン レベル 10.0.0 以上で提供される JDBC ドライバの機能が必要です 詳細は 第 4 章 ibatis の 4.5.1 データベース固有の注意点 を参照してください Oracle を使用したアプリケーションを運用する場合 項番プラットフォームサポートする JDBC ドライババージョン レベル 1 Windows(R) Oracle JDBC Driver 10.2.0 または 11.1 2 Solaris Oracle JDBC Driver 10.2.0 または 11.1 3 RHEL-AS4(x86)/AS4(EM64T) Oracle JDBC Driver 10.2.0 または 11.1 4 RHEL5(x86)/(Intel64) Oracle JDBC Driver 10.2.0 または 11.1 5 RHEL-AS4(IPF) Oracle JDBC Driver 10.2.0 6 RHEL5(IPF) Oracle JDBC Driver 10.2.0 注 ) Oracle JDBC Driver のバージョンが 11.1.0.6 以前の場合 ConnectionEventListener が未実装です このため 以下の機能を使用すると誤動作する場合があります 以下の機能を使用する場合には 10.2.0 の Oracle JDBC Driver を使用するか ConnectionEventListener が実装されている修正パッチを Oracle 製品の SupportDesk 契約に基づいて SupportDesk から入手して適用してください - 2 -
-Interstage がコネクションをプールする (oracle.jdbc.pool.oracleconnectionpooldatasource) - 分散トランザクションを使用する (oracle.jdbc.xa.oraclexadatasource) SQL Serverを使用したアプリケーションを運用する場合 項番 プラットフォーム サポートするJDBCドライバ バージョン レベル 1 Windows(R) Microsoft(R) SQL Server(TM) 2005 JDBC Driver 1.2 以降 2 Solaris Microsoft(R) SQL Server(TM) 2005 JDBC Driver 1.2 以降 3 RHEL-AS4(x86)/AS4(EM64T) Microsoft(R) SQL Server(TM) 2005 JDBC Driver 1.2 以降 4 RHEL5(x86)/(Intel64) Microsoft(R) SQL Server(TM) 2005 JDBC Driver 1.2 以降 5 RHEL-AS4(IPF) Microsoft(R) SQL Server(TM) 2005 JDBC Driver 1.2 以降 6 RHEL5(IPF) Microsoft(R) SQL Server(TM) 2005 JDBC Driver 1.2 以降 注 ) 分散トランザクション機能を使用する場合は 使用できません PowerGres Plusを使用したアプリケーションを運用する場合 項番 プラットフォーム サポートするJDBCドライバ バージョン レベル 1 Windows(R) PowerGres Plusクライアント V5.0 2 RHEL-AS4(x86)/AS4(EM64T) PowerGres Plusクライアント V5.0 3 RHEL5(Intel64) PowerGres Plusクライアント V5.0 注 ) 分散トランザクション機能を使用する場合は 使用できません 1.2.3 資源要件 IPC 資源オープンJavaフレームワークでは IPC 資源を使用していないため IPC 資源のチューニングの考慮の必要はありません 1.3 運用モデル 1.3.1 基本的な構成 オープンJavaフレームワークを使用する場合の基本的な構成について説明します 基本的な構成は 以下の8パターンがあります 項番パターン説明選択のポイント 1 Struts だけを使用する構成 2 Spring Framework だけを使用する構成 Struts を使用した Web アプリケーションの構成です Web コンテナまたは Web+EJB コンテナ上で動作します プレゼンテーション層に Spring-MVC 機能を使用して ビジネスロジック層で Spring Framework の DI 機能や AOP 機能を利用する構成です Web コンテナまたは Web+EJB コンテナ上で動作します ビジネスロジックの規模が小さい場合に選択します Interstage Business Application Server における機能拡張である一貫したログを使用することができます データベースのテーブル構造が単純で ibatis の O/R マッピング機能が必要ない場合に選択します Interstage Business Application Server における機能拡張である一貫したログを使用することができます - 3 -
項番パターン説明選択のポイント 3 ibatis だけを使用する構成 4 Struts と Spring Framework を使用する構成 5 Struts と ibatis を使用する構成 6 Struts Spring Framework および ibatis を使用する構成 7 Spring Framework と ibatis を使用する構成 8 TERASOLUNA を使用する構成 注 1) ibatis の O/R マッピング機能だけを使用する構成です Web コンテナ Web+EJB コンテナ および EJB コンテナ上で動作します プレゼンテーション層に Struts を使用して ビジネスロジック層で Spring Framework の DI 機能や AOP 機能を利用する構成です Web コンテナまたは Web+EJB コンテナ上で動作します プレゼンテーション層で Struts を使用し データベースのアクセスに ibatis の機能を使用する構成です 図 1.1 Struts と ibatis を使用する構成 Web コンテナまたは Web+EJB コンテナ上で動作します プレゼンテーション層で Struts ビジネスロジック層で Spring Framework と ibatis の機能を使用する構成です 図 1.2 Struts Spring Framework および ibatis を使用する構成 Web コンテナまたは Web+EJB コンテナ上で動作します 上記 6 の構成において Struts の代わりに Spring-MVC 機能を使用する構成です 図 1.3 Spring Framework と ibatis を使用する構成 Web コンテナまたは Web+EJB コンテナ上で動作します 上記 5 の構成を TERASOLUNA フレームワークを介して使用する構成です 図 1.4 TERASOLUNA を使用する構成 Web コンテナまたは Web+EJB コンテナ上で動作します プレゼンテーション層を Struts や Spring Framework を使用せずにユーザ独自で作成した場合や EJB の SessionBean から ibatis の O/R マッピング機能を使用する場合などに選択します データベースコネクションは JNDI で取得し アプリケーションサーバが管理する形態を推奨します 一貫したログは使用できません 上記 1 の構成で作成したアプリケーションから ビジネスロジックに拡張性をもたせるようにしたい場合に選択します Interstage Business Application Server における機能拡張である一貫したログを使用することができます 純粋なビジネスロジックが少なく 画面表示とデータベースアクセスが大半を占めるようなアプリケーションの場合に選択します データベースコネクションは JNDI で取得し アプリケーションサーバが管理する形態を推奨します Interstage Business Application Server における機能拡張である一貫したログを使用することができます 拡張性を考慮して ビジネスロジックと画面表示 およびデータベースアクセスを分離する場合に選択します Spring Framework でデータベースコネクション管理 トランザクション管理を一括で管理することができます Interstage Business Application Server における機能拡張である一貫したログを使用することができます 拡張性を考慮して ビジネスロジックと画面表示 およびデータベースアクセスを分離する場合に選択します 上記 6 の構成とは同等の機能のため 開発者のスキルセットによって選択してください Spring Framework でデータベースコネクション管理 トランザクション管理を一括で管理することができます Interstage Business Application Server における機能拡張である一貫したログを使用することができます 拡張性を考慮して ビジネスロジックと画面表示 およびデータベースアクセスを分離する場合 また バッチアプリケーションの開発を行う場合に選択します Struts Spring Framework ibatis に加え TERASOLUNA が提供する Web アプリケーション リッチクライアントアプリケーションおよびバッチアプリケーションのための部品を利用することができます Interstage Business Application Server における機能拡張である一貫したログを使用することができます ( 注 1) TERASOKUNA フレームワーク層では一貫したログの出力は行いません TERASOLUNA から呼び出される Struts Spring Framework および ibatis の層で出力されます - 4 -
図 1.1 Struts と ibatis を使用する構成 図 1.2 Struts Spring Framework および ibatis を使用する構成 図 1.3 Spring Framework と ibatis を使用する構成 - 5 -
図 1.4 TERASOLUNA を使用する構成 Struts と ibatis を連携させる方法については 第 4 章 ibatis の 4.3.4 Struts との連携 を参照してください Struts と Spring Framework を連携させる方法については 第 3 章 Spring Framework の 3.3.6 Struts との連携 を参照してください Spring Framework と ibatis を連携させる方法については 第 3 章 Spring Framework の 3.3.7 ibatis との連携 および 第 4 章 ibatis の 4.3.5 Spring Framework との連携 を参照してください 1.3.2 Spring Framework を利用した Web-AP 分散構成 Spring Framework を使用する場合は プレゼンテーション層 (Web 層 ) とビジネスロジック層 (AP 層 ) を分離した Web-AP 分散構成をとることができます 図 1.5 Struts Spring Framework および ibatis を使用した Web-AP 分散構成 Web-AP 分散構成により 大規模システムにおいて Web 層と AP 層の負荷を考慮した柔軟なサーバ構成を実現することができます TERASOLUNA を使用する構成でも 同様に Web-AP 分散構成をとることができます - 6 -
第 2 章 Struts 2.1 Struts の概要 Struts とは Web アプリケーションのオープンソースフレームワークです Struts を利用することにより Web アプリケーションの開発効率を高める事が期待できます 主な機能は以下の通りです Struts カスタムタグライブラリ ActionServlet Validator DataSource 国際化対応 本製品で提供する Struts は 以下の機能を追加提供します 一貫したログの出力 Struts 1.2.9 が提供する機能と 本製品に含まれる Struts が提供する機能を記載します 機能名 Struts 1.2.9 本製品で提供する Struts Struts カスタムタグライブラリ ActionServlet Validator DataSource ( 注 ) ( 注 ) 国際化対応 一貫したログの出力 注 )Struts 1.2.9 では非推奨です 2.1.1 Struts カスタムタグライブラリ 処理の分岐や繰り返し エラー処理など JSP でよく利用される機能をカスタムタグとして提供しています カスタムタグを利用する事により JSP 内に存在していた Java コードを HTML と同様のタグに置き換える事ができるため JSP の可読性が向上します Struts では以下のカスタムタグを提供しています html フォームなどの各 HTML タグを代替し Struts と連動した処理を提供します logic 条件分岐や繰り返し 値の比較などの制御ロジックをタグ化します bean リクエストデータや業務オブジェクトの他に HTTP ヘッダやクッキーのような不可視のリクエストデータへのアクセス手段も提供します nested 上記 3 タグの記述を簡略化する機能を提供します 同一オブジェクトにアクセスする際の冗長な記述を改善する事ができます tiles 画面をヘッダ メニュー コンテンツなどの部分に分割し これらを組み合わせる事によって画面を構成する機能 各部分の再利用性を高める事ができます - 7 -
2.1.2 ActionServlet Struts 唯一のサーブレットで Struts ランタイムの動作を指定する設定ファイルの内容に従い 入出力データの振り分けや画面遷移の制御を引き受けます Struts アプリケーションにおいては この ActionServlet のおかげで MVC のうち Controller の記述を限りなく省力化する事が可能になり Model と View のアプリケーション固有の機能開発に専念する事が可能になります 2.1.3 Validator クライアントからの入力データを検証設定ファイルに定義した検証対象 検証内容 エラーメッセージなどの条件に従って検証処理を行います Validator では 予め必須チェック 文字列長チェック 正規表現チェック データ型チェック 数値範囲チェックなどが提供されており 検証設定ファイルを用意するだけで これらの機能を利用することができます また 開発者が適宜必要に応じて拡張できる柔軟性も持ち合わせています 2.1.4 DataSource Struts ランタイムの動作を指定する設定ファイルへアプリケーションが利用する個々のデータソースの情報を定義する事によって java.sql.datasource オブジェクトとして利用する事が可能になります 初期の Struts では標準的な DB 接続方法でしたが 現在ではデータベース処理とビジネスロジックを分離する目的のため Struts が管理する DataSource ではなく アプリケーションサーバが管理する DataSource を利用する事が推奨されています 2.1.5 国際化対応 Struts では国や言語に合わせた資材を用意する事で クライアントのロケール情報を解析し 適切な資材を自動的に選択する機能を提供します 共通で利用できる部分と言語固有の部分を分けて開発できるため アプリケーションの再利用性を高める事ができます 2.1.6 一貫したログの出力 本製品で提供する Struts では 一連のアプリケーションはコンテキスト ID と呼ばれる識別情報に関連付けられます ログファイルにコンテキスト ID を付加してログメッセージを出力する事によって 一連のアプリケーションが出力したログを選定する事ができます 本機能の詳細については 第 7 章標準ログ を参照してください 2.2 Struts の環境作成 Strutsを利用するためには 以下の手順で環境を作成します IJServerの作成 クラスパスの設定 Strutsアプリケーションの配備 2.2.1 IJServer の作成 Strutsアプリケーションを動作させるために必要なIJServerを作成します IJServerの作成 Interstage 管理コンソールを使用して IJServerワークユニットを作成します [ システム ] > [ ワークユニット ] > [ 新規作成 ] タブ - 8 -
Struts アプリケーションでは IJServer のタイプ EJB アプリケーションのみ運用 は利用できません 2.2.2 クラスパスの設定 IJServer のクラスパスへログ機能が動作するために必要な jar ファイルを設定します クラスパスの設定 Interstage 管理コンソールを使用して IJServer ワークユニットでログ機能が動作するために必要な jar ファイルをクラスパスへ設定します [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 環境設定 ] タブ 以下の jar ファイルを設定します [Interstageのインストールディレクトリ]\BAS\struts12\lib\struts12.jar [Interstageのインストールディレクトリ]\BAS\lib\commons-beanutils-1.8.0.jar [Interstageのインストールディレクトリ]\BAS\lib\commons-digester-1.8.1.jar [Interstageのインストールディレクトリ]\BAS\lib\commons-logging-1.1.1.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwlogging.jar [Interstageのインストールディレクトリ]\APC\lib\uji.jar [Interstageのインストールディレクトリ]\APC\lib\ujief.jar [Interstageのインストールディレクトリ]\APC\lib\ujilog.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwutils50.jar /opt/fjsvibs/struts12/lib/struts12.jar /opt/fjsvibs/lib/commons-beanutils-1.8.0.jar /opt/fjsvibs/lib/commons-digester-1.8.1.jar /opt/fjsvibs/lib/commons-logging-1.1.1.jar /opt/fjsvibs/lib/apfwlogging.jar /opt/fjsvwebc/lib/uji.jar /opt/fjsvapcef/lib/ujief.jar /opt/fjsvapclg/lib/ujilog.jar /opt/fjsvibs/lib/apfwutils50.jar 2.2.3 アプリケーションの配備 作成したIJServerへ Strutsアプリケーションを配備します アプリケーションの配備操作 Interstage 管理コンソールを使用して IJServerワークユニットへStrutsアプリケーションファイルを配備します [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 配備 ] タブ - 9 -
2.3 Struts アプリケーションの開発 本項では Strutsアプリケーションの開発の手順を説明します Strutsアプリケーションに必要な資材の準備 Modelの作成 Viewの作成 Controllerの動作を定義する設定ファイルの作成 配備記述子 (web.xml) の作成 Webアプリケーションの作成 Spring Frameworkとの連携 ibatisとの連携 Interstage Studio 上における Struts アプリケーション開発用プロジェクトの作成方法については 2.4 Struts IDE による Struts アプリケーションの作成 を参照してください 2.3.1 Struts アプリケーションに必要な資材の準備 必要な jar ファイル一覧 Struts アプリケーションで必要となる jar ファイルは以下の通りです jarファイル名 struts12.jar apfwlogging.jar uji.jar ujief.jar ujilog.jar apfwutils50.jar commons-beanutils-1.8.0.jar commons-digester-1.8.1.jar commons-logging-1.1.1.jar commons-fileupload-1.2.1.jar commons-validator-1.3.1.jar antlr-2.7.7.jar jakarta-oro-2.0.8.jar 機能概要 strutsランタイム一式標準ログの出力で使用ログ機能の既定機能を利用するために使用シスログ またはイベントログを利用するために使用ログ機能の拡張機能を利用するために使用共通ユーティリティの機能を利用するために使用 Formへの入力値をJavaBeanに格納する機能で使用 struts 設定ファイルの解析で使用 commons-digesterが使用ファイルアップロード機能を使用する場合に必要プラグイン検証機能を使用する場合に必要プラグイン検証機能を使用する場合に必要プラグイン検証機能を使用する場合に必要 jar ファイルの格納先 本製品が提供する Struts の jar ファイルは以下に格納されています [Interstage のインストールディレクトリ ]\BAS\struts12\lib\ - 10 -
/opt/fjsvibs/struts12/lib/ 2.3.2 Model の作成 Modelは ユーザアプリケーションのビジネスロジックを実装します Strutsの作法では ビジネスロジックを実装するActionクラス リクエストデータを格納するActionFormクラスの2つから構成されます なお 各 APIの詳細については StrutsのJavadocを参照してください ActionForm クラスの作成 JSP の入力フォームに入力された情報を格納するクラスです org.apache.struts.action.actionform クラスを継承する以外は JavaBeans と同様に開発を行います (ExtActionForm.java) package sample; import org.apache.struts.action.actionform; import org.apache.struts.action.actionerrors; import org.apache.struts.action.actionmapping; import org.apache.struts.action.actionmessage; import javax.servlet.http.httpservletrequest; public class ExtActionForm extends ActionForm { // プロパティ private String name = null; // アクセサ public void setname( String prm ) { name = prm; } public String getname( ) { return name; } // (1) public ActionErrors validate( ActionMapping mapping, HttpServletRequest request ) { - 11 -
ActionErrors ret = new ActionErrors(); if( (null == name) (name.equals("")) ) { ret.add( "name", new ActionMessage("err.input", false) ); } return ret; } } (1) 検証機能 このメソッドは Action クラスが実行される前に Struts ランタイムから呼び出されます Action クラスの作成 ユーザのビジネスロジックを実装するクラスです org.apache.struts.action.action クラスを継承させる必要があります (ExtAction.java) package sample; import org.apache.struts.action.action; import org.apache.struts.action.actionform; import org.apache.struts.action.actionforward; import org.apache.struts.action.actionmapping; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class ExtAction extends Action { // (1) public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res ) throws java.lang.exception { ExtActionForm eaf = (ExtActionForm)form; String name = eaf.getname( ); - 12 -
eaf.setname( name + ", hello." ); // (2) return (mapping.findforward( "result" )); } } (1) 業務ロジックの実装 execute メソッドをオーバライドして ユーザの業務ロジックを実装します (2) 処理結果の遷移先を返却 処理結果として出力する遷移先 (Struts 設定ファイルで定義した forward タグ ) を指定します 2.3.3 View の作成 Struts アプリケーションでは View として主に JSP が使用されます そのため Struts では JSP の開発をサポートするカスタムタグライブラリを提供しています カスタムタグライブラリを使用する事により HTML タグとコードの混在が軽減され 可読性およびメンテナンス性の向上が期待できます なお Struts カスタムタグライブラリの詳細については Struts のマニュアルを参照してください カスタムタグライブラリの使用方法 JSP でカスタムタグを利用するには Java の import 文のようにカスタムタグの利用宣言を行う必要があります その際 taglib タグを使用してカスタムタグの構文を定義した tld ファイルを指定します この指定にはいくつかの方法があります JSP ファイルからの相対パスで指定する Web モジュールからの絶対パスで指定する 配備記述子で定義した tld ファイルのパスに対応するキーを指定する コンテナがマッピングしている tld ファイルのパスに対応するキーを指定する JSP の詳細については Interstage Application Server / Interstage Web Server J2EE ユーザーズガイド を参照してください 入力画面の作成 ユーザの入力を受け付ける JSP を作成します (input.jsp) <%@ page contenttype="text/html; charset=utf-8" %> <!-- (1) --> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <html> <body> - 13 -
<!-- (2) --> <html:form action="/sample.do" > Please input your name.<br> <!-- (3) --> <html:text property="name" /> <html:submit value="submit" /><br> </html:form> </body> </html> (1) strutsカスタムタグライブラリの宣言 Strutsカスタムタグライブラリを使用する場合に記述します (2) 入力フォーム入力フォームを表します action 属性でリクエスト送信先を指定します (3) テキストフィールドテキストフィールドです property 属性でActionFormのプロパティと紐付けを行います 出力画面の作成業務ロジックでの処理結果を出力するJSPを作成します (result.jsp) <%@ page contenttype="text/html; charset=utf-8" %> <!-- (1) --> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <html> <body> <!-- (2) --> <bean:write name="formbean" property="name" /><br> <br> <a href="./input.jsp">return</a><br> </body> </html> (1) struts カスタムタグライブラリの宣言 Struts カスタムタグライブラリを使用する場合に記述します - 14 -
(2) ActionForm にアクセス カスタムタグを介して ActionForm に格納されている値を出力します 2.3.4 Controller の動作を定義する設定ファイルの作成 ユーザは定義ファイル (Struts 設定ファイル ) で動作内容の指示を行います この Struts 設定ファイルの定義内容に従い Controller はリクエスト URL ごとに処理の振り分け Action クラスの処理結果に応じた遷移先の呼び出し 例外発生時の対応などを行います (struts-config.xml) <!-- (1) --> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <!-- (2) --> <form-bean name="formbean" type="sample.extactionform" /> </form-beans> <action-mappings> <!-- (3) --> <action path="/sample" type="sample.extaction" name="formbean" input="/input.jsp" > <!-- (4) --> <forward name="result" path="/result.jsp" /> </action> </action-mappings> </struts-config> (1) DOCTYPE 指定 Struts 設定ファイルの構文を定めたdtdファイルを指定します (2) form-beans リクエストパラメータなどを格納するJavaBeanクラスを定義します (3) action-mapping リクエストパスごとに呼び出されるActionクラスを定義します (4) forward - 15 -
処理結果を表示するページのパスを定義します 2.3.5 配備記述子 (web.xml) の作成 Webアプリケーションの配備記述子に Strutsアプリケーションに必要な定義を記述します web.xmlの詳細については Interstage Application Server / Interstage Web Server J2EE ユーザーズガイド を参照してください (web.xml) <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- (1) --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.actionservlet</servlet-class> <!-- (2) --> <load-on-startup>2</load-on-startup> </servlet> <!-- (3) --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app> (1) servlet Strutsアプリケーションの起点となるサーブレット名 および サーブレットクラスを指定します (2) load-on-startup この指定を行う事で IJServer 起動時にStrutsランタイムの活性化が行われるようになります - 16 -
本要素を省略した場合 アプリケーションが正常に動作しない場合があるため 必ず指定してください (3) servlet-mapping Struts アプリケーションが呼び出される URL パターンを指定します URL パターンは任意の値が使用できます 2.3.6 Web アプリケーションの作成 以上までの手順で Struts アプリケーションに必要な資材の作成が完了しましたので Web アプリケーションとして配備するために WAR ファイルを作成します WAR ファイルの作成方法 IJServer への配備方法などについては Interstage Application Server / Interstage Web Server J2EE ユーザーズガイド を参照してください Struts アプリケーションの資材配置 Web アプリケーションと同様のディレクトリ構成に Struts アプリケーションに必要な資材を配置します WARファイルにまとめる上記の通りに資材を配置し終わったら Webアプリケーションとして配備するためにWARとして固めます 以上が Strutsアプリケーションの開発工程となります 2.3.7 Spring Framework との連携 Spring Framework と連携する際は 第 3 章 Spring Framework の 3.3.6 Struts との連携 を参照してください 2.3.8 ibatis との連携 ibatis と連携する際は 第 4 章 ibatis の 4.3.4 Struts との連携 を参照してください 2.4 Struts IDE による Struts アプリケーションの作成 2.4.1 基本的な操作 本章では Struts IDE の基本的な操作について説明します Strutsサポートの追加 Struts IDEを使用して WebアプリケーションプロジェクトにStrutsサポートを追加する手順を以下に示します 1. Interstage Studio V9.2でWebアプリケーションプロジェクトを作成します 2. Struts IDEの [Strutsサポート] ウィザードを使用して 作成されたWebアプリケーションプロジェクトにStrutsサポートを追加します Web アプリケーションプロジェクトの作成 Web プロジェクトの作成手順の詳細については Interstage Studio ユーザーズガイド を参照してください - 17 -
[Struts サポート ] ウィザードの操作手順 1. 作成された Web アプリケーションプロジェクトを選択して [ ファイル ] > [ 新規 ] > [ その他 ] から [Struts IDE] > [Struts] > [Struts サポートの追加 ] を選択すると [ ウィザードを選択 ] 画面に移行します - 18 -
2. [ 次へ (N)>] をクリックすると [Struts サポートの追加 ] 画面に移行します - Web アプリケーションのルート右側の [ 参照 ] ボタンをクリックして カレントの Web アプリケーションのコンテキストルートを設定することができます 生成された Struts に関連する構成ファイルが当該コンテキストルートに保存されます Interstage Studio を使用して作成された Web アプリケーションプロジェクトのデフォルトコンテキストルートが [ContextRoot] です - servlet-mapping [servlet-mapping] 入力ボックスに URL のマッピングモード ( 例 *.do) を入力して servlet-mapping を設定します - Struts のライブラリを追加する [Struts のライブラリを追加する ] チェックボックスにチェックを入れると Struts IDE は Struts アプリケーションの必要なライブラリを自動で追加します 追加される Struts ライブラリを以下に示します - commons-beanutils-1.8.0.jar - commons-collections-3.2.1.jar - commons-digester-1.8.1.jar - commons-fileupload-1.2.1.jar - commons-logging-1.1.1.jar - commons-validator-1.3.1.jar - 19 -
- jakarta-oro-2.0.8.jar - struts12.jar - apfwlogging.jar - カスタムタグの TLD ファイルを追加する [ カスタムタグの TLD ファイルを追加する ] チェックボックスにチェックを入れると Struts IDE は WEB-INF ディレクトリ配下に TLD ファイルを自動で追加します 追加される 5 つの TLD ファイルを以下に示します - struts-bean.tld - struts-html.tld - struts-logic.tld - struts-nested.tld - struts-tiles.tld - struts-config.xml を生成する [struts-config.xml を生成する ] チェックボックスにチェックを入れると Struts IDE は struts-config.xml ファイルを自動で生成します 同ファイルは Struts アプリケーションの中核となる構成ファイルであり 生成後に Web アプリケーションのルート /WEB-INF ディレクトリの配下に保存されます Struts IDE が自動で生成する struts-config.xml ファイルの内容を以下に示します <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http:// struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources> </data-sources> <form-beans> </form-beans> <global-exceptions> </global-exceptions> <global-forwards> </global-forwards> <action-mappings> </action-mappings> <controller processorclass="org.apache.struts.tiles.tilesrequestprocessor"/> <message-resources parameter="messageresources"/> <plug-in classname="org.apache.struts.tiles.tilesplugin"> <set-property property="definitions-config" value="/web-inf/tiles-defs.xml"/> <set-property property="moduleaware" value="true"/> </plug-in> <plug-in classname="org.apache.struts.validator.validatorplugin"> - 20 -
<set-property property="pathnames" value="/web-inf/validator-rules.xml,/web-inf/validation.xml"/> </plug-in> </struts-config> - MessageResources.propertites を生成する [MessageResources.propertites を生成する ] チェックボックスにチェックを入れると Struts IDE はアプリケーションのリソースファイルとしての MessageResources.propertites ファイルを自動で生成します MessageResources.propertites ファイルは Web アプリケーションプロジェクトの src ディレクトリ配下に保存されます - web.xml を生成する [web.xml を生成する ] チェックボックスにチェックを入れると Struts IDE は web.xml ファイルを生成します 生成されたファイルは Web アプリケーションのルート /WEB-INF ディレクトリ配下の既存 web.xml ファイルを上書きします 生成された web.xml ファイルには Struts Servlet のコンフィグ Servlet マッピングエレメントおよびアプリケーションに必要なタグライブラリの定義が追加されます Struts IDE が生成する web.xml ファイルの内容を以下に示します <?xml version="1.0" encoding="shift_jis"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.actionservlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/web-inf/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> - 21 -
<servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <taglib> <taglib-uri>/tags/struts-bean</taglib-uri> <taglib-location>/web-inf/struts-bean.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-html</taglib-uri> <taglib-location>/web-inf/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-logic</taglib-uri> <taglib-location>/web-inf/struts-logic.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-nested</taglib-uri> <taglib-location>/web-inf/struts-nested.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-tiles</taglib-uri> <taglib-location>/web-inf/struts-tiles.tld</taglib-location> </taglib> <!-- <taglib> <taglib-uri>http://java.sun.com/jstl/core</taglib-uri> <taglib-location>/web-inf/c.tld</taglib-location> </taglib> <taglib> - 22 -
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri> <taglib-location>/web-inf/fmt.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri> <taglib-location>/web-inf/sql.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/x</taglib-uri> <taglib-location>/web-inf/x.tld</taglib-location> </taglib> --> </web-app> - 23 -
3. [ 次へ (N)>] をクリックすると [ プラグインの設定 ] 画面に移行します - Validator プラグインを使用する [Validator プラグインを使用する ] チェックボックスにチェックを入れると 以下のファイルを自動で追加します - validation.xml - validator-rules.xml - Tiles プラグインを使用する [Tiles プラグインを使用する ] チェックボックスにチェックを入れると 以下のファイルを自動で追加します - tiles-defs.xml - 24 -
4. [ 終了 (F)] をクリックすると カレントの Web アプリケーションプロジェクト配下には Struts エレメント付きのファイルが生成されます Struts サポートを追加した後のプロジェクトディレクトリ構成を以下に示します Struts Action ファイルの作成 Struts IDE を使用して Action クラスを自動生成する手順を以下に示します - 25 -
1. 作成された Web アプリケーションプロジェクトを選択して [ ファイル ] > [ 新規 ] > [ その他 ] から [Struts IDE] > [Struts] > [Struts Action] を選択すると [ ウィザードを選択 ] 画面に移行します - 26 -
2. [ 次へ (N)>] をクリックすると Action クラスの作成画面に移行します Action クラスが所属するパッケージを選択して [ 名前 (M)] に Action クラスの名前を入力します 3. [ 終了 (F)] をクリックすると Struts Action クラスが生成されます 作成された Action クラスは org.apache.struts.action.action を継承します Struts ActionForm ファイルの作成 Struts IDE を使用して ActionForm クラスを自動生成する手順を以下に示します - 27 -
1. 作成された Web アプリケーションプロジェクトを選択して [ ファイル ] > [ 新規 ] > [ その他 ] から [Struts IDE] > [Struts] > [Struts ActionForm] を選択すると [ ウィザードを選択 ] 画面に移行します - 28 -
2. [ 次へ (N)>] をクリックすると ActionForm クラスの作成画面に移行します ActionForm クラスの作成画面において ActionForm クラスが所属するパッケージを選択して [ 名前 (M)] に ActionForm クラスの名前を入力します 3. [ 終了 (F)] をクリックすると ActionForm クラスが生成されます 作成された ActionForm クラスは org.apache.struts.action.actionform を継承します Struts JSP ファイルの作成 Struts IDE は Struts JSP ファイルを生成する機能を提供します 手順を以下に示します - 29 -
1. 作成された Web アプリケーションプロジェクトを選択して [ ファイル ] > [ 新規 ] > [ その他 ] から [Struts IDE] > [Struts] > [Struts JSP ファイル ] を選択すると [ ウィザードを選択 ] 画面に移行します - 30 -
2. [ 次へ (N)>] をクリックすると Struts JSP ファイルの作成画面に移行します Struts JSP ファイルの作成画面について 以下に説明します - コンテナ右側の [ 参照 ] ボタンをクリックして Struts JSP ファイルの保存先を選択します ( 例えば Web アプリケーションのルート配下に Struts JSP ファイルの保存先としての JSP ディレクトリを新規作成します ) を選択します カレント Web アプリケーションプロジェクトにおける既存のディレクトリのみ選択できます - ファイル名 Struts JSP ファイルの名前を入力します 入力する JSP ファイル名の拡張子は必ず.jsp とします - テンプレート [default] が選択できます 3. [ 終了 (F)] をクリックすると JSP ファイルが生成されます 生成された JSP ソースには Struts に関するタグライブラリがインポートされます - struts-bean - struts-logic - struts-html - 31 -
- struts-nested struts-config の編集 Struts IDE は struts-config.xml ファイルにグラフィカルな編集の機能を提供します この機能により Web フローの設計を容易に行うことができます struts-config.xml グラフィカルエディタの操作手順を以下に示します 1. カレントの Web アプリケーションプロジェクトの WEB-INF ディレクトリ配下の struts-config.xml をダブルクリックすると struts-config.xml グラフィカルエディタが起動されます 2. [ フロー ] タブにおいて アクションや JSP 画面 フォワードなどの Struts エレメントを選択してからドラッグして Struts アプリケーションの Web フローをグラフィカルに設計します struts-config.xml グラフィカルエディタについて 以下に説明します [ フロー ] タブ - [ フロー ] タブにおけるドラッグ可能なコントロールは Action Page Forward Exception Input Direct Forward および Include があります - [ フロー ] タブで配置したアクションや JSP を右クリックして [ 開く ] を選択すると JSP やアクションクラスをエディタで開くことができます 対象のファイルが存在しない場合は新規作成ウィザードが起動し アクションや JSP ファイルを生成することができます - [ フロー ] タブで右ボタンをクリックすると [ 画像として保存 ] を選択して 現在の設計フロー画面を保存することができます - [ フロー ] タブで右ボタンをクリックすると [ 印刷 (P)] を選択して 現在の設計フローを印刷することができます [ プロパティ ] ビューグラフィカルエディタで設計された Struts エレメントは [ プロパティ ] ビューにて変更できます - 32 -
[ アウトライン ] ビュー - グラフィカルエディタで設計された Struts エレメントの情報および各エレメント間の関係は [ アウトライン ] ビューにて階層的に表示できます - [ アウトライン ] ビューにおいては Struts エレメントが追加 削除できます [ アウトライン ] ビューにおける操作結果は [ フロー ] タブと [ ソース ] タブにおいても同時に反映できます [ ソース ] タブ - [ ソース ] タブにおいては struts-config.xml ファイルの XML ソースが直接に編集できます 編集結果は [ フロー ] タブと [ アウトライン ] ビューにおいても同時に反映できます - struts-config.xml の内容にエラーがある場合 [ 問題 ] ビューにエラーの位置と内容が表示されます また [ ソース ] タブの該当行にもマーカが表示されます [ 問題 ] ビューでエラー内容をクリックすると [ ソース ] タブの該当行にジャンプすることができます 2.4.2 Spring Framework と連携するアプリケーションの作成 3.4.2 Struts と連携するアプリケーションの作成 を参照してください 2.5 Struts の運用 保守 2.5.1 起動 停止 Struts は IJServer ワークユニット上で動作します IJServer ワークユニットの起動 停止は Interstage 管理コンソール上で行います IJServer ワークユニットの起動 停止方法については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください Struts の環境設定については 2.2 Struts の環境作成 を参照してください 2.5.2 ログ 本製品の Struts で提供するログ機能に標準ログがあります 標準ログは以下の 2 つから構成されます システムログ Struts ランタイムの稼働状態や エラー情報を表すログ 性能ログ Struts ランタイムが処理に要した時間を表すログ 標準ログは Struts ランタイムの処理において 特定の処理の開始または 終了を契機に出力されます 標準ログの詳細については 第 7 章標準ログ を参照してください - 33 -
図 2.1 システムログの出力契機 図 2.2 性能ログの出力契機 2.6 注意事項 RequestProcessor の拡張を行う場合 アプリケーションで使用する RequestProcessor を拡張したクラスに差し替える場合 同一 Struts 設定ファイル内では他の RequestProcessor を使用する事ができなくなります そのため Tiles 機能と拡張した RequestProcessor を同時に使用したい場合は TilesRequestProcessor をベースに拡張を行うなどの工夫が必要となります - 34 -
キャンセル処理のセキュリティホール Struts-1.2.8 までは Form のキャンセルボタンが押下された場合 検証処理が実行されずにユーザの業務ロジックが呼び出されてしまうセキュリティホールが存在しました そのため Struts 1.2.9 では Struts 設定ファイルで明示的に許可しない限り デフォルトではキャンセル処理を受け付けない仕様に変更されました ( 受け付けた場合は InvalidCancelException がスローされる ) ただし キャンセル処理を許可した場合の動作は以前と何ら変化していないため 業務アプリケーション側でキャンセル処理を意識した実装が必要となります Struts カスタムタグライブラリを使用した JSP の表示について クライアントが使用する Web ブラウザの種類によっては 画面構成が崩れるなどの意図しない動作となる場合があります Struts 設定ファイルでのワイルドカード * の利用について ワイルドカード機能において 後方一致検索は未サポートとなります Action タグの unknown 機能で代替できる場合は そちらを使用して下さい Struts アプリケーション作成時の注意 Struts アプリケーションではクラス名 メソッド名 ファイル名などにマルチバイト文字や記号を使用した場合 意図した動作をしない場合があります Struts プラグイン検証機能の利用について プラグイン検証機能を使用する場合は <message-resources> タグも定義する必要があります DynaActionForm 利用時の注意 DynaActionForm のプロパティとしてプリミティブ型を指定した場合 initial 属性で初期値を設定しない場合例外が発生します DynaActionForm のプロパティとしてプリミティブ型を指定した場合 initial 属性で初期値を設定してください Struts マニュアルの誤記について Struts Users Guide[Tiles Tag Library] の definition タグの scope 属性の説明に誤りがあります 誤 :Specifies the variable scope into which the newly defined bean will be created. If not specified, the bean will be created in page scope. 正 :Specifies the variable scope into which the newly defined bean will be created. If not specified, the bean will be created in request scope. 標準ログについて Struts が出力する標準ログは ActionServlet がコントローラとして動作する場合に限定されます 上記以外の場合は標準ログが出力されません 2.7 チューニング ファイルアップロード機能利用時のパフォーマンスチューニングに関して ファイルアップロード機能では アップロードされたデータが Struts 設定ファイルで指定したしきい値 (256KB) を超える場合 そのデータをメモリ上からディスク資源に退避させます ( 以後 この退避したデータを一時ファイルと呼称します ) 業務運用で想定されるファイルサイズに対して 一時ファイルが作成されるしきい値の設定が適切でない場合 以下の問題が発生する可能性があります しきい値が小さ過ぎる場合 一時ファイルが頻繁に作成されるようになります アクセス速度の遅いディスク資源へのアクセスが発生するため スループットが低下する恐れがあります - 35 -
また 適切な後始末が行われない場合 一時ファイルが削除されずに残ってしまい ディスク資源が枯渇する恐れがあります しきい値が大き過ぎる場合 一時ファイルの作成頻度を抑える事ができます ただし データサイズの大きいファイルがアップロードされた場合 ヒープ領域の圧迫による処理速度の低下 しいては OutOfMemoryError が発生する可能性があります 2.8 トラブルシューティング 2.8.1 ワークユニット起動時の異常 ワークユニット起動時に ClassNotFoundException が発生する場合 以下の条件に該当する場合 ワークユニット起動時に ClassNotFoundException が発生し アプリケーションの活性化に失敗する場合があります アプリケーションが使用する jar ファイルを WAR ファイルに格納している場合 アプリケーションで使用する jar ファイルを ワークユニットのクラスパスに指定する事で 問題が解決する場合があります DynaActionForm の initial 属性に指定した値が正しく反映されない場合 以下の条件を満たす場合 initial 属性に指定した値が正しく反映されない場合があります DynaActionForm のプロパティとして配列を指定している initial 属性に "\" "?" "_" などを含む値を指定している commons-beanutils の仕様により "\" "?" "_" などの文字は配列要素の区切り文字として認識されます 詳細な仕様は commons-beanutils の仕様書で確認してください 不完全なレスポンスデータが返される場合がある レスポンス生成処理中に異常が発生した場合 正しいレスポンスが返却されない場合があります この場合 Web アプリケーションの設定や配備資材の内容に問題がある可能性があります コンテナログを参照し 問題を取り除いてください Tiles 機能を使用した Web アプリケーションで NullPointerException が発生する 以下の条件に該当する場合 TilesRequestProcessor が Tiles 定義情報を参照できないため NullPointerException が発生する場合があります Tiles 機能を使用 (Struts 設定ファイルの controller タグで TilesRequestProcessor を指定している ) しており Struts 設定ファイルの Plug-In タグで Tiles 設定ファイルを指定していない Tiles 機能を使用する場合は Tiles 設定ファイルも必ず指定する必要があります Tiles 機能を使用したJSPにアクセスした場合 例外が返却される以下の条件に該当する場合 Tiles 機能を使用したJSPにアクセスした場合に例外が返却される場合があります JSPファイルでtiles:insertタグが入れ子になって記述されている tiles:insertタグを入れ子にして記述しないでください レスポンスが返らない場合がある以下の条件に該当する場合 Webアプリケーションからのレスポンスが返されない場合があります JSPファイルにbean:includeタグでhref 属性に空文字を指定している href 属性に空文字を指定しないでください - 36 -
第 3 章 Spring Framework 3.1 Spring Framework の概要 Spring Framework はコンポーネントの再利用性を高める事を目的とした DI と呼ばれるデザインパターンに基づいた Java/J2EE アプリケーションフレームワークです Spring Framework では 以下の機能を提供します DI コンテナ トランザクション抽象化レイヤ JDBC 抽象化レイヤ O/R マッピング連携 (TopLink,Hibernate,JDO,iBATIS など ) AOP MVC フレームワーク 本製品に含まれる Spring Framework では 以下の機能も提供します IJServer 間連携 JDBC の Symfoware エラーコード対応 一貫したログの出力 Spring Framework 2.5.5 が提供する機能と本製品に含まれる Spring Framework が提供する機能について記載します 機能名 Spring Framework 2.5.5 DI コンテナ トランザクション抽象化レイヤ JDBC 抽象化レイヤ O/R マッピング連携 (TopLink,Hibernate,JDO,iBATIS など ) AOP MVC フレームワーク ( 注 1) JTA によるトランザクション制御 ( 注 2) IJServer 間連携 JDBC の Symfoware エラーコード対応 一貫したログの出力 注 1)Interstage では ポートレット機能は未サポート 注 2)Spring Framework が持つ JTA のトランザクション属性の一部が未サポート 3.1.1 DI コンテナ 本製品で提供する Spring Framework DI コンテナはコンポーネント ( クラス ) 間の依存関係をソースコードから取り除き 実行時まで依存関係を持たないようにするデザインパターンに基づいて作られたコンポーネント群を集中管理するための機能です Spring Framework においては オブジェクトが必要とする情報を Bean 定義ファイルと呼ばれる XML 形式の外部ファイルへ定義し アプリケーション実行時に DI コンテナが定義された情報を注入してオブジェクトのインスタンスを生成します DI コンテナを利用する事によって 以下の利点を得る事ができます アプリケーションの拡張性を高められる - 37 -
単体テストが容易になる コンポーネントの可搬性を高められる 3.1.2 トランザクション抽象化レイヤ Spring Framework では独自の一貫したトランザクション管理の抽象化を提供しています Spring Framework におけるトランザクションの抽象化は JTA やその他のトランザクション管理テクノロジとは結合していない独特なものです これにより 土台となるトランザクションインフラを切り離す事が可能となり 以下の利点を得る事ができます JTA JDBC Hibernate ibatis データベースレイヤや JDO のような異なるトランザクション API に対し 一貫したプログラミングモデルの提供 単純で使いやすいプログラミング的トランザクション管理 API の提供 Spring Framework のデータアクセス抽象化との結合 Spring Framework の宣言的トランザクション管理のサポート Spring Framework の設定により 上記の機能を利用する事でスケールアップ / スケールダウンが可能なアプリケーションを開発する事ができます 3.1.3 JDBC 抽象化レイヤ Spring Framework では JDBC を抽象化したフレームワークを提供しています JDBC API を直接使用するより簡潔にデータアクセスコードを記述できるようになっています Spring Framework は以下の機能を提供します 冗長でエラーになりがちな例外処理をアプリケーションからフレームワークへ移す API アプリケーションが SQLException の代わりに動作するように意味のある Spring 固有のデータアクセス例外 例外処理 API によって アプリケーションは適切な SQL を発行し その結果を抽出する事に専念する事が可能になります また Spring Framework 固有のデータアクセス例外によって JDBC 特有のデータアクセス例外ではなくなるため アプリケーションでは throw される可能性があるすべての JDBC データアクセス例外を意識する必要がなくなります 3.1.4 O/R マッピング連携 Spring Framework では Hibernate や JDO ibatis などの Object/Relational Mapping API を統合するレイヤを提供しています O/R マッピングモジュールを使用する事によって Spring Framework が持つ他の機能と O/R マッピングを組み合わせて使用可能になります これらにより Spring Framework では以下の利点を得る事ができます 効率の良く 簡単 安全なセッション管理 容易なリソース管理 利便性のある統合トランザクション管理 例外のラッピング ベンダ制約からの避難 容易なテスト 3.1.5 AOP AOP はオブジェクト指向の欠点を補完する事ができるアスペクト指向に基づいたプログラミングです アプリケーションでのログ出力やエラー処理 トランザクション制御など プログラムごとに共通な処理を別のモジュールとして分離する事によって 機能の内容把握 管理 変更を容易にします AOP を利用する場合には Spring Framework の Bean 定義ファイルへ以下を定義します - 38 -
処理を実行する条件 処理を実行するタイミング 実行する処理 これにより 条件を満たした場合に指定したタイミングで分離したプログラムを実行することが可能になります 3.1.6 MVC フレームワーク Spring Framework が提供する MVC フレームワークは 処理の中核を担う Model(M) と画面への表示 出力を担う View(V) 入力内容に基づいて Model と View を制御する Controller(C) の 3 要素を組み合わせた MVC モデル 2 を採用し Web アプリケーション開発を容易にする事を目的としたフレームワークです Spring Framework は以下の 2 つの MVC フレームワークを持っています Spring Web MVC フレームワーク Spring Portlet MVC フレームワーク 本製品が提供する Spring Framework においては Spring Web MVC フレームワークのみをサポートします Web アプリケーション開発をサポートする Spring Web MVC フレームワークでは 以下の機能を提供します クライアントからの HTTP リクエスト 業務処理 処理結果表示までの画面遷移機能 クライアントからの入力データや業務処理の出力データの受け渡し機能 入力データの検証機能 処理結果をレンダリングするための View テクノロジとの連携機能 Spring タグライブラリ Spring Web MVC フレームワークは上記の機能によって Web アプリケーション開発を支援します 3.1.7 JTA によるトランザクション制御機能 Spring Framework では JTA(Java Transaction API) を利用してトランザクション制御を行うためのクラスを提供しています Spring Framework の JtaTransactionManager クラスでは JTA の TransactionManager インタフェースを利用して 以下に記載する EJB と同等のトランザクション属性をサポートしています REQUIRED(EJB:Required) MANDATORY(EJB:Mandatory) REQUIRES_NEW(EJB:RequiresNew) NOT_SUPPORTED(EJB:NotSupported) SUPPORTS(EJB:Supports) NEVER(EJB:Never) 本製品で提供する Spring Framework では トランザクション属性の REQUIRES_NEW と NOT_SUPPORTED は 既存トランザクションが存在する場合には使用できません 3.1.8 IJServer 間連携 Spring Framework では リモート呼び出し機能により別プロセスのオブジェクトを呼び出す事ができます ただし 別プロセスのオブジェクトを呼び出すためには 開発者が EJB アプリケーションを作成する必要があります 本製品で提供する Spring Framework においては 別プロセスの IJServer が管理しているオブジェクトを呼び出すために 開発者が作成する必要のある EJB アプリケーション部を提供する事によって EJB アプリケーションの知識がない場合でも別プロセスの IJServer が管理しているオブジェクトを呼び出す事を可能にします - 39 -
3.1.9 Symfoware のエラーコードに対応した JDBC サポート機能 DB アクセスを行うアプリケーションでは 従来ベンダ固有のエラーコードを意識した処理が必要でしたが Spring Framework では システム例外やデータ不整合例外など DB ベンダ固有のエラーコードが判断できるように共通のデータベース例外クラスを提供しています 本製品で提供する Spring Framework においては Symfoware のエラーコードを Spring Framework が提供する例外クラスに関連付ける事によって アプリケーションでは Symfoware のエラーコードを意識した処理が不要になります 3.1.10 一貫したログの出力 本製品で提供する Spring Framework では 一連のアプリケーションはコンテキスト ID と呼ばれる識別情報に関連付けられます ログファイルにコンテキスト ID を付加してログメッセージを出力する事によって 一連のアプリケーションが出力したログメッセージを選定する事を可能にします 本機能の詳細については 第 7 章標準ログ を参照してください 3.2 Spring Framework の環境作成 Spring Frameworkを利用するためには 以下の手順で環境を作成します IJServerの作成 クラスパスの設定 アプリケーションの配備 3.2.1 IJServer の作成 Spring Frameworkアプリケーションを動作させるために必要なIJServerを作成します IJServerの作成 Interstage 管理コンソールを使用して IJServerワークユニットを作成します [ システム ] > [ ワークユニット ] > [ 新規作成 ] タブ 作成する IJServer のタイプは EJB アプリケーションのみ運用 以外を指定します 運用形態が分離型の場合 IJServer 間連携機能によって呼び出される IJServer のタイプには EJB アプリケーションのみ運用 または Web アプリケーションと EJB アプリケーションを別 JavaVM で運用 を指定します 3.2.2 クラスパスの設定 IJServer のクラスパスへ Spring Framework の機能が動作するために必要な jar ファイルを設定します クラスパスの設定 Interstage 管理コンソールを使用して IJServer ワークユニットで Spring Framework の機能が動作するために必要な jar ファイルをクラスパスへ設定します [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 環境設定 ] タブ 以下の jar ファイルを設定します [Interstage のインストールディレクトリ ]\BAS\spring25\lib\spring25.jar [Interstage のインストールディレクトリ ]\BAS\spring25\lib\spring-webmvc25.jar - 40 -
[Interstageのインストールディレクトリ]\BAS\lib\commons-logging-1.1.1.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwlogging.jar [Interstageのインストールディレクトリ]\APC\lib\uji.jar [Interstageのインストールディレクトリ]\APC\lib\ujief.jar [Interstageのインストールディレクトリ]\APC\lib\ujilog.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwutils50.jar /opt/fjsvibs/spring25/lib/spring25.jar /opt/fjsvibs/spring25/lib/spring-webmvc25.jar /opt/fjsvibs/lib/commons-logging-1.1.1.jar /opt/fjsvibs/lib/apfwlogging.jar /opt/fjsvwebc/lib/uji.jar /opt/fjsvapcef/lib/ujief.jar /opt/fjsvapclg/lib/ujilog.jar /opt/fjsvibs/lib/apfwutils50.jar 3.2.3 アプリケーションの配備 作成したIJServerへ Spring Frameworkアプリケーションを配備します アプリケーションの配備操作 Interstage 管理コンソールを使用して IJServerワークユニットへSpring Frameworkアプリケーションファイルを配備します [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 配備 ] タブ 3.3 Spring Framework アプリケーションの開発 本項では Spring Frameworkアプリケーションの開発の手順を説明します AP 層の作成 Web 層の作成 定義ファイルの作成 リモート機能によるIJServer 間連携 Symfowareのエラーコードに対応した例外クラス Strutsとの連携 ibatisとの連携 Interstage Studio 上における Spring Framework アプリケーション開発用プロジェクトの作成方法については 3.4 Spring IDE による Spring Framework アプリケーションの作成 を参照してください アプリケーションの作成方法は運用形態によってそれぞれ異なります 運用形態が 基本型 の場合 Spring プロジェクト ネイチャーの追加を行った Web アプリケーションプロジェクト を作成し AP 層と WEB 層の資材および定義ファイルを WAR ファイルにまとめます - 41 -
運用形態が IJServer 間連携による分離型 の場合 Spring プロジェクト ネイチャーの追加を行った Web アプリケーションプロジェクト と Spring Project または Spring プロジェクト ネイチャーの追加を行った java プロジェクト を作成します Spring プロジェクト ネイチャーの追加を行った Web アプリケーションプロジェクト にて WEB 層の資材と定義ファイルを WAR ファイルにまとめます Spring Project または Spring プロジェクト ネイチャーの追加を行った java プロジェクト にて AP 層の資材と定義ファイルを jar ファイルにまとめます 最後にエンタープライズアプリケーションプロジェクトを作成し jar ファイルを EAR ファイルにまとめます 運用形態別のアプリケーション構成図を以下に示します アプリケーション構成図 図 3.1 基本型 図 3.2 IJServer 間連携による分離型 3.3.1 AP 層の作成 Web 層からの要求に応じて呼び出される業務アプリケーションを作成します 業務アプリケーションでは データベースとのやり取りなどの処理を行い 処理結果を Web 層に返します EmployeeDao.java(DAO のインタフェース ) package test; public interface EmployeeDao { public void init(); public void destroy(); - 42 -
public String[] execdaoselect(); public boolean execdaoinsert(string Employee); public boolean execdaodelete(string Employee); } EmployeeDaoImpl.java(DAO の実装クラス ) package test; public class EmployeeDaoImpl implements EmployeeDao{ public void init() { } // 初期処理 public void destroy() { } // 終了処理 // AOPが差し込まれる対象となるメソッド public String[] execdaoselect(){ String[] data = null; // データベースから社員全員の名前を取得します //data[] =... return data; } // AOPが差し込まれる対象となるメソッド public boolean execdaoinsert(string Employee){ boolean ret = true; // データベースに指定した社員名を登録します //ret =... return ret; } // AOPが差し込まれる対象となるメソッド - 43 -
public boolean execdaodelete(string Employee){ boolean ret = true; // データベースから指定した社員を削除します //ret =... return ret; } } ListService.java( 業務アプリケーションのインタフェース ) package test; public interface ListService { } public String[] getemployeelist(); ListServiceImpl.java( 業務アプリケーションの実装クラス ) package test; public class ListServiceImpl implements ListService { private EmployeeDao employeedao; public void setemployeedao(employeedao employeedao) { // DIによって生成されたインスタンスが格納されます this.employeedao = employeedao; } public String[] getemployeelist() { // 社員の名前一覧を返却します String[] employeelist = employeedao.execdaoselect(); } } return employeelist; aopdatabasecheck.java(aop で差し込む処理 ) package test; - 44 -
import org.aspectj.lang.proceedingjoinpoint; public class aopdatabasecheck{ // データベースに関するチェック処理を指定されたメソッドの前後で処理を行います public Object aroundmessage( ProceedingJoinPoint pjp ) throws Throwable { try{ // DBチェック処理 }catch(exception e){ throw e; } // AOP によって処理を差し込んだため もとの処理を呼び出します Object retval = pjp.proceed() ; // メッセージ System.out.println("..."); } } return retval ; 3.3.2 Web 層の作成 クライアントからの要求を AP 層に引き渡すコントローラを作成します また 業務アプリケーションの処理結果などをビューとして表示するための JSP を作成します 業務アプリケーションを呼び出すコントローラの作成例を以下に示します ViewEmployeeListController.java( 社員一覧を表示するコントローラ ) package test;... import org.springframework.context.applicationcontext; import org.springframework.web.servlet.modelandview; import org.springframework.web.servlet.mvc.abstractcontroller; public class ViewEmployeeListController extends AbstractController{ public ModelAndView handlerequestinternal(httpservletrequest req, HttpServletResponse res) throws Exception { - 45 -
Map model = new HashMap(); // Bean を取得します ApplicationContext context = getwebapplicationcontext(); ListService employee =(ListService)context.getBean("businessService"); // 業務アプリケーションから社員の名前一覧を取得します String[] EmployeeList = null; EmployeeList = employee.getemployeelist(); // 処理結果をビューに伝播するため model に設定します model.put("employeelist", EmployeeList); // ビューで表示するために ModelAndView オブジェクトを作成し 処理結果を格納します ModelAndView mav = new ModelAndView("ViewEmployeeList", model); return mav; } } ViewEmployeeList.jsp( 社員一覧を表示するビュー ) <%@ page contenttype="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title> 社員名簿 </title> </head> <body> <table border="1" cellspacing="2" cellpadding="3"> <tr> <td><b>no.</b></td> <td><b> 名前 </b></td> </tr> <!-- (1) --> <c:foreach var="employee" items="${employeelist}" varstatus="no"> - 46 -
<tr> <td><b></b><c:out value="${no.index + 1}"/></td> <td><c:out value="${employee}"/></td> </tr> </c:foreach> </table> </body> </html> (1) ModelAndView に設定された社員全員の名前のリスト employeelist の情報を表示します 3.3.3 定義ファイルの作成 Spring Framework ランタイムは作成した Bean 定義ファイルに従って動作します 運用形態に応じて用意する Bean 定義ファイル数は異なり 基本型の場合は 最低 1 つの Bean 定義ファイルを作成します IJServer 間連携による分離型の場合は 最低 2 つの Bean 定義ファイルを作成します Bean 定義ファイルには Spring Framework アプリケーションで利用するクラスを Bean として定義します 必要に応じて AOP や DB トランザクションなどの定義を記述します この例では 基本型の Bean 定義ファイルの例を記述します applicationcontext.xml またはサーブレット名 -servlet.xml <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- (1) AOP 定義 --> <aop:config> <aop:aspect id="sample" ref="sampleadvice"> <aop:around pointcut-ref="pc1" method="aroundmessage" /> <aop:pointcut expression="execution(* execdao*())" id="pc1" /> - 47 -
</aop:aspect> </aop:config> <!-- AOP 定義から参照されるクラスを bean として定義します --> <bean id="sampleadvice" class="test.aopdatabasecheck" /> <!-- (2) ビューの定義 --> <bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <!-- ビュー内でJSTL( 標準タグライブラリ ) を使用する場合 --> <property name="viewclass" value="org.springframework.web.servlet.view.jstlview"/> <property name="prefix" value="/web-inf/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- (3) コントローラの定義 --> <bean id="viewcontroller" class="test.viewemployeelistcontroller" /> <!-- (4) ハンドラマッピング--> <bean id="urlmapping" class="org.springframework.web.servlet.handler.simpleurlhandlermapping"> <property name="mappings"> <props> <prop key="/index.html">viewcontroller</prop> </props> </property> </bean> <!-- (5) 業務アプリケーションで使用するBeanの定義 --> <bean id="businessservice" class="test.listserviceimpl"> <property name="employeedao" ref="employeedao00"/> </bean> <bean id="employeedao00" class="test.employeedaoimpl" /> </beans> (1) AOP 定義 指定したクラス / メソッドに 指定したタイミングで Bean として定義したクラスの指定したメソッドを実行します 処理を実行するクラス / メソッドには 前方 / 後方 / 完全一致などの条件を指定することができ 処理を実行するタイミングは 指定したメソッドの直前 / 直後 / 前後や例外発生時などを指定することができます - 48 -
AOP 機能を利用する場合には 以下に格納されているモジュールをクラスパスに定義する必要があります [Interstage のインストールディレクトリ ]\BAS\lib\aspectjweaver.jar /opt/fjsvibs/lib/aspectjweaver.jar (2) ビューの定義 業務アプリケーションの処理結果をビューで表示するためにビューリゾルバを指定します JSTL( 標準タグライブラリ ) を使用する場合には 以下に格納されているモジュールをクラスパスに定義する必要があります [Interstage のインストールディレクトリ ]\APC\lib\jstl.jar /opt/fjsvapcst/struts/contrib/struts-el/lib/jstl.jar また JSTL1.1に対応した標準タグライブラリ (standard.jar) を用意してクラスパスに定義する必要があります (3) コントローラの定義業務アプリケーションおよび業務アプリケーションの処理結果を格納するコントローラを指定します (4) ハンドラマッピングリクエストURLとコントローラを関連付けるための条件をハンドラマッピングに定義します 定義しない場合は デフォルトでBeanNameUrlHandlerMappingが使用されます (5) 業務アプリケーションで使用するBeanの定義 Beanとして定義したクラスは DIによって実行時に自動的にインスタンスが生成されます bean タグの id 属性に使用可能な文字は XML 名前空間の NCName 型です NCName 型に準拠しない文字を使用したい場合は id 属性の代わりに name 属性を使用する必要があります WAR ファイルの作成 運用形態が基本型の場合は WAR ファイルを作成します WAR ファイルの作成方法については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください - 49 -
EAR ファイルの作成 運用形態が分離型の場合には WAR ファイルと EAR ファイルを作成します EAR ファイルのディレクトリ構成については 3.3.4 リモート機能による IJServer 間連携 を参照して Spring Framework のアプリケーション開発に合せた構成にしてください WAR ファイルおよび EAR ファイルの作成方法については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください アプリケーションの配備 作成した WAR ファイルまたは EAR ファイルを Interstage 管理コンソールから配備します 3.3.4 リモート機能による IJServer 間連携 IJServer 間連携機能は Spring Framework アプリケーションから別プロセスの IJServer へ配備された Spring Framework アプリケーションの呼び出しを実現します 本機能を利用することにより アプリケーションを分離することが可能になるため 負荷分散などのスケーラブルな運用ができます IJServer 間連携機能による Spring Framework アプリケーションの構成および呼び出しの流れを以下に示します 図 3.3 リモート呼び出し機能による IJServer 間連携機能の構成図 IJServer 間連携機能を利用した Spring Framework アプリケーションの開発 IJServer 間連携機能を利用した Spring Framework アプリケーションを開発するために 開発者は Spring プロジェクト ネイチャーの追加を行った Web アプリケーションプロジェクト と Spring Project または Spring プロジェクト ネイチャーの追加を行った java プロジェクト を作成します Spring プロジェクト ネイチャーの追加を行った Web アプリケーションプロジェクト にて WEB 層の資材と定義ファイルを WAR ファイルにまとめます Spring Project または Spring プロジェクト ネイチャーの追加を行った java プロジェクト にて AP 層の資材と定義ファイルを jar ファイルにまとめます 最後にエンタープライズアプリケーションプロジェクトを作成し jar ファイルを EAR ファイルにまとめます 作成するエンタープライズアプリケーションは 以下の構成にする必要があります EAR ファイルの構成図 - 50 -
3.3 Spring Framework アプリケーションの開発 の例を元に アプリケーションを作成します Web 層のサーバアプリケーションを Web アプリケーション AP 層のサーバアプリケーションを 業務アプリケーション とします 1. 業務アプリケーションの開発 (AP 層の作成 ) 以下のアプリケーションを作成します - EmployeeDao.java(DAO のインタフェース ) - EmployeeDaoImpl.java(DAO の実装クラス ) - ListService.java( 業務アプリケーションのインタフェース ) - ListServiceImpl.java( 業務アプリケーションの実装クラス ) - AopDatabaseCheck.java(AOP で差し込む処理 ) アプリケーションの作成例は 3.3 Spring Framework アプリケーションの開発 を参照してください IJServer 間連携機能にてユーザ定義クラスを利用する場合 クラスをシリアライズする必要があります 2. Web アプリケーションの開発 (Web 層の作成 ) 以下のアプリケーションを作成します - ViewEmployeeListController.java( 社員一覧を表示するコントローラ ) - ViewEmployeeList.jsp( 社員一覧を表示するビュー ) アプリケーションの作成例は 3.3 Spring Framework アプリケーションの開発 を参照してください - 51 -
IJServer 間連携機能にてユーザ定義クラスを利用する場合 クラスをシリアライズする必要があります また 業務アプリケーションで作成したインタフェースを用意します - ListService.java( 業務アプリケーションのインタフェース ) 3. 定義ファイルの作成 a. 業務アプリケーションの Bean 定義ファイルを作成 IJServer 間連携機能によって呼び出される業務アプリケーションの Bean 定義ファイルを作成します applicationcontext.xml( ファイル名は固定値 ) <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/springaop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/springtx-2.5.xsd"> <aop:config> <aop:aspect id="sample" ref="sampleadvice"> <aop:around pointcut-ref="pc1" method="aroundmessage" /> <aop:pointcut expression="execution(* execdao*())" id="pc1" /> </aop:aspect> </aop:config> <bean id="sampleadvice" class="test.aopdatabasecheck"/> <!-- Webアプリケーションから呼び出される業務アプリケーションのBean 定義 --> <bean id="remotebusinessservice" class="test.listserviceimpl"> <property name="employeedao" ref="employeedao00"/> </bean> - 52 -
<bean id="employeedao00" class="test.employeedaoimpl"/> </beans> b. Web アプリケーションの Bean 定義ファイルを作成 IJServer 間連携機能を動作させるために Web アプリケーションの Bean 定義ファイルを作成します applicationcontext.xml またはサーブレット名 -servlet.xml <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/springaop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/springtx-2.5.xsd"> <bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <property name="viewclass" value="org.springframework.web.servlet.view.jstlview"/> <property name="prefix" value="/web-inf/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="viewcontroller" class="test.viewemployeelistcontroller" /> <bean id="urlmapping" class="org.springframework.web.servlet.handler.simpleurlhandlermapping"> <property name="mappings"> <props> <prop key="/index.html">viewcontroller</prop> </props> </property> </bean> <!-- (1) IJServer 間連携機能を動作させるための Bean 定義 --> - 53 -
<bean id="businessservice" class="com.fujitsu.interstage.apfw.springframework.ejb.access.remotestatelesssessionproxyfactorybean"> </bean> <!-- 業務アプリケーションの BeanId を定義します --> <property name="beanid" value="remotebusinessservice"/> <!-- 業務アプリケーションのインタフェースを定義します --> <property name="businessinterface" value="test.listservice"/> </beans> (1) IJServer 間連携機能を動作させるための Bean 定義 - IJServer 間連携機能のクラス com.fujitsu.interstage.apfw.springframework.ejb.access.remotestatelesssessionproxyfactorybean を指定します - Web アプリケーションから呼び出す業務アプリケーションの BeanId を定義します ( 業務アプリケーションの Bean 定義ファイルに記述した BeanId と同じにします ) - 業務アプリケーションのインタフェースを定義します 上記で定義したインタフェースと同じものを Web アプリケーションにも格納してください 4. クラスファイルのパッケージ化 a. EAR ファイルの作成業務アプリケーションや Bean 定義ファイルは EAR ファイルとして作成します また 作成する EAR ファイルには IJServer 間連携機能のモジュールを同梱する必要があります EAR ファイルを作成する方法を以下に示します - EAR ファイル配下に Shared/lib ディレクトリを作成し 業務アプリケーションと Bean 定義ファイルを圧縮した jar ファイルを格納します - EAR ファイル配下に IJServer 間連携機能のモジュールを格納します IJServer 間連携機能のモジュールは以下のディレクトリに格納されています [Interstage のインストールディレクトリ ]\BAS\spring25\lib\apfw-spring-ejb-api.jar /opt/fjsvibs/spring25/lib/apfw-spring-ejb-api.jar - EAR ファイルの META-INF ディレクトリ配下に以下の deployment descriptor(application.xml) を格納します application.xml <?xml version="1.0" encoding="utf-8"?> <application xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" - 54 -
xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" version="1.4"> <module> <ejb>apfw-spring-ejb-api.jar</ejb> </module> </application> EAR ファイルの作成の詳細に関しては Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください b. WAR ファイルの作成 Web アプリケーションや Bean 定義ファイルを WAR ファイルとして作成します WAR ファイルの作成の詳細に関しては Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください 5. IJServer の設定 IJServer 間連携機能を利用する場合には Web アプリケーションを運用する IJServer と業務アプリケーションを運用する IJServer でそれぞれ異なる設定を行う必要があります 以下に IJServer 間連携機能を利用する場合の IJServer の設定について説明します a. Web アプリケーションを運用する IJServer の設定 Web アプリケーションを運用する IJServer のクラスパスに Spring Framework の機能が動作するために必要な jar ファイルと IJServer 間連携機能の jar ファイルを設定します Spring Framework の機能が動作するために必要な jar ファイルの設定については 3.2 Spring Framework の環境作成 を参照してください クラスパスの設定 Interstage 管理コンソールを使用して IJServer 間連携機能の jar ファイルをクラスパスへ設定します - [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 環境設定 ] タブ 以下の jar ファイルを設定します [Interstage のインストールディレクトリ ]\BAS\spring25\lib\apfw-spring25.jar /opt/fjsvibs/spring25/lib/apfw-spring25.jar b. 業務アプリケーションを運用する IJServer の設定 業務アプリケーションを運用する IJServer のクラスパスに Spring Framework の機能が動作するために必要な jar ファイルと IJServer 間連携機能の jar ファイルを設定します Spring Framework の機能が動作するために必要な jar ファイルの設定については 3.2 Spring Framework の環境作成 を参照してください クラスパスの設定 Interstage 管理コンソールを使用して IJServer 間連携機能の jar ファイルをクラスパスへ設定します - [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 環境設定 ] タブ - 55 -
以下の jar ファイルを設定します [Interstage のインストールディレクトリ ]\BAS\spring25\lib\apfw-spring-ejb-impl.jar /opt/fjsvibs/spring25/lib/apfw-spring-ejb-impl.jar 6. アプリケーションの配備作成した WAR ファイルまたは EAR ファイルを Interstage 管理コンソールから配備を行います EJB アプリケーション名を変更して EAR ファイルを配備した場合 IJServer 間連携機能を利用するには Web アプリケーションの Bean 定義ファイルに EJB アプリケーション名を定義する必要があります EJB アプリケーション名を sampleejb に変更した場合の例を以下に示します <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/ beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- IJServer 間連携機能を動作させるための Bean 定義 --> <bean id="businessservice" class="com.fujitsu.interstage.apfw.springframework.ejb.access.remotestatelesssessionproxyfactorybean"> </bean> <!-- 業務アプリケーションの BeanId を定義します --> <property name="beanid" value="remotebusinessservice"/> <!-- 業務アプリケーションのインタフェースを定義します --> <property name="businessinterface" value="test.listservice"/> <!-- EJB アプリケーション名を定義します --> <property name="jndiname" value="sampleejb"/> - 56 -
</beans> Interstage 管理コンソールの操作方法については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください 7. ネーミングサービスの設定業務アプリケーションが Web アプリケーションとは別のマシン環境にある場合 ネーミングサービスの設定を行う必要があります ネーミングサービスの設定 Interstage 管理コンソールを使用して ネーミングサービスを運用するマシンのホスト名を設定します - [ システム ] > [ 環境設定 ] タブ > 詳細設定 > ネーミングサービス詳細設定 ネーミングサービスの設計については Interstage Business Application Server セットアップガイド を参照してください 3.3.5 Symfoware のエラーコードに対応した例外クラス 本製品に含まれる Spring Framework では Symfoware のエラーコードに対応した例外クラスとのマッピング情報が定義されています 定義されているマッピング情報を元に Spring Framework が例外を返却するため ユーザが作成するアプリケーションは Symfoware のエラーコードを意識する必要がありません 以下に Spring Framework がマッピング情報を元に返却する例外クラスについて説明します No. 例外クラス説明 1 DataAccessException 以降で説明する例外クラスのスーパークラスです スーパークラスのため 本例外はスローされません 2 BadSqlGrammarException SQL 文法に誤りがある場合にスローされます 3 InvalidResultSetAccessException データベースの結果セットが無効な形式である場合にスローされます 4 DataAccessResourceFailureException 接続以外の資源へのアクセスへ失敗した場合にスローされます 5 PermissionDeniedDataAccessException アクセス権限がない場合にスローされます 6 DataIntegrityViolationException 挿入または 更新の結果 データの一貫性が保てなくなった場合にスローされます 7 CannotAcquireLockException ロックに失敗した場合にスローされます 8 DeadlockLoserDataAccessException デッドロックが発生した場合にスローされます 9 CannotSerializeTransactionException 10 UncategorizedSQLException トランザクション分離レベルが SERIALIZABLE でかつ 他のトランザクションの完了待ちになったトランザクションが完了しなかった場合にスローされます 発生したエラーコードが No.2~9 の例外クラスに該当しない場合にスローされます EmployeeDaoImpl を元に BadSqlGrammarException/UncategorizedSQLException/DataAccessException クラスを使用した例外処理の例を以下に示します package test; import org.springframework.dao.dataaccessexception; import org.springframework.jdbc.badsqlgrammarexception; import org.springframework.jdbc.uncategorizedsqlexception; - 57 -
public class EmployeeDaoImpl implements EmployeeDao{ public boolean execdaoinsert(string Employee){ boolean ret = true; try{ // データベースアクセス処理 } catch(badsqlgrammarexception bage){ // SQL 文法に誤りエラー時の任意の処理 } catch(uncategorizedsqlexception use){ // SQL 文法に誤りエラー以外の任意の処理 } catch(dataaccessexception dae){ // 上記エラー以外の任意の処理 } return ret; } } Spring Framework が返却する例外クラスを利用することのメリット Spring Framework が返却する例外クラスを利用する場合 以下のメリットがあります Spring Framework がマッピング情報を元に Symfoware のエラーコードに対応した Spring Framework が持つ例外クラスをスローするため Symfoware のエラーコードを意識して例外処理を作成する必要がありません 業務データベースを他のデータベースに変更する場合 Spring Framework が持つ例外クラスをキャッチして例外処理を作成しているため ソースコードを変更せずに移行することができます 3.3.6 Struts との連携 Struts と Spring Framework を連携させることにより Struts を利用して構成したアプリケーションにおいても Spring Framework の機能を利用することが可能になります 連携のメリット Struts と Spring Framework を連携させることにより Struts 利用者 Spring Framework 利用者の双方に以下のようなメリットがあります Struts 利用者 Spring Framework 利用者 Spring Framework が持つ AOP や DI などの機能を利用することが可能になります Struts が持つ よりシンプルな WebMVC フレームワークを利用した開発が可能になります Action クラスに対する依存性の注入 Spring Framework と連携することによって DI コンテナの機能を利用することが可能になります DI コンテナの利用方法については 3.3 Spring Framework アプリケーションの開発 を参照してください - 58 -
Action クラスに対する AOP の適用 Action クラスが Spring Framework の DI コンテナの管理下にあるとき Action クラスに対する AOP の適用が可能になります 以下に 適用例を示します Login クラス ( 業務ロジッククラス ) package test; public class Login { public boolean checkid(string userid) { // 認証処理 return true; } } SampleAdvice クラス (AOP で挿入したい処理を実装したクラス ) package test; public class SampleAdvice { public void printmsg(){ System.out.println("AOPで処理が挿入されました "); } } Spring Framework の Bean 定義ファイル (AOP に関する定義を記述 ) <beans> <aop:config> <!-- 1 --> - 59 -
<aop:aspect id="helloaspect" ref="aopclass"> 1 <!-- 2 --> <aop:before method="printmsg" pointcut-ref="pc1" /> <!-- 3 --> <aop:pointcut expression="execution(* execute(..))" id="pc1" /> </aop:aspect> </aop:config> <bean id="aopclass" class=" test.sampleadvice" /> </beans> 1 ref 要素でbean id AOPClass を参照しています 本サンプルにおけるAOPの定義は以下に示す通りです 1. AOPで挿入する処理を持つクラス - SampleAdviceクラス 2. 実行するメソッドと実行条件 - 対象メソッドが実行される前にSampleAdviceクラスのprintMsg() メソッドを実行 3. AOPの対象メソッド - execute という名称のメソッド ( 完全一致のみ ) 自作 Action クラスへの AOP 適用イメージ package test; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.struts.action.action; import org.apache.struts.action.actionform; import org.apache.struts.action.actionmapping; import org.apache.struts.action.actionforward; import org.apache.struts.action.dynaactionform; public class SampleAction extends Action{ // AOPによって ここに処理が挿入されます public ActionForward execute(actionmapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm dynaform = (DynaActionForm)form; - 60 -
String userid = dynaform.getstring("userid"); if(userid.equals("")){ userid = " ユーザ名を入力して下さい "; } // 変数 useridの値を出力します System.out.println(userId); // Actionクラス内で呼び出す業務ロジックです Login login = new Login(); boolean result =login.checkid(userid); if (true == result){ // 業務処理成功時 return map.findforward("success"); } // 業務処理失敗時 return map.findforward("failure"); } } 以下に 本サンプル実行時の処理結果を示します 処理結果 AOPで処理が挿入されました spring (HTMLフォームで入力した値) AOP の設定によっては 処理を挿入する対象を複数とすることも可能です 連携概要 概要 Struts から Spring Framework の DelegatingActionProxy クラスを Action クラスとして呼び出し クラス内部で改めて Action クラスの Bean を取得して呼び出しを行います 構成図 以下に 本連携における構成図を示します - 61 -
図 3.4 Struts-Spring 連携の構成図 WebApplicationContext Spring FrameworkのBean 定義ファイルの情報を保持します クラスパスの設定 IJServerのクラスパスへ機能連携のために必要なjarファイルを設定します 設定手順については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください 以下のjarファイルを設定します [Interstageのインストールディレクトリ]\BAS\struts12\lib\struts12.jar [Interstageのインストールディレクトリ]\BAS\spring25\lib\spring25.jar [Interstageのインストールディレクトリ]\BAS\spring25\lib\spring-webmvc25.jar [Interstageのインストールディレクトリ]\BAS\spring25\lib\spring-webmvc-struts25.jar [Interstageのインストールディレクトリ]\BAS\lib\commons-beanutils-1.8.0.jar [Interstageのインストールディレクトリ]\BAS\lib\commons-digester-1.8.1.jar [Interstageのインストールディレクトリ]\BAS\lib\aopalliance.jar [Interstageのインストールディレクトリ]\BAS\lib\aspectjweaver.jar [Interstageのインストールディレクトリ]\BAS\lib\cglib-nodep2.1_3.jar [Interstageのインストールディレクトリ]\BAS\lib\commons-logging-1.1.1.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwlogging.jar /opt/fjsvibs/struts12/lib/struts12.jar /opt/fjsvibs/spring25/lib/spring25.jar /opt/fjsvibs/spring25/lib/spring-webmvc25.jar /opt/fjsvibs/spring25/lib/spring-webmvc-struts25.jar /opt/fjsvibs/lib/commons-beanutils-1.8.0.jar - 62 -
/opt/fjsvibs/lib/commons-digester-1.8.1.jar /opt/fjsvibs/lib/aopalliance.jar /opt/fjsvibs/lib/aspectjweaver.jar /opt/fjsvibs/lib/cglib-nodep2.1_3.jar /opt/fjsvibs/lib/commons-logging-1.1.1.jar /opt/fjsvibs/lib/apfwlogging.jar Struts-Spring 連携のための手順以下に連携機能の利用手順を示します Struts 設定ファイル Action 定義非連携時と同様にaction-mappingsタグを記述しますが actionタグのtype 属性を以下のように定義します Action 定義の詳しい方法については 第 2 章 Struts の 2.3 Strutsアプリケーションの開発 を参照して下さい <action-mappings> <action path="/login" name="loginform" type="org.springframework.web.struts.delegatingactionproxy"> <forward name="success" path="/web-inf/jsp/loginsuccess.jsp" /> <forward name="failure" path="/web-inf/jsp/loginerror.jsp" /> </action> </action-mappings> Spring Framework の Bean 定義ファイル 連携させる Action クラスの Bean 定義を追加 <beans> <!-- 1. Actionクラスの定義 --> <bean name="/login" class="test.sampleaction"> <!-- 2. ActionクラスへのDI 定義 --> <property name="loginservice" ref="injectionclass" /> </bean> <bean name="injectionclass" class="test.login" /> - 63 -
</beans> 1. Action クラスの定義連携させる Action クラスを Bean として定義します name 属性の値は Struts 設定ファイルで定義した action タグの path 属性の値と一致させる必要があります class 属性の値は連携する Action クラスを定義します 2. Action クラスへの DI 定義 Action クラスに対して依存性を注入する場合は 3.3 Spring Framework アプリケーションの開発 と同様の手順で実現することが可能です bean タグの id 属性には / ( スラッシュ ) で始まる値を指定することができません そのため id 属性ではなく必ず name 属性を指定します bean タグにはワイルドカードは使用できません そのため Struts 設定ファイルで定義した action タグの path 属性の値にワイルドカードを使用している場合は 対応する bean タグを複数定義する必要があります Action クラス Action クラスを作成 Struts の Action クラスを継承したクラスを作成します 詳しい作成方法については 第 2 章 Struts の 2.3 Struts アプリケーションの開発 を参照してください package test; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.struts.action.action; import org.apache.struts.action.actionform; import org.apache.struts.action.actionmapping; import org.apache.struts.action.actionforward; import org.apache.struts.action.dynaactionform; public class SampleAction extends Action{ // DIコンテナのセッターインジェクションを利用したActionクラスへの依存性の注入 Login login = null; public void setloginservice(login login){ this.login = login; } - 64 -
public ActionForward execute(actionmapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm dynaform = (DynaActionForm)form; String userid = dynaform.getstring("userid"); if(userid.equals("")){ } userid = " ユーザ名を入力して下さい "; // Actionクラス内で呼び出す業務ロジックです boolean result = login.checkid(userid); if (true == result){ // 業務処理成功時 return map.findforward("success"); } // 業務処理失敗時 return map.findforward("failure"); } } 3.3.7 ibatis との連携 Spring Framework は ibatis と連携する事によって ユーザが開発したアプリケーションの DAO で O/R マッピング機能を利用する事が可能になります ibatis と連携する場合 以下のクラスを利用します org.springframework.orm.ibatis.sqlmapclienttemplate org.springframework.orm.ibatis.support.sqlmapclientdaosupport ibatis と連携する事によって Spring Framework アプリケーションで ibatis の効果を得られますが コネクションの管理機能は Spring Framework ibatis の双方がそれぞれ持っています 本製品においては Spring Framework でコネクションを管理する方法を推奨とします 3.4 Spring IDE による Spring Framework アプリケーションの作成 3.4.1 基本的な操作 本章では Spring IDE の基本的な操作について説明します Spring プロジェクトの作成 Spring IDE を使用して Spring プロジェクトを生成する手順を以下に示します - 65 -
1. メニュー [ ファイル ] > [ 新規 ] > [ プロジェクト ] を選択すると [ 新規プロジェクト ] 画面に移行します - 66 -
2. [Spring] > [Spring Project] を選択し [ 次へ (N)>] ボタンをクリックすると [New Spring Project] 画面に移行します - [ プロジェクト名 ] にプロジェクト名を入力します ここでは 例として Studentsearch という名前を入力しています - [ デフォルトロケーションの使用 ] チェックボックスは デフォルトでチェックを入れます チェックを入れていない場合 [ 参照 ] ボタンをクリックすることで所在パスを変更できます - [List of Config file suffixes] は Config ファイルの拡張子を設定します デフォルトは xml です - [Create a Java project] は Java プロジェクトを作成します チェックボックスは デフォルトでチェックを入れます 3. [ 終了 (F)] ボタンをクリックすると 以下のような Studentsearch という Spring Project が生成されます また 必要な Spring ライブラリが自動で追加されます Spring の構成ファイルの作成 Spring IDE を使用して Spring の構成ファイルを生成する手順を以下に示します - 67 -
1. メニュー [ ファイル ] > [ 新規 ] > [ その他 ] を選択すると [ 新規 ] 画面に移行します - 68 -
2. [Spring] > [Spring Bean Definition] を選択し [ 次へ (N)>] ボタンをクリックすると [Create a new Spring Bean Definition file] 画面に移行します - リストボックスから構成ファイルが所属する Spring プロジェクトフォルダを選択します - [ ファイル名 ] に構成ファイル名を入力します Spring プロジェクトのみで Spring Bean という構成ファイルを作成できます - 69 -
3. [ 次へ (N)>] ボタンをクリックすると [Select XSD namespace] 画面に移行します - XSD のネームスペースリストにおいて 必要となるネームスペースチェックボックスにチェックを入れ かつ当該ネームスペース名を選択することで 下記のリストボックスから異なるバージョンを選択できます バージョンを選択する場合 1 つのみのチェックボックスにチェックを入れます 選択しない場合 デフォルトのバージョンを利用します - 70 -
4. [ 次へ (N)>] ボタンをクリックすると [Select Bean Config Sets] 画面に移行します - リストから Bean Config Sets を選択し 当該 Spring Bean Definition ファイルを Bean Config Sets に追加します 上記の図においての test は Bean Config Sets です その作成方法については 複数の構成ファイルに分割する を参照してください 5. [ 終了 (F)] ボタンをクリックすると ターゲットプロジェクトに applicationcontext.xml というファイルが新規作成されます 詳細を以下に示します Spring プロジェクト ネイチャーの追加 [Add Spring Project Nature] を使用して 普通の Java プロジェクトを Spring プロジェクトに変更できます また [Remove Spring Project Nature] を使用して Spring プロジェクトを普通の Java プロジェクトに変更できます - 71 -
1. Java プロジェクトを選択し 右クリックメニューから [Spring Tools]>[Add Spring Project Nature] を選択します 当該プロジェクトが Spring Project Nature に追加されると 当該プロジェクトの右上の J フラグが S フラグに変更されます また - 72 -
必要な Spring ライブラリが自動で追加されます 詳細を以下に示します 複数の構成ファイルに分割する Spring IDE は Bean Config Sets をサポートします 複数の Bean Config File を Bean Config Sets に追加して 管理することができます Config Files を作成する手順を以下に示します 1. Spring Project を選択し 右クリックメニューを開き [ プロパティ ] を選択すると プロパティのダイアログボックスがポップアップされます ダイアログボックスから [Spring] >[Beans Support] を選択し Beans Support から [Config Files] タブインデックスを選択すると 以下の画面に移行します - 73 -
2. [Add] ボタンをクリックすると [Spring Bean Configuration Selection] 画面に移行します - 74 -
3. 追加する Config File を選択し [OK] をクリックすると Config Files が追加された 以下の画面に移行します 追加された後 Config Files が Spring Explorer ビューに表示されます Config Sets を作成する手順を以下に示します 1. Spring Project を選択して 右クリックメニューを開き [ プロパティ ] を選択すると プロパティのダイアログボックスがホップアップされます ダイアログボックスから [Spring]>[Bean Support] を選択し Bean Support から [Config Sets] タブインデックスを選択すると 以下の - 75 -
画面に移行します - 76 -
2. [New] ボタンをクリックすると [Create new Spring Bean Config Set] 画面に移行します - Name [Name] に Beans 構成セットの名前を指定します - Enable bean override [Enable bean override] のチェックボックスにチェックを入れると 同じ ID を持つ複数の Beans が最新の Beans に上書きされます ( 有効化した場合 Bean の複数定義はエラーとして扱いません ) - Is incomplete [Is incomplete] のチェックボックスにチェックを入れると この構成セットがほかの構成セットで定義されている Bean 設定を参照できます ( 有効化した場合 参照が解決されない Beans はエラーとして扱いません ) - Select Spring bean configuration files [Select Spring bean configuration files] リストボックスから必要となる Config files を選択します - 77 -
3. [OK] ボタンをクリックすると Config Sets が作成されます 詳細を以下に示します 4. [OK] ボタンをクリックすると Config Sets が Spring Explorer ビューに表示されます 詳細を以下に示します Config Sets を作成する前に Config Files を追加する必要があります Spring Explorer 画面の表示 Spring Explorer ビューは フィルタツリーであり 作業領域における全ての Spring プロジェクトを表示します Spring Explorer ビューを開く方式を以下に示します - 78 -
1. [ ウィンドウ ] > [ ビューの表示 ] > [ その他 ] を選択すると [ ビューの表示 ] 画面に移行します 2. [Spring] > [Spring Explorer] を選択すると Spring Explorer ビューが開かれます そのビューは 階層ビューであり 以下の内容を含みます - Spring プロジェクトにおける Beans Config ファイルおよび Beans Config Sets - BeansConfig ファイルに定義された Bean および異なるノードの調整アイコン - Bean ノードのプロパティ プロパティの値 選択したノードにより 右クリックメニューから 以下の機能を使用できます Springプロジェクトのプロパティを開く 対応するBean classを開く 対応するBean Configファイルを開く 対応するBean Graphを開き Beanの構成およびBean 間の依頼関係をグラフィカルに表示する Spring Explorerビューのツールバーから 以下の機能を使用できます - 79 -
Bean エレメントのソート ノードの縮小 Spring エレメントのカスタマイズやフィルタリング Spring 構成ファイルをグラフィカルに表示する Spring IDE では Bean Graph を使用して各 bean の構成および bean 間の依頼関係の参照を容易に行うことができます 1. Spring Explorer ビューから Beans Config file を選択し 右クリックメニューから [Open Graph] を選択し 当該ファイルにおける全ての Bean のグラフを開きます 2. [Open Graph] を選択し 以下の画面を開きます 3. Bean Config Sets を選択し 右クリックメニューから [Open Graph] を選択し Bean Config Sets における全ての Bean のグラフを開きます Config Sets グラフ画面に Config Sets における全ての Bean の構成および Bean 間の依頼関係が表示されます Spring AOP をグラフィカルに表示する Spring IDE では Spring AOP 機能をサポートします 主に Spring AOP Marker および Beans Cross References ビューという 2 つのサポートを提供しています Spring AOP Marker 機能 AOP Marker は bean 通知が定義された構成ファイルおよびその構成ファイルに対応する クラスを実装するメソッドに表示されます - 80 -
上記の図における赤い四角形で示した部分が AOP Marker です Java コンパイル環境において JDK 準拠レベルの値に 5.0 を指定した場合に AOP Marker が表示されます JDK 6.0 を指定した場合 AOP Marker が表示されません Beans Cross References ビュー Beans Cross References ビューは 主に AOP に関する内容 ( 定義された bean 実装された class ターゲットオブジェクトのメソッド advices など ) を表示します 当該ビューを使用して対応する内容を容易に位置づけることができるため AOP の機能サービスをより良く実現できます [ ウィンドウ ] > [ ビューの表示 ] > [ その他 ] > [Spring] > [Beans Cross References] を選択すると Beans Cross References ビューに移行します - 81 -
Beans Cross References ビューツールバーの のボタンを押すと ビューに関連ノードの内容が表示されます Beans Cross References ビューのツールバーの [View] > [ フィルタ ] から [ 可能なカスタマイズ ] 画面を開き ビューにおけるノード内容のフィルタを行うことができます 詳細を以下に示します 上記画面に示すように [advised by] がチェックされた場合は [advised by] の内容がビューでフィルタリングされます チェック無しのプロジェクトは ビューに表示されます 3.4.2 Struts と連携するアプリケーションの作成 この項では Struts と Spring Framework が連携する形態のアプリケーションの作成する場合の開発環境の設定について Studentsearch という例題アプリケーションを使用して説明します - 82 -
プロジェクトの作成 1. Web アプリケーションプロジェクトを新規作成します - 83 -
2. プロジェクト名 Studentsearch を入力します 3. 新規作成された Studentsearch プロジェクトが Project Explorer に表示されます - 84 -
4. Studentsearch プロジェクトを選択した状態で [ 新規 ] > [ その他 ] を選択して [Struts サポートの追加 ] ウィザードを選択します 詳細は [Struts サポート ] ウィザードの操作手順 を参照してください - 85 -
5. Struts サポートの追加後 Studentsearch プロジェクトは以下のような状態になります - 86 -
6. Studentsearch プロジェクトを右クリックしてコンテキストメニューから [Spring Tools] > [Add Spring Project Nature] を選択して Spring プロジェクト ネイチャーを追加します - 87 -
7. Spring プロジェクト ネイチャーの追加後 Studentsearch プロジェクトは以下のような状態になります Web アプリケーションの作成からではなく [Spring Project] として作成したプロジェクトに対して [Struts サポートの追加 ] を行うこともできます 3.5 Spring Framework の運用 保守 3.5.1 起動 停止 Spring Framework は IJServer ワークユニット上で動作します IJServer ワークユニットは Interstage 管理コンソールやコマンドを利用して起動 停止をすることができます IJServer ワークユニットの起動 停止については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください Spring Framework の環境設定については 3.2 Spring Framework の環境作成 を参照してください 3.5.2 ログ 本製品の Spring Framework で提供するログ機能に標準ログがあります 標準ログは以下の 2 つから構成されます システムログ Spring Framework の稼働状態を表すインフォメーションや エラー情報が出力されます 性能ログ Spring Framework 内部での実行時間が出力されます システムログおよび性能ログは アプリケーションの開始から終了までにおいて Spring Framework 上の特定の契機でメッセージを出力します メッセージには様々な情報が含まれており これによりボトルネックの早期検出や処理の改善を分析するための情報として利用することができます システムログおよび性能ログの出力契機について以下に記載します - 88 -
図 3.5 システムログの出力契機 図 3.6 性能ログの出力契機 システムログおよび性能ログの詳細については 第 7 章標準ログ を参照してください 3.5.3 複数 IJServer による分離型での運用 Spring Framework では IJServer 間連携機能を利用することによって アプリケーションを Web 層 AP 層に分離して運用することができます Spring Framework で管理する業務アプリケーション間で処理を連携する運用構成図を以下に示します - 89 -
図 3.7 運用形態が基本型の場合 図 3.8 運用形態が分離型の場合 運用形態が分離型の場合 IJServer のプロセス多重度を設定することで Web 層の業務アプリケーションから呼び出される AP 層の業務アプリケーションの処理を分散することが可能になります 運用形態が分離型の場合における IJServer の起動 停止順序を以下に示します ここでは Web 層の IJServer を Web アプリケーションサーバ AP 層の IJServer を 業務アプリケーションサーバ とします - 90 -
図 3.9 [Web アプリケーションサーバおよび業務アプリケーションサーバの起動 停止順序 ] Web アプリケーションサーバおよび業務アプリケーションサーバの各運用操作の詳細は Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください 3.6 注意事項 3.6.1 Spring Framework アプリケーションで JTA を利用する場合の注意事項 Spring Framework アプリケーションで JTA を利用する場合の注意事項について説明します IJServer の作成 Spring Framework アプリケーションで JTA を利用する場合 IJServer タイプを WEB アプリケーションのみ運用 以外で作成する必要があります JTA のトランザクション属性の利用 Spring Framework アプリケーションで JTA を利用する場合 トランザクション属性の一部が利用できません トランザクション属性の利用可否について以下に示します トランザクション属性既存トランザクションなし既存トランザクションあり REQUIRED SUPPORTS MANDATORY REQUIRES_NEW ( 注 1) NOT_SUPPORTED ( 注 1) NEVER NESTED ( 注 2) 注 1 ) 未サポートのため利用できません 利用した場合は Spring org.springframework.transaction.transactionsuspensionnotsupportedexceptionがスローされます Framework が持つ例外 注 2) 未サポートのため利用できません 利用した場合は J2EE 規約の例外 javax.transaction.notsupportedexception がスローされます - 91 -
3.6.2 Spring Framework アプリケーション作成時の注意事項 Spring Framework アプリケーション作成時の注意事項について説明します Bean のライフサイクルについて Spring Framework は定義された Bean をデフォルトで Singleton として管理しています 変更したい場合には Spring Framework が提供している Bean スコープ機能を利用してください Symfoware のエラーコードに対応した例外クラスとのマッピング情報定義ファイルについて クラスパス上に 本製品が提供する Symfoware のエラーコードに対応した例外クラスとのマッピング情報定義ファイル (sql-error-codes.xml) と同名のファイルが存在した場合 Symfoware のエラーコードに対応した例外クラスが正常に返却されない可能性があります 3.7 チューニング OS の設定値など 特にチューニングは必要ありません 3.8 トラブルシューティング 3.8.1 アプリケーション配備時の異常 アプリケーション配備時におけるトラブルシューティングに関して特に記載することはありません 3.8.2 ワークユニット起動時の異常 アプリケーションの活性化に失敗する 以下の可能性があります ワークユニットの環境設定に誤りがある AOP 機能を利用している場合 必要なモジュールがクラスパス上に存在しない IJServer 間連携機能を利用する場合において ネーミングサービスに IJServer 間連携用の EJB アプリケーションが登録されていない 3.2 Spring Framework の環境作成 および 3.3 Spring Framework アプリケーションの開発 を参照して設定に誤りがないか確認してください 3.8.3 アプリケーション実行時の異常 Bean が見つからない 以下の可能性があります アプリケーションに記述した BeanId 名が Bean 定義ファイルに記述されていない アプリケーションに記述した BeanId 名と Bean 定義ファイルに記述した BeanId 名が一致していない ( アルファベットの大文字と小文字は区別されます ) IJServer 間連携機能を利用する場合において BeanId プロパティに指定した値が別の IJServer 上の Bean 定義ファイルに記述した BeanId 名と一致していない ( アルファベットの大文字と小文字は区別されます ) 3.2 Spring Framework の環境作成 および 3.3 Spring Framework アプリケーションの開発 を参照して Bean 定義ファイルへの記述方法に誤りがないか確認してください Bean 定義ファイルがみつからない 以下の可能性があります - 92 -
IJServer 間連携機能を利用する場合において 別の IJServer のクラスパス上に Bean 定義ファイル (applicationcontext.xml) が存在しない IJServer 間連携機能を利用する場合 別の IJServer に用意する業務アプリケーションの Bean 定義ファイル名は applicationcontext.xml である必要があります ( アルファベットの大文字と小文字は区別されます ) IJServer 間連携において 通信に失敗する 以下の可能性があります 対象の IJServer が起動していない 対象の IJServer のタイプが Web アプリケーションと EJB アプリケーションを同一 JavaVM で運用 となっている 対象の IJServer の環境設定に誤りがある 3.2 Spring Framework の環境作成 および 3.3 Spring Framework アプリケーションの開発 を参照して IJServer 間連携の設定に誤りがないか確認してください 実装と異なる結果を返却する 以下の可能性があります 同一名の Bean 定義ファイルがクラスパス上に複数存在している 同一名のアプリケーション実装クラスがクラスパス上に複数存在している クラスパス上に同一名のファイルやクラスが存在した場合 その読み込み順番は IJServer のクラスローダ構成に依存します Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照して資源が正しい場所に格納されているかを確認してください Symfoware のエラーコードに対応した例外クラスが正しく返却されない 以下の可能性があります クラスパス上に本機能が利用するマッピング情報定義ファイル (sql-error-codes.xml) と同一名のファイルが存在している sql-error-codes.xml は Spring Framework が利用する固定名の定義ファイルです エラーコードとのマッピング以外の目的で同一名のファイルを使用することはできません マッピング以外の目的でこのファイル名を利用している場合は ファイル名を変更してください マッピング目的で利用している場合は 内容に誤りがないか確認してください 問題を取り除いたあと IJServer ワークユニットを再起動してください メモリ不足が発生する 以下の可能性があります 大量のリクエストが同時に長時間に渡り送信されており Spring Framework の DI コンテナや AOP 機能を利用するために生成されたインスタンスの回収処理が追いついていない Spring Framework では クラス間の依存性をなくすために DI コンテナがクラスのインスタンスをデフォルト Singleton として管理していますが DI コンテナや AOP 機能など Spring Framework が保持する機能を実現するために必要なインスタンスは Singleton で管理されておらず リクエストのたびに新たにインスタンスが生成されます 大量のリクエストが同時に長時間に渡り送信された場合 新たなインスタンスが生成され続けることによりメモリ不足が発生する可能性があるため 運用に応じて十分なメモリを割り当ててください - 93 -
第 4 章 ibatis 4.1 ibatis の概要 ibatis は リレーショナルデータベースのテーブル構造を Java オブジェクトにマッピングする機能を持った永続性フレームワークです ibatis を利用することで Java オブジェクトとリレーショナルデータベースの構造的な違いによるインピーダンスミスマッチが解消できます また データベースアクセス処理に必要なデータベース接続情報および Java オブジェクトとリレーショナルデータベースのテーブル構造を対応付ける SQL マッピング情報を業務アプリケーションから分離して XML ファイルで管理することができます これにより データベース処理に必要な Java コードを減少させて作成を容易にできます また データベースの接続に変更が生じた場合も Java コードに影響がありません ibatis は以下の流れで処理をします 1. Java オブジェクトとリレーショナルデータベースのテーブル構造の対応付けを XML ファイルに定義する (SQL Map ファイルの作成 ) 2. トランザクションマネージャ データソースファクトリ SQL Map ファイルの指定などデータベース接続情報を XML ファイルに定義する (SQL Map 設定ファイルの作成 ) 3. 業務アプリケーションから ibatis の API を介してデータベースへアクセスする 図 4.1 ibatis の処理の流れ ibatis 2.3.4が提供する機能と 本製品に含まれるiBATISが提供する機能について記載します 機能名 ibatis 2.3.4 本製品で提供するiBATIS O/R マッピング機能 コネクション管理 ( 注 1) ( 注 1) トランザクション管理 ( 注 1) ( 注 1) 一貫したログの出力 ( 注 2) 注 1) 簡易的な管理機能を提供します コネクション管理 トランザクション管理は Spring Frameworkで管理することを推奨します 注 2) Spring FrameworkまたはStrutsと連携した場合のみ利用可能です - 94 -
4.1.1 O/R マッピング オブジェクト指向言語である Java では リレーショナルデータベースを扱う場合 テーブル構造と Java オブジェクトの対応付けが必要となります リレーショナルデータベース設計とオブジェクト指向設計では 設計方法が異なるため この対応付けが煩雑です これをインピーダンスミスマッチといいます インピーダンスミスマッチを解決するためには テーブル構造のデータをオブジェクト構造のデータに対応付けるためのコードを作成する必要があります したがって データ構造が複雑になると 煩雑な作業が多くなりバグを埋め込む危険性が高くなります O/R マッピングは リレーショナルデータベースのテーブル構造を Java オブジェクトに対応付けてインピーダンスミスマッチを解消する機能です ibatis の O/R マッピングは リレーショナルデータベースのテーブル構造と Java オブジェクトを対応付けするために SQL 文とそれに対応する Java クラスの情報を SQL マッピング情報ファイルとして XML ファイルで記述します 業務アプリケーションの実装時 データベース操作にかかわる処理に必要な Java コードを減少させ開発効率を向上させることが可能です また データベース接続情報をデータベース接続ファイルとして XML で記述します これにより 業務アプリケーションからデータベースアクセス処理を分離することができ データベースの変更などの際に修正を局所化できます 図 4.2 インピーダンスミスマッチの例 4.1.2 コネクション管理 データベースのコネクションを ibatis で取得することができます コネクションプーリングなどコネクション管理に関する処理を業務アプリケーションから分離することができます ibatis のコネクション管理方法には SIMPLE DBCP JNDI の 3 つがあります データソースファクトリ特徴備考 SIMPLE DBCP JNDI JDBC2.0 に対応したデータソースのシンプルな実装です 軽量で手軽なコネクションプーリングのソリューションです Jakarta DBCP を使用します JNDI コンテキストからコンテナのデータソースの実装を利用します プロパティファイルにデータベース接続用のユーザ名 パスワードを平文で記述します プロパティファイルにデータベース接続用のユーザ名 パスワードを平文で記述します アプリケーションサーバからコネクションプールが提供されている場合に使用してください Interstage Application Server では パスワードは暗号化されます - 95 -
4.1.3 トランザクション管理 トランザクション管理サービスの設定を ibatis ですることができます JDBC JTA EXTERNAL の 3 つのトランザクションマネージャが ibatis に含まれています トランザクションマネージャ特徴備考 JDBC JTA EXTERNAL デフォルトでは 自動コミットします Connection の commit() と rollback() メソッド経由でトランザクションの制御が可能です JTA グローバルトランザクションを使用します ユーザ自身でトランザクションを管理することが必要です JNDI リソースから usertransaction プロパティセットを必要とします 4.1.4 一貫したログの出力 Interstage Business Application Server では標準ログとして システムログ 性能ログを出力することができます システムログは 業務アプリケーションからの ibatis の呼び出し時と ibatis 復帰時に出力します また ibatis からのリレーショナルデータベース呼び出し時と復帰時にログに出力します 性能ログは 業務アプリケーションからの ibatis の呼び出しから復帰までの時間を ibatis 復帰時に出力します また ibatis からのリレーショナルデータベース呼び出しから復帰までの時間もリレーショナルデータベースからの復帰時に出力します コンテキスト ID を付加してログを出力する事によって 一連のアプリケーションが出力したログを選定する事を可能とし一貫したログ情報を取得できます 本機能の詳細については 第 7 章標準ログ を参照してください 4.2 ibatis の環境作成 ibatis を利用するためには 以下の手順で環境を作成します データベース接続の設定 IJServer の作成 クラスパスの設定 ibatis アプリケーションの配備 4.2.1 データベース接続の設定 データベース接続させるために JDBC データソース定義を登録します 操作は Interstage 管理コンソールを使用して行います [ システム ] > [ リソース ] > [JDBC] > [ 新規作成 ] タブ データベース接続の設定方法などについては Interstage Application Server / Interstage Web Server J2EE ユーザーズガイド を参照してください 4.2.2 IJServer の作成 ibatis アプリケーションを動作させるために必要な IJServer を作成します Interstage 管理コンソールを使用して作成します [ システム ] > [ ワークユニット ] > [ 新規作成 ] タブ IJServer の作成方法については Interstage Application Server / Interstage Web Server J2EE ユーザーズガイド を参照してください - 96 -
4.2.3 クラスパスの設定 IJServer のクラスパスへ ibatis が動作するために必要な jar ファイルを設定します Interstage 管理コンソールを使用して IJServer ワークユニットで ibatis が動作するために必要な jar ファイルをクラスパスへ設定します [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 環境設定 ] タブ クラスパスの設定方法については Interstage Application Server / Interstage Web Server J2EE ユーザーズガイド を参照してください 以下の jar ファイルを設定します [Interstageのインストールディレクトリ]\BAS\ibatis23\lib\ibatis23.jar [Interstageのインストールディレクトリ]\BAS\lib\commons-logging-1.1.1.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwlogging.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwutils50.jar [Interstageのインストールディレクトリ]\APC\lib\uji.jar [Interstageのインストールディレクトリ]\APC\lib\ujief.jar [Interstageのインストールディレクトリ]\APC\lib\ujilog.jar [Symfoware Server クライアント機能インストールディレクトリ ]\JDBC\fjjdbc\lib\fjsymjdbc2.jar( 注 ) /opt/fjsvibs/ibatis23/lib/ibatis23.jar /opt/fjsvibs/lib/commons-logging-1.1.1.jar /opt/fjsvibs/lib/apfwlogging.jar /opt/fjsvibs/lib/apfwutils50.jar /opt/fjsvwebc/lib/uji.jar /opt/fjsvapcef/lib/ujief.jar /opt/fjsvapclg/lib/ujilog.jar [Symfoware Server クライアント機能インストールディレクトリ ]\JDBC\fjjdbc\lib\fjsymjdbc2.jar( 注 ) 注 ) 使用するデータベースに応じて jar を設定してください 4.2.4 アプリケーションの配備 作成した IJServer へ ibatis アプリケーションを配備します Interstage 管理コンソールを使用して IJServer ワークユニットへ ibatis アプリケーションファイルを配備します [ システム ] > [ ワークユニット ] > ワークユニット名 > [ 配備 ] タブ アプリケーションの配備の方法については Interstage Application Server / Interstage Web Server J2EE ユーザーズガイド を参照してください 4.3 ibatis アプリケーションの開発 本項では ibatisアプリケーションの開発の手順を説明します ibatisの基本設計 ibatisアプリケーションに必要な設定ファイルの作成 - 97 -
ibatis アプリケーションの実行クラスを作成 (Spring Framework と連携しない場合 ) Struts との連携 Spring Framework との連携 Interstage Studio 上で ibatis アプリケーションを作成する場合は Web アプリケーションプロジェクトなどの Java ネイチャーが有効なプロジェクトで作成してください 4.3.1 ibatis の基本設計 ibatis アプリケーション作成の前にデータベースの設計を実施してください データベースに登録されたテーブル情報からオブジェクトとしてまとめる要素を決定し オブジェクトを操作するための SQL 文を設計してください 4.3.2 ibatis アプリケーションに必要な設定ファイルの作成 ibatis アプリケーションに必要となる下記の設定ファイルを作成します SQL Map 設定ファイル SQL Map ファイル SQL Map 設定ファイル SQL Map ファイルのファイル名は任意ですが applicationcontext.xml や struts-config.xml など他のフレームワークで使用されるファイル名と同じにしないでください 設定ファイルで使用できるタグの詳細については ibatis オリジナルのマニュアルを参照してください SQL Map 設定ファイル SQL Map の大本となる XML 設定ファイルです 設定ファイルの中で JDBC DataSource と SQL Map のプロパティ設定を行います SQL Map 設定ファイルの例を下記に示します <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmapconfig PUBLIC "-//ibatis.com//dtd SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlmapconfig> <transactionmanager type="jdbc"> <datasource type="jndi"> <property name="datasource" value="java:comp/env/jdbc/ibatis_ds"/> </datasource> </transactionmanager> - 98 -
<sqlmap resource="bas_budget_sqlmap.xml" /> </sqlmapconfig> 下記にタグの説明を記載します エレメント 属性 説明 transactionmanager type 使用するトランザクションタイプを設定します datasource type 使用するデータソースタイプを設定します property name プロパティの名前を設定します value プロパティの値を設定します sqlmap resource Sql Mapファイル名を設定します 作成したSQL Map 設定ファイルはアプリケーションと一緒に配備します SQL Map 設定ファイルの雛形は下記に格納してあります サーバパッケージ [Interstage のインストールディレクトリ ]\BAS\ibatis23\sample\SqlMapConfig.xml 開発環境パッケージ [Interstage のインストールディレクトリ ]\BAS\sample\openjava\iBATIS\SqlMapConfig.xml /opt/fjsvibsjf/ibatis23/sample/sqlmapconfig.xml SQL Map ファイル オブジェクトを操作するための SQL 文やオブジェクトへのマッピング情報を記述します SQL Map ファイルの例を下記に示します <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.apache.org//dtd SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlmap namespace="bas_budget"> <resultmap class="com.fujitsu.interstage.apfw.samples.orm.bas.budget" id="baseresultmap"> <result column="id" jdbctype="decimal" property="id" /> <result column="budget" jdbctype="decimal" property="budget" /> </resultmap> - 99 -
<insert id="insert" parameterclass="com.fujitsu.interstage.apfw.samples.orm.bas.budget"> insert into BAS.BUDGET (ID, BUDGET) values (#id:decimal#, #budget:decimal#) </insert> <update id="update" parameterclass="com.fujitsu.interstage.apfw.samples.orm.bas.budget"> update BAS.BUDGET set BUDGET = #budget:decimal# where ID = #id:decimal# </update> <select id="select" parameterclass="com.fujitsu.interstage.apfw.samples.orm.bas.budget" resultmap="baseresultmap"> select ID, BUDGET from BAS.BUDGET where ID = #id:decimal# </select> <delete id="deletebyprimarykey" parameterclass="com.fujitsu.interstage.apfw.samples.orm.bas.budget"> delete from BAS.BUDGET where ID = #id:decimal# </delete> </sqlmap> 下記にタグの説明を記載します エレメント属性説明 resultmap result insert update select delete class id columun jdbctype property SQL 文の実行によって生成された ResultSet のカラムと Java オブジェクトのプロパティをマッピングします 結果をマッピングするクラスを指定します ステートメントが参照するために使用する識別子を指定します マッピングするデータベースのカラム名を設定します セットするプロパティの java プロパティ型を明示的に指定するために設定します SQL 文によって返された結果をマッピングするオブジェクトのプロパティ名を設定します 挿入処理をするためのステートメントを設定します 更新処理をするためのステートメントを設定します 検索処理をするためのステートメントを設定します 削除処理をするためのステートメントを設定します 作成した SQL Map ファイルはアプリケーションと一緒に配備します SQL Map ファイルの雛形は下記に格納してあります - 100 -
サーバパッケージ [Interstage のインストールディレクトリ ]\BAS\ibatis23\sample\SqlMap.xm 開発環境パッケージ [Interstage のインストールディレクトリ ]\BAS\sample\openjava\iBATIS\SqlMap.xml /opt/fjsvibsjf/ibatis23/sample/sqlmap.xml 4.3.3 ibatis アプリケーションの実行クラスの作成 (Spring Framework と連携しない場合 ) SqlMapClient を利用するクラスの作成 IbatisExecutor.java package main; import com.ibatis.common.resources.resources; import com.ibatis.sqlmap.client.sqlmapclient; import com.ibatis.sqlmap.client.sqlmapclientbuilder;... public class IbatisExecutor{ private SqlMapClient sqlmap; public IbatisExecutor(){ try{ // (1) String resource = "sqlmapconfig.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlmap = SqlMapClientBuilder.buildSqlMapClient(reader); } public void insert(budget budget){ - 101 -
// (2) sqlmap.insert("bas_budget.ibatorgenerated_insert", budget); (1)SQL Map 設定ファイルの読み込み SQL Map 設定ファイルの読み込みをします この情報を元に SqlMapClient のインスタンスを作成します (2)SQL の実行 SQL Map ファイルで記述した SQL 文を実行します 4.3.4 Struts との連携 Struts と ibatis を連携させることにより Struts を利用して構成したアプリケーションにおいても ibatis の機能を利用することが可能になります 連携のために必要な設定はありません SqlMapClient を呼び出すクラスを ActionServlet から呼び出してください 4.3.5 Spring Framework との連携 Spring Framework が提供する Dao フレームワークの SqlMapClientDaoSupport を使用します BudgetDAO.java package com.fujitsu.interstage.apfw.samples.dao.bas.; import com.fujitsu.interstage.apfw.samples.orm.bas.budget public interface BudgetDAO { //(1) void insert(budget budget); } (1) メソッド宣言 使用するメソッドを宣言します BudgetDaoImpl.java package com.fujitsu.interstage.apfw.samples.dao.bas; import org.springframework.orm.ibatis.support.sqlmapclientdaosupport; import org.springframework.dao.dataaccessexception; // (1) public class BudgetDaoImpl extends SqlMapClientDaoSupport implements BudgetDao { - 102 -
// (2) public void insert(budget budget) throws DataAccessException { getsqlmapclienttemplate().insert("bas_budget.insert ", budget); } } (1)SqlMapClientDaoSupportを利用した実装クラスの作成 Spring Frameworkが提供するSqlMapClientDaoSupportを継承して実装クラスを作成します (2) メソッドの作成 getsqlmapclienttemplate() を利用してSQL 文を発行するメソッドを作成します Spring Frameworkの設定ファイルで以下のように設定します applicationcontext.xml <beans> <!-- SqlMap setup for ibatis Database Layer --> <!-- (1) --> <bean id="sqlmapclientfact" class="org.springframework.orm.ibatis.sqlmapclientfactorybean"> <property name="configlocation"> <value> sqlmapconfig.xml</value> </property> <property name="datasource"> <ref local="datasource" /> </property> </bean> <!-- (2) --> <bean id="budgetdao" class="com.fujitsu.interstage.apfw.samples.orm.bas.budgetdaoimpl"> <property name="sqlmapclient" ref="sqlmapclientfact"/> </bean> </beans> (1)iBATIS クライアントの登録 SqlMapClientFactoryBean を設定します (2)Dao の実装の登録 - 103 -
Dao の実装の sqlmapclient プロパティに (1) で設定した bean を指定します SQL Map 設定ファイルで以下のように設定します sqlmapconfig.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmapconfig PUBLIC "-//ibatis.com//dtd SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlmapconfig> <!-- (1) --> <sqlmap resource="bas_budget_sqlmap.xml" /> </sqlmapconfig> (1)Sql Map ファイルの設定 Sql Map ファイルを設定します 4.4 ibatis の運用 保守 4.4.1 起動 停止 ibatis は IJServer ワークユニット上で動作します IJServer ワークユニットは Interstage 管理コンソールやコマンドを利用して起動 停止をすることができます IJServer ワークユニットの起動 停止については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください ibatis の環境設定については 4.2 ibatis の環境作成 を参照してください 4.4.2 ログ 本製品の ibatis で提供するログ機能に標準ログがあります 標準ログは以下の 2 つから構成されます システムログ ibatis の稼働状態を表すインフォメーションや エラー情報が出力されます 性能ログ ibatis 内部での実行時間が出力されます システムログおよび性能ログは アプリケーションの開始から終了までにおいて Spring Framework 上の特定の契機でメッセージを出力します メッセージには様々な情報が含まれており これによりボトルネックの早期検出や処理の改善を分析するための情報として利用することができます システムログおよび性能ログの出力契機について以下に記載します - 104 -
図 4.3 システムログの出力契機 図 4.4 性能ログの出力契機 4.5 注意事項 4.5.1 データベース固有の注意点 Symfoware V9.1 以前のバージョンでは以下の機能制限があります 項番制限事項対処方法解除予定 1 SQL マップ設定ファイルの <settings> エレメントの defaultstatementtimeout は未サポートです 2 SQL マップファイルのステートメントエレメントの fetchsize 属性は未サポートです 3 SQL マップファイルのステートメントエレメントの timeout 属性は未サポートです ありません 実行時にエラーになります ありません 実行時にエラーになります ありません 実行時にエラーになります 4 バッチ処理は利用できません ありません 実行時にエラーになりま す 5 ibatis のキーの自動生成機能は利用できません手動でキーを設定してください 未定 6 SQL の COUNT 関数を利用する場合は AS 演算子を使用してください ありません AS 演算子を使用しない場合 実行時にエラーになります Symfoware V10 Symfoware V10 Symfoware V10 Symfoware V10 未定 - 105 -
4.6 チューニング OS の設定値など 特にチューニングは必要ありません 4.7 トラブルシューティング 4.7.1 アプリケーション実行時の異常 アプリケーションの実行時に 指定されたメソッドは当ドライバではサポートされていません が出力される SymfowareV9.2を使用している場合 "4.5.1 データベース固有の注意点 " を参照してください - 106 -
第 5 章 TERASOLUNA 5.1 TERASOLUNAの概要 TERASOLUNAフレームワークは Spring Frameworkをベースにして機能拡張を行ったフレームワークです ここでは TERASOLUNAの概要を説明します 5.1.1 提供機能 図 5.1 フレームワークの組み合わせモデル TERASOLUNA フレームワーク TERASOLUNA フレームワーク ラインナップのうち 次の Java フレームワークを提供します Java フレームワーク TERASOLUNA Server Framework for Java (Web 版 ) 2.0.2.0 TERASOLUNA Server Framework for Java (Rich 版 ) 2.0.2.0 TERASOLUNA Batch Framework for Java 2.0.1.0 TERASOLUNA Server Framework for Java (Web 版 ) Web アプリケーション開発に必要な機能を備えた汎用フレームワークです Spring Framework をベースとしています 以降 TERASOLUNA-Web と表記します バージョン TERASOLUNA Server Framework for Java (Rich 版 ) リッチクライアントアプリケーション開発に必要な機能を備えた汎用フレームワークです Spring Framework をベースとしています 以降 TERASOLUNA-Rich と表記します TERASOLUNA Batch Framework for Java Java によるバッチアプリケーション開発を実現するためのフレームワークです バッチアプリケーションでは 限られたリソースでの大量データの処理や バッチ処理特有のトランザクション管理が求められます これらバッチアプリケーション特有の要件をフレームワークでサポートすることで システムの品質向上 開発の効率化を実現します 以降 TERASOLUNA-Batch と表記します TERASOLUNA-Batch では 次のジョブ実行をサポートしています - IJServer 上での非同期バッチデーモンを使用しない非同期ジョブ - IJServer 上での非同期バッチデーモンを使用した非同期ジョブ 以降 上記の Java フレームワークを TERASOLUNA フレームワークと表記します また TERASOLUNA フレームワークを使用して開発 運用するアプリケーションを TERASOLUNA アプリケーションと表記します - 107 -
本製品に含まれる TERASOLUNA フレームワークでは 以下の機能もサポートします Symfoware をサポートします TERASOLUNA Batch Framework for Java と本製品に含まれる TERASOLUNA Batch Framework for Java が提供する機能について記載します 機能名 TERASOLUNA Batch Framework for Java 2.0.1.0 スタンドアロンでのジョブ実行 アプリケーションサーバ上でのジョブ実行 同一 Java VM 上での非同期バッチデーモンの複数起動 本製品で提供する TERASOLUNA Batch Framework for Java TERASOLUNA Server Framework for Java (Web 版 )/TERASOLUNA Server Framework for Java (Rich 版 ) において 提供機能に関する差分はありません ブランクプロジェクトとサンプルプロジェクト 次のプロジェクトを提供します これらのプロジェクトをインポートすることで TERASOLUNA アプリケーションの開発環境を構築することができます ブランクプロジェクト TERASOLUNA アプリケーション開発環境を構築するためのものです ブランクプロジェクトの使用方法は 5.3 TERASOLUNA の開発 を参照してください サンプルプロジェクト TERASOLUNA アプリケーションのサンプルです サンプルプロジェクトの使用方法は 付録 A TERASOLUNA のサンプルアプリケーション を参照してください 5.1.2 システムモデル 次のシステムモデルをサポートします オンラインモデルオンラインモデルとは TERASOLUNA Server Framework for Java を使用し Web ブラウザまたはリッチクライアントからのリクエスト要求を処理するモデルです - 108 -
バッチモデルバッチモデルとは TERASOLUNA Batch Framework for Java を使用し バッチ処理を行うモデルです オンバッチ連携モデルオンバッチ連携モデルとは オンラインモデルとバッチモデルが連携し Web ブラウザまたはリッチクライアントから受け付けたリクエスト要求の延長上で バッチ処理を行うモデルです スレッド制御などのパフォーマンスを考慮すると オンラインモデルとバッチモデルを異なるワークユニット上で構築したうえで連携することを推奨します 5.2 TERASOLUNA の環境作成 次の手順で TERASOLUNAアプリケーションの動作に必要な環境を作成します IJServerの作成 ( 共通 ) クラスパスの設定 ( 共通 ) - 109 -
ワークマネージャの設定 (TERASOLUNA-Batch のみ ) TERASOLUNA フレームワークが出力するログの設定 ( 共通 ) 5.2.1 IJServer の作成 TERASOLUNA アプリケーションを動作させるために必要な IJServer を作成します IJServer の作成 Interstage 管理コンソールを使用して IJServer ワークユニットを作成します [ システム ] > [ ワークユニット ] > [ 新規作成 ] タブ 5.2.2 クラスパスの設定 IJServer のクラスパスへ TERASOLUNA が動作するために必要な jar ファイルを設定します クラスパスの設定 Interstage 管理コンソールを使用して IJServer ワークユニットで TERASOLUNA が動作するために必要な jar ファイルをクラスパスへ設定します [ システム ] > [ ワークユニット ] > " ワークユニット名 " > [ 環境設定 ] タブ 以下の jar ファイルを設定します 共通 すべての TERASOLUNA フレームワークで必要なクラスパスを 以下に示します [Interstage のインストールディレクトリ ]\APC\lib\uji.jar [Interstage のインストールディレクトリ ]\APC\lib\ujief.jar [Interstage のインストールディレクトリ ]\APC\lib\ujilog.jar [Interstage のインストールディレクトリ ]\BAS\lib\apfwlogging.jar [Interstage のインストールディレクトリ ]\BAS\lib\apfwutils50.jar [Interstage のインストールディレクトリ ]\BAS\lib\cglib-nodep-2.1_3.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-beanutils-1.8.0.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-dbcp-1.2.2.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-digester-1.8.1.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-jxpath-1.3.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-lang-2.4.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-logging-1.1.1.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-pool-1.4.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-validator-1.3.1.jar [Interstage のインストールディレクトリ ]\BAS\lib\jakarta-oro-2.0.8.jar [Interstage のインストールディレクトリ ]\BAS\ibatis23\lib\ibatis23.jar [Interstage のインストールディレクトリ ]\BAS\spring25\lib\spring25.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-commons.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-dao.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-ibatis.jar [Interstage のインストールディレクトリ ] BAS etc def log_inf ( 使用するデータベースの JDBC ドライバの jar) - 110 -
/opt/fjsvwebc/lib/uji.jar /opt/fjsvapcef/lib/ujief.jar /opt/fjsvapclg/lib/ujilog.jar /opt/fjsvibs/lib/apfwlogging.jar /opt/fjsvibs/lib/apfwutils50.jar /opt/fjsvibs/lib/cglib-nodep-2.1_3.jar /opt/fjsvibs/lib/commons-beanutils-1.8.0.jar /opt/fjsvibs/lib/commons-dbcp-1.2.2.jar /opt/fjsvibs/lib/commons-digester-1.8.1.jar /opt/fjsvibs/lib/commons-jxpath-1.3.jar /opt/fjsvibs/lib/commons-lang-2.4.jar /opt/fjsvibs/lib/commons-logging-1.1.1.jar /opt/fjsvibs/lib/commons-pool-1.4.jar /opt/fjsvibs/lib/commons-validator-1.3.1.jar /opt/fjsvibs/lib/jakarta-oro-2.0.8.jar /opt/fjsvibs/ibatis23/lib/ibatis23.jar /opt/fjsvibs/spring25/lib/spring25.jar /opt/fjsvibs/terasoluna/lib/terasoluna-commons.jar /opt/fjsvibs/terasoluna/lib/terasoluna-dao.jar /opt/fjsvibs/terasoluna/lib/terasoluna-ibatis.jar /opt/fjsvibs/etc/def/log_inf ( 使用するデータベースの JDBC ドライバの jar) TERASOLUNA-Web の場合 共通のクラスパスに加えて 以下の jar ファイルをクラスパスに追加します [Interstage のインストールディレクトリ ]\BAS\lib\antlr-2.7.7.jar [Interstage のインストールディレクトリ ]\BAS\lib\aspectjweaver.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-fileupload-1.2.1.jar [Interstage のインストールディレクトリ ]\BAS\spring25\lib\spring-webmvc-struts25.jar [Interstage のインストールディレクトリ ]\BAS\struts12\lib\struts12.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-thin.jar /opt/fjsvibs/lib/antlr-2.7.7.jar /opt/fjsvibs/lib/aspectjweaver.jar /opt/fjsvibs/lib/commons-fileupload-1.2.1.jar /opt/fjsvibs/spring25/lib/spring-webmvc-struts25.jar /opt/fjsvibs/struts12/lib/struts12.jar /opt/fjsvibs/terasoluna/lib/terasoluna-thin.jar TERASOLUNA-Rich の場合 共通のクラスパスに加えて 以下の jar ファイルをクラスパスに追加します [Interstage のインストールディレクトリ ]\BAS\lib\aspectjweaver.jar [Interstage のインストールディレクトリ ]\BAS\lib\castor-1.0.5.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-collections-3.2.1.jar [Interstage のインストールディレクトリ ]\BAS\lib\commons-fileupload-1.2.1.jar [Interstage のインストールディレクトリ ]\BAS\lib\jaxrpc.jar - 111 -
[Interstage のインストールディレクトリ ]\BAS\lib\spring-modules-validation-0.8.jar [Interstage のインストールディレクトリ ]\BAS\lib\velocity-1.6.2.jar [Interstage のインストールディレクトリ ]\BAS\lib\velocity-tools-generic-1.4.jar [Interstage のインストールディレクトリ ]\BAS\lib\velocity-tools-view-1.4.jar [Interstage のインストールディレクトリ ]\BAS\lib\xercesImpl-2.9.0.jar [Interstage のインストールディレクトリ ]\BAS\spring25\lib\spring-webmvc25.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-oxm.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-rich.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-validator.jar /opt/fjsvibs/lib/aspectjweaver.jar /opt/fjsvibs/lib/castor-1.0.5.jar /opt/fjsvibs/lib/commons-collections-3.2.1.jar /opt/fjsvibs/lib/commons-fileupload-1.2.1.jar /opt/fjsvibs/lib/jaxrpc.jar /opt/fjsvibs/lib/spring-modules-validation-0.8.jar /opt/fjsvibs/lib/velocity-1.6.2.jar /opt/fjsvibs/lib/velocity-tools-generic-1.4.jar /opt/fjsvibs/lib/velocity-tools-view-1.4.jar /opt/fjsvibs/lib/xercesimpl-2.9.0.jar /opt/fjsvibs/spring25/lib/spring-webmvc25.jar /opt/fjsvibs/terasoluna/lib/terasoluna-oxm.jar /opt/fjsvibs/terasoluna/lib/terasoluna-rich.jar /opt/fjsvibs/terasoluna/lib/terasoluna-validator.jar TERASOLUNA-Batch の場合 共通のクラスパスに加えて 以下の jar ファイルをクラスパスに追加します [Interstage のインストールディレクトリ ]\BAS\lib\commons-collections-3.2.1.jar [Interstage のインストールディレクトリ ]\BAS\lib\spring-modules-validation-0.8.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-batch-core.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-filedao.jar [Interstage のインストールディレクトリ ]\BAS\terasoluna\lib\terasoluna-validator.jar [Interstage のインストールディレクトリ ]\J2EE\lib\commonj\commonj-twm.jar [Interstage のインストールディレクトリ ]\J2EE\lib\commonj\iswmimpl.jar /opt/fjsvibs/lib/commons-collections-3.2.1.jar /opt/fjsvibs/lib/spring-modules-validation-0.8.jar /opt/fjsvibs/terasoluna/lib/terasoluna-batch-core.jar /opt/fjsvibs/terasoluna/lib/terasoluna-filedao.jar /opt/fjsvibs/terasoluna/lib/terasoluna-validator.jar /opt/fjsvj2ee/lib/commonj/commonj-twm.jar /opt/fjsvj2ee/lib/commonj/iswmimpl.jar 5.2.3 ワークマネージャの設定 (TERASOLUNA-Batch のみ ) ワークマネージャがプーリングするスレッド数のチューニングが必要な場合があります 詳細は 5.6.1 TERASOLUNA Batch Framework for Java のチューニング を参照してください - 112 -
5.2.4 TERASOLUNA フレームワークが出力するログの設定 TERASOLUNA フレームワークが出力するログと TERASOLUNA アプリケーションが出力するログの定義は それぞれ異なる定義でログを出力します TERASOLUNA フレームワークが出力するログオープン Java フレームワーク共通のログ設定に従って ログ出力を行います TERASOLUNA フレームワークが出力するログについては 第 7 章標準ログ を参照してください TERASOLUNA アプリケーションが出力するログ TERASOLUNA アプリケーションの開発時にログ定義を行います なお ブランクプロジェクトおよびサンプルプロジェクトでは commons-logging を使ってログ出力を行います 詳細は 5.3.4 TERASOLUNA アプリケーションが出力するログの設定 を参照してください なお TERASOLUNA フレームワークと TERASOLUNA アプリケーションとで同じ種類のログ実装クラスを指定することで 同一のログに出力することができます 詳細については 第 6 章オープン Java フレームワークにおけるログ機能の利用 を参照してください 5.3 TERASOLUNA の開発 TERASOLUNA アプリケーションの開発の手順を 以下に示します プロジェクトのインポート ファイルパスの修正 データベースの設定 TERASOLUNA アプリケーションが出力するログの設定 アプリケーションの開発 ワークマネージャのスレッドプールサイズの調整 (TERASOLUNA-Batch) 配備アプリケーションの変更手順 デバッグ方法 TERASOLUNA アプリケーションの開発方法の詳細は TERASOLUNA のマニュアル (http://sourceforge.jp/projects/terasoluna/) を参照してください ここでは Interstage 固有の作業手順を説明します 5.3.1 ブランクプロジェクトのインポート Interstage Studio に TERASOLUNA アプリケーションの開発用のブランクプロジェクトをインポートします 1. Interstage Studio のメニューバーから [ ファイル ] > [ インポート ] を実行し [ インポート ] の画面を表示します 2. [ 選択 ] の画面で [ 一般 ] > [ 既存プロジェクトをワークスペースへ ] を選択し [ 次へ ] を実行します 3. [ プロジェクトのインポート ] の画面で [ アーカイブファイルの選択 ] を選択します 4. [ 参照 ] を実行し ブランクプロジェクトの zip ファイルを指定します 5. [ プロジェクト ] に選択したブランクプロジェクト名 (ISTerasolunaWebBlank/ISTerasolunaRichBlank/ISTerasolunaBatchBlank) が表示されます 6. [ 終了 ] をクリックします ブランクプロジェクトは Interstage Business Application Server の開発環境パッケージに同梱されています <Interstage インストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaBatchBlank.zip <Interstage インストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaRichBlank.zip <Interstage インストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaWebBlank.zip - 113 -
5.3.2 ファイルパスの修正 Java のビルドパスの修正 ブランクプロジェクトでは Interstage を C:\Interstage にインストールされたものとして あらかじめ Java のビルドパスを設定してあります Interstage を C:\Interstage 以外のディレクトリにインストールした場合は Java のビルドバスを修正してください ワークマネージャのバインディングファイルのパスの修正 (TERASOLUNA-Batch) ブランクプロジェクトでは Interstage を C:\Interstage にインストールされたものとして あらかじめワークマネージャのバインディングファイルのパスを設定してあります Interstage を C:\Interstage 以外のディレクトリにインストールした場合は バインディングファイルのパスを修正します 修正するファイルを 次に示します common\defaultvaluebean.xml common\workmanagercontext.xml 次の赤字の部分を Interstage をインストールしたディレクトリに修正します <bean id="jnditemplateforworkmanager" class="org.springframework.jndi.jnditemplate"> <property name="environment"> <props> <prop key="java.naming.factory.initial">com.fujitsu.interstage.j2ee.util.work.reffscontextfactorywrapper</ prop> <prop key="java.naming.provider.url">file:///c:/interstage/bas/terasoluna/var/commonj</prop> </props> </property> </bean> 次の赤字の部分になるように 修正します <bean id="jnditemplateforworkmanager" class="org.springframework.jndi.jnditemplate"> <property name="environment"> <props> <prop key="java.naming.factory.initial">com.fujitsu.interstage.j2ee.util.work.reffscontextfactorywrapper</ prop> <prop key="java.naming.provider.url">file:/opt/fjsvibs/var/terasoluna/commonj/</prop> </props> </property> </bean> 5.3.3 データベースの設定 データベースの設定については 使用するデータベース製品のマニュアルを参照してください ここでは TERASOLUNA フレームワークおよび TERASOLUNA アプリケーションが使用するデータベースの設定について 全体的な流れおよび Interstage 固有の作業手順を説明します TERASOLUNA フレームワークが使用するデータベース (TERASOLUNA-Batch) TERASOLUNA-Batch では TERASOLUNA フレームワークはデータベースを使用しジョブを管理します 次の手順で データベースの設定を行います 1. データベースの選択 - 114 -
2. データベースとテーブルの作成 3. 定義ファイルの編集 4. JDBC データソースの作成 データベースの選択 セーブポイント の機能を使用する場合は Symfoware 以外のデータベースを使用します Symfoware で バッチ更新 の機能を使用する場合は Symfoware V10 以降を使用します データベースとテーブルの作成 データベース スキーマなどを作成し 次のテーブルを作成します ジョブ管理テーブル ジョブ結果テーブル リスタート管理テーブル ブランクプロジェクトに テーブルを作成する SQL ファイルのサンプルがあります 下表に示すサンプルを参考にして テーブルを作成します データベースの種類テーブル作成用 SQL ファイルテーブル削除用 SQL ファイル Symfoware /sql/symfo/create.sql /sql/symfo/drop.sql Oracle /sql/oracle/create.sql /sql/oracle/drop.sql 定義ファイルの編集 次のファイルを編集して JDBC データソースの JNDI 名を設定します /batchapps/common/dataaccesscontext-batch.xml ファイルの datasource の Bean 定義 > jndiname プロパティ JDBC データソースの作成 Interstage 管理コンソールを使用して JDBC データソースを作成します なお ここで設定する JDBC データソースの定義名には 前述の /batchapps/common/dataaccesscontext-batch.xml に設定した JDBC データソースの JNDI 名を指定します また JDBC データソースが使用する JDBC ドライバの jar を Interstage Application Server のシステムのクラスパスに追加します TERASOLUNA アプリケーションが使用するデータベース ( 共通 ) TERASOLUNA アプリケーションがデータベースを使用する場合は データベースを作成します 次の手順で データベースの設定を行います 1. データベースの選択 2. データベースとテーブルの作成 3. 定義ファイルの編集 4. JDBC データソースの作成 データベースの選択 セーブポイント の機能を使用する場合は Symfoware 以外のデータベースを使用します Symfoware で バッチ更新 の機能を使用する場合は Symfoware V10 以降を使用します - 115 -
データベースとテーブルの作成 データベース スキーマおよび テーブルなどを作成します 定義ファイルの編集 必要に応じて 使用するデータベースに合わせて 定義ファイルを修正します TERASOLUNA-Web /ContextRoot/META-INF/context.xml を修正する /ContextRoot/META-INF/applicationContext.xml を修正する TERASOLUNA-Rich /ContextRoot/META-INF/context.xml を修正する /ContextRoot/META-INF/dataAccessContext-local.xml を修正する TERASOLUNA-Batch /batchapps/common/dataaccesscontext-batch.xml を修正する データベースおよびテーブルごとに 独自の sqlmapconfig.xml および sqlmap.xml を新規作成し その sqlmapconfig.xml を参照するように ジョブ定義ファイルを修正する JDBC データソースの作成 JNDI 経由でデータベースにアクセスする場合は JDBC データソースの作成が必要です JDBC データソースの設定は Interstage 管理コンソールで行います また JDBC データソースが使用する JDBC ドライバの jar を Interstage Application Server のシステムのクラスパスに追加します 5.3.4 TERASOLUNA アプリケーションが出力するログの設定 TERASOLUNA フレームワークが出力するログと TERASOLUNA アプリケーションが出力するログの定義は それぞれ異なる定義でログを出力します ブランクプロジェクトでは commons-logging を使用してログ出力を行います Jakarta Commons Logging の設定を変更するには 次の設定ファイルを編集します /src/commons-logging.properties TERASOLUNA フレームワークが出力するログの設定方法は 5.2.4 TERASOLUNA フレームワークが出力するログの設定 を参照してください 5.3.5 アプリケーションの開発 ここでは 開発の概要を説明します TERASOLUNA アプリケーションの主な開発項目としては 以下があります ビジネスロジックの作成 ( 共通 ) クライアントに返却するデータ ( プレゼンテーション層 ) の作成 (TERASOLUNA-Web/TERASOLUNA-Rich) 各種定義ファイルの作成 編集 TERASOLUNA アプリケーションの開発方法の詳細は TERASOLUNA のドキュメントを参照してください - 116 -
ビジネスロジックなどのJavaプログラムの開発 ( 共通 ) TERASOLUNAアプリケーションの開発は ビジネスロジックの定義が主な開発となります ビジネスロジックの開発方法には 次の方法があります TERASOLUNA-Web BLogicインタフェースを実装したビジネスロジックを作成する POJOのビジネスロジックおよび AbstractBLogicActionクラスの派生クラスを作成する TERASOLUNA-Rich BLogicインタフェースを実装したビジネスロジックを作成する POJOのビジネスロジックおよび TerasolunaControllerの派生クラスを作成する TERASOLUNA-Batch BLogicインタフェースを実装したビジネスロジックを作成する 定義ファイルの編集 定義ファイルを編集して ビジネスロジックの実行方法を含めた TERASOLUNA アプリケーションのカスタマイズを行います 定義ファイルの詳細は TERASOLUNA のドキュメントを参照してください 非同期ジョブの起動処理の組み込み (TERASOLUNA-Batch) Servlet や EJB などから非同期ジョブを起動する方法の例を 以下に示します なお 下記例は サンプルプロジェクトで実装しています import jp.terasoluna.fw.batch.commonj.init.jobstarterimpl; import org.springframework.context.configurableapplicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; : : //JobStarterImpl のインスタンスを生成する String[] xmlpaths = new String[]{"common/WorkManagerContext.xml", "common/dataaccesscontext-batch.xml"}; ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(xmlPaths); JobStarterImpl starter = (JobStarterImpl)context.getBean("jobStarter"); // 非同期ジョブを実行する String jobid =...; // ジョブのID String beanfilename =...; // ジョブBean 定義ファイル名 String[] args =...; // ジョブのパラメーター int ret = starter.execute(jobid, beanfilename, args); なお 非同期バッチデーモンを起動する場合は ジョブ Bean 定義ファイル名として common/ AsyncBatchDaemonForCommonjBean.xml を指定します 5.3.6 ワークマネージャのスレッドプールサイズの調整 (TERASOLUNA-Batch) TERASOLUNA-Batch では 実際に生成されるスレッド数に応じて ワークマネージャのスレッドプールサイズを調整する必要があります 詳細は 5.6 チューニング を参照してください また ブランクプロジェクトの Bean 定義ファイルでは Interstage のワークマネージャへの対応を行っています - 117 -
5.3.7 配備アプリケーションの変更手順 配備済みのアプリケーションを変更する場合の手順を以下に示します 1. 修正したいアプリケーションのプロジェクトを開発環境で開き 修正を行います 2. 修正を行ったプロジェクトのコンパイル ビルドを実施後 アプリケーションを再配備します 5.3.8 デバッグ方法 TERASOLUNA アプリケーションをデバッグするには 以下の方法があります アプリケーションサーバに配備せず TERASOLUNA アプリケーションを単体実行する Interstage Studio や Interstage Application Server を利用してデバッグを実行する Interstage Studio の詳細については Interstage Studio ユーザーズガイド を参照してください Interstage Application Server の詳細については Interstage Application Server J2EE ユーザーズガイド Interstage Application Server チューニングガイド Interstage Application Server トラブルシューティング集 などのマニュアルを参照してください 5.4 TERASOLUNA の運用 保守 5.4.1 起動 停止 TERASOLUNA アプリケーションは IJServer ワークユニット上で動作します IJServer ワークユニットは Interstage 管理コンソールを利用して起動 停止をすることができます IJServer ワークユニットの起動 停止については Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド を参照してください TERASOLUNA の環境設定については 5.2 TERASOLUNA の環境作成 を参照してください 5.4.2 ログ TERASOLUNA アプリケーションが出力するログと TERASOLUNA フレームワークが出力するログの 2 種類があります TERASOLUNA フレームワークが出力するログは 5.2.4 TERASOLUNA フレームワークが出力するログの設定 を参照してください TERASOLUNA アプリケーションが出力するログは 5.3.4 TERASOLUNA アプリケーションが出力するログの設定 を参照してください 5.4.3 異常発生時の対処 ログを参照することにより 異常発生の有無を確認することができます ログにメッセージやスタックトレースが出力されていれば メッセージ集 および トラブルシューティング集 を参照して 異常発生の原因を取り除きます 5.5 注意事項 5.5.1 共通の注意事項 Symfoware を使用するにあたっての注意事項として 4.5.1 データベース固有の注意点 を参照してください 5.5.2 TERASOLUNA Batch Framework for Java 使用時の注意事項 同一 IJServer 内で 複数個の非同期バッチデーモンを起動しないでください 複数個の非同期バッチデーモンを起動したい場合は 複数個の IJServer を用意してください また バッチデーモンごとに 異なるジョブ管理テーブル ジョブ結果テーブル リスタート管理テーブルを使用してください - 118 -
TERASOLUNA-Batch を使用する場合は アプリケーション安定稼動機能を使用することはできません 5.6 チューニング 5.6.1 TERASOLUNA Batch Framework for Java のチューニング TERASOLUNA Batch Framework for Java では システム構成に合わせて非同期ジョブを実行するスレッド数をチューニングします そのチューニング結果として生成されるスレッド数が ワークマネージャのスレッドプールサイズを超える場合 TERASOLUNA フレームワークがフリーズし ジョブが終了しなくなる場合があります 生成するスレッド数の計算 同一の非同期バッチデーモンで複数のジョブを実行する場合 同一のワークマネージャ内でスレッドを生成します そのイメージを 下図に示します ワークマネージャのスレッドプール内で生成するスレッドは 次の計算式で算出できます 生成スレッド数 = 同時に実行するジョブの個数 非同期ジョブの multiplicity 2 ( なお 通常ジョブの場合 multiplicity は 1 とみなして計算します ) Java VM がハングアップしたときのワークマネージャの状況 mulitiplicity が 3 の非同期ジョブを 4 個同時に実行した場合 生成するスレッド数は 前述の計算式により 24 個です そのとき ワークマネージャのスレッドプールサイズが 12 の場合 下図に示す状態になる場合があります - 119 -
上図は スレッドプールサイズが 12 しかないのに 対象データを取得するスレッド 12 個がすでにプーリングされていて これ以上新しいスレッドを生成できない状態です そのため BLogic を実行するスレッドを起動することができず BLogic を実行することができません その結果 対象データを取得するスレッドが永遠に BLogic の実行が終わるのを待ち続けることになり ジョブがいつまでも終了しなくなります そうならないようにするための対処方法には 次があります 1) 非同期バッチデーモンで同時に実行するジョブ数を調整する 2) 非同期バッチデーモンを使用しないジョブを実行する 3) 分割ジョブでなく通常ジョブを実行する 4) 分割ジョブの muitiplicity を減らす 5) ワークマネージャのスレッドプールサイズを調整する 1) 2) については 非同期バッチデーモンが同時に実行するジョブを減らすようにプログラムを見直してください 3)~4) については 当該ジョブのジョブ Bean 定義ファイルの設定を見直してください 5) については 次で説明します ワークマネージャのスレッドプールサイズの調整 ワークマネージャのスレッドプールサイズを調整する場合は 下記ファイルを修正し スレッドプールサイズを変更します OS ファイルの所在修正箇所 Windows Solaris/Linux [Interstage のインストールディレクトリ ] \BAS \terasoluna\var\commonj\.bindings /opt/fjsvibs/var/terasoluna/commonj/ java:comp/env/wm/.bindings java\:comp/env/wm/default/refaddr/0/content=< スレッドプールサイズ > default/refaddr/0/content=< スレッドプールサイズ > - 120 -
スレッドプールサイズ : ワークマネージャで使用されるスレッドプールサイズです 1~100 の値で指定することができます 初期値は 10 です 5.7 トラブルシューティング 5.7.1 TERASOLUNA Batch Framework for Java のトラブルシューティング TERASOLUNA Batch Framework for Java では 以下の現象が発生する可能性があります ジョブが終了しないジョブ Bean 定義ファイルの記述を誤ると フレームワーク側で NullPointerException が発生し 当該ジョブが終了しない場合があります NullPointerException の発生有無は ログで確認してください Java VM がハングアップする対象データを取得するスレッドの個数が ワークマネージャのスレッドプールサイズ以上になると ビジネスロジックを実行することができなくなり TERASOLUNA フレームワークがフリーズします 詳細は 5.6 チューニング を参照してください - 121 -
第 6 章オープン Java フレームワークにおけるログ機能の利用 6.1 commons-logging API 仕様に準拠したログ機能 6.1.1 commons-logging API 仕様に準拠したログ機能の概要 オープン Java フレームワーク機能では Interstage Business Application Server が提供しているログ機能を使用するための commonslogging の API 仕様に準拠したログクラスである ApfwLogger を提供します これによって 開発時にはアプリケーションが出力するログに関しては commons-logging の API で実装しておき アプリケーション固有の業務処理を先に実装することができます 実行時に動作するログ出力クラスへ ApfwLogger を指定し 読み込むログ定義ファイルのパスを指定することによって アプリケーションを変更することなく指定したログ定義ファイルの定義内容に従ってログを出力することが可能になります 6.1.2 commons-logging API 仕様に準拠したログ機能の環境作成 commons-logging の API 仕様に準拠してログ機能を利用する場合には 以下の手順で環境を作成します ログ実装クラスの設定 commons-logging では 実際に動作するログ実装クラスを指定する必要があります ログ実装クラスの設定 配備するアプリケーションのルートディレクトリへ以下のプロパティファイルを格納します commons-logging.properties commons-logging.properties の記述内容 commons-logging.properties にはログ実装クラスを記述します org.apache.commons.logging.log=com.fujitsu.interstage.apfw.logging.apfwlogger ログ定義ファイルの指定 配備するアプリケーションのルートディレクトリへ以下のプロパティファイルを格納します apfwlog.properties apfwlog.properties の記述内容 apfwlog.properties にはログ定義ファイルのパス サブシステム名を記述します 指定したサブシステム名は性能ログの出力時に有効となります apfwlog.config=c:\\temp\\logconf.xml apfwlog.subsystemid=asystem apfwlog.config=/home/logconf.xml apfwlog.subsystemid=asystem Java のプロパティファイルの仕様に準拠します - 122 -
サブシステム名は半角英数字 7 文字以内で設定します上記のプロパティファイルを含めてアプリケーションを作成します アプリケーションの配備 IJServerを作成し アプリケーションを配備します アプリケーションの配備操作 Interstage 管理コンソールを使用して IJServerワークユニットへアプリケーションを配備します [ システム ] > [ ワークユニット ] > " ワークユニット名 " > [ 配備 ] タブ クラスパスの設定 IJServer のクラスパスへログ機能が動作するために必要な jar ファイルを設定します クラスパスの設定 Interstage 管理コンソールを使用して IJServer ワークユニットでログ機能が動作するために必要な jar ファイルをクラスパスへ設定します [ システム ] > [ ワークユニット ] > " ワークユニット名 " > [ 環境設定 ] タブ 以下の jar ファイルを設定します [Interstageのインストールディレクトリ]\BAS\lib\commons-logging-1.1.1.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwlogging.jar [Interstageのインストールディレクトリ]\BAS\lib\apfwutils50.jar [Interstageのインストールディレクトリ]\APC\lib\uji.jar [Interstageのインストールディレクトリ]\APC\lib\ujief.jar [Interstageのインストールディレクトリ]\APC\lib\ujilog.jar /opt/fjsvibs/lib/commons-logging-1.1.1.jar /opt/fjsvibs/lib/apfwlogging.jar /opt/fjsvibs/lib/apfwutils50.jar /opt/fjsvwebc/lib/uji.jar /opt/fjsvapcef/lib/ujief.jar /opt/fjsvapclg/lib/ujilog.jar 高信頼性ログ利用時の環境設定 オープン Java フレームワーク上で動作するユーザアプリケーションで commons-logging API を介して高信頼性ログを利用する場合は IJServer の環境設定に以下を追加します [Interstage Business Application Server に同梱している Symfoware/RDB または Symfoware Server を利用する場合 ] クラスパス [JDBC ドライバのインストールディレクトリ ]\fjjdbc\lib\fjsymjdbc2.jar - 123 -
ライブラリパス [Symfowareのインストールディレクトリ]\ESQL\LIB [JDBCドライバのインストールディレクトリ]\fjjdbc\bin 環境変数 RDBNAME=[RDBシステム名 ] クラスパス [JDBCドライバのインストールディレクトリ]/fjjdbc/lib/fjsymjdbc2.jar ライブラリパス [Symfowareのインストールディレクトリ]/lib [ICONVのインストールディレクトリ]/lib または /etc/opt/fsuniconv/lib [JDBCドライバのインストールディレクトリ]/fjjdbc/bin 環境変数 RDBNAME=[RDBシステム名 ] クラスパス [JDBCドライバのインストールディレクトリ]/fjjdbc/lib/fjsymjdbc2.jar ライブラリパス [Symfowareのインストールディレクトリ]/lib [JDBCドライバのインストールディレクトリ]/fjjdbc/bin 環境変数 RDBNAME=[RDBシステム名 ] オープン Java フレームワークのランタイムで利用するログ実装クラスの設定 Struts/Spring Framework/iBATIS のオープン Java フレームワークのランタイムでは commons-logging を利用してログを出力しています ランタイムは以下の優先順位でログ実装クラスを使用しています (1) ワークユニット設定のクラスパスに Log4J が存在する場合 Log4J (2) JDK ロギング (3) SimpleLog 上記の設定を変更する場合 commons-logging の仕様にしたがってログ実装クラスを指定する必要があります オープン Java フレームワークのランタイムで利用するログ実装クラスの設定 ワークユニット設定のクラスパスへ以下のディレクトリを指定します [Interstage のインストールディレクトリ ]\BAS\etc\def\log_inf /opt/fjsvibs/etc/def/log_inf オープン Java フレームワークのランタイムが利用する commons-logging の設定ファイルは以下に格納されています [Interstage のインストールディレクトリ ]\BAS\etc\def\log_inf\apfwcommons-logging.properties /opt/fjsvibs/etc/def/log_inf/apfwcommons-logging.properties apfwcommons-logging.properties の記述内容 - 124 -
apfwcommons-logging.properties にはログ実装クラスを記述します Log4J のログ出力クラスを利用する場合 com.fujitsu.interstage.apfw.commons.logging.log=com.fujitsu.interstage.apfw.commons.logging.impl.log4jlogger JDK のログ出力クラスを利用する場合 com.fujitsu.interstage.apfw.commons.logging.log=com.fujitsu.interstage.apfw.commons.logging.impl.jdk14logger SimpleLog のログ出力クラスを利用する場合 com.fujitsu.interstage.apfw.commons.logging.log=com.fujitsu.interstage.apfw.commons.logging.impl.simplelog オープン Java フレームワークのランタイムで利用するログ実装クラスが SimpleLog の場合 Struts/Spring Framework/iBATIS のオープン Java フレームワークのランタイムが利用する commons-logging のログ実装クラスに SimpleLog を指定した場合 SimpleLog の設定ファイルが読み込まれます 読み込まれるファイルは以下に格納されています [Interstage のインストールディレクトリ ]\BAS\etc\def\log_inf\apfwsimplelog.properties /opt/fjsvibs/etc/def/log_inf/apfwsimplelog.properties apfwsimplelog.propertiesの記述内容 apfwcommons-logging.propertiesにはログ出力に関する情報を記述します com.fujitsu.interstage.apfw.commons.logging.simplelog.defaultlog=info com.fujitsu.interstage.apfw.commons.logging.simplelog.log.org.jpn.xucker=debug com.fujitsu.interstage.apfw.commons.logging.simplelog.showdatetime=true com.fujitsu.interstage.apfw.commons.logging.simplelog.showlogname=false com.fujitsu.interstage.apfw.commons.logging.simplelog.showshortlogname=true com.fujitsu.interstage.apfw.commons.logging.simplelog.datetimeformat=yyyy/mm/dd HH:mm:ss:SSS zzz 6.1.3 アプリケーションログの出力レベルについて ログ機能では アプリケーションが出力する情報に重要度を表すレベルを設定することができます また 特定のレベル以上のログだけを出力するようにログ定義ファイルで管理名ごとに設定することができます ログ出力レベルを設定することにより デバッグ時には多くの情報をログに出力したり 本稼働時には重要度が高いログに絞って出力したり ログを出力しない運用にするという制御が可能になります ログ定義ファイルにおいてログ出力レベルを 10 に設定した場合 ログ出力レベルが 3 5 10 のログが出力されます アプリケーションでログを出力するために利用する commons-logging API ごとに対応するログ機能のログ出力レベルが異なっています 以下に commons-logging API とログ機能のログ出力レベルの対応表を記載します commons-logging API fatal() 3 error() 3 warn() 5 info() 10 ログ機能のログ出力レベル - 125 -
debug() 15 trace() 20 ログ機能のデフォルトのログ出力レベルは9です 高信頼性ログにはログ出力レベルがないため 常に高信頼性ログへログが出力されます 6.2 ログ機能の利用方法 6.2.1 commons-logging APIを用いてログ出力する commons-logging API クラスを用いてログを出力する場合 (commons-logging API を用いてログ出力を行う場合 ) import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; public class MyApp { Log _log = null; public void method1() { if( _log == null ) { // ログ定義ファイルに記述したLogComposer"Log1" のログ出力クラスを取得します _log = LogFactory.getLog("Log1"); } // ログを出力します _log.info("method1 start"); } } 6.2.2 LogComposer クラスを用いてログを出力する LogComposer クラスを用いてログを出力する場合 (LogComposer を用いてログ出力を行う場合 ) import org.apache.commons.logging.log; - 126 -
import org.apache.commons.logging.logfactory; import com.fujitsu.interstage.apfw.common.logging.apfwlogger; import com.fujitsu.uji.log.logcomposer; public class MyApp { Log _log = null; ApfwLogger _al = null; LogComposer _lc = null; public void method1() { if( _log == null ) { // ログ定義ファイルに記述したLogComposer"Log1" のログ出力クラスを取得します _log = LogFactory.getLog("Log1"); _al = (ApfwLogger)_log; // LogComposerクラスを取得します _lc =_al.getlogcomposer(); } if( _lc!= null ) { // ログを出力します _lc.println(3,"method1 start",1); } else { // ログ出力クラスのオブジェクトがnullのため ログの出力ができません } } } 6.2.3 ExtMessageComposer クラスを用いてログを出力する ExtMessageComposer クラスを用いてログを出力する場合 (ExtMessageComposer を用いてログ出力を行う場合 ) import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.fujitsu.interstage.apfw.logging.apfwlogger; - 127 -
import com.fujitsu.uji.log.ext.extmessagecomposer; public class MyApp { Log _log = null; ApfwLogger _al = null; ExtMessageComposer _emc = null; ; public void method1() { if( _log == null ) { // ログ定義ファイルに記述したLogComposer"Log1" のログ出力クラスを取得します _log = LogFactory.getLog("Log1"); _al = (ApfwLogger)_log; // ExtMessageComposerを取得します _emc = (ExtMessageComposer)_al.getLogComposer(); } if( _emc!= null ) { // ログを出力します _emc.printmessage("1000"); _emc.printmessage("1001",new String[]{"OK"}); } else { // ログ出力クラスのオブジェクトがnullのため ログの出力ができません } } } 6.2.4 ExtDataComposer クラスを用いてログを出力する ExtDataComposer クラスを用いてログを出力する場合 (ExtDataComposer を用いてログ出力を行う場合 ) import java.util.hashmap; - 128 -
import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.fujitsu.interstage.apfw.logging.apfwlogger; import com.fujitsu.uji.log.ext.extdatacomposer; public class MyApp { Log _log = null; ApfwLogger _al = null; ExtDataComposer _edc = null; public void method1() { if( _log == null ) { // ログ定義ファイルに記述したLogComposer"Log1" のログ出力クラスを取得します _log = LogFactory.getLog("Log1"); _al = (ApfwLogger)_log; // ExtDataComposerを取得します _edc = (ExtDataComposer)_al.getLogComposer(); } // ExtDataComposerクラスに渡すデータを生成 HashMap _map = new HashMap(); if( _edc!= null ) { // ログを出力します _edc.printdata(5,"code","name","subname","messageid",_map); } else { // ログ出力クラスのオブジェクトがnullのため ログの出力ができません } } } 6.2.5 ExtTimeComposer クラスを用いてログを出力する - 129 -
ExtTimeComposer クラスを用いてログを出力する場合 (ExtTimeComposer を用いてログ出力を行う場合 ) import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.fujitsu.interstage.apfw.logging.apfwlogger; import com.fujitsu.uji.log.ext.exttimecomposer; public class MyApp { Log _log = null; ApfwLogger _al = null; ExtTimeComposer _etc = null; public void method1() { if( _log == null ) { // ログ定義ファイルに記述したLogComposer"Log1" のログ出力クラスを取得します _log = LogFactory.getLog("Log1"); _al = (ApfwLogger)_log; // ExtTimeComposerを取得します _etc = (ExtTimeComposer)_al.getLogComposer(); } // ExtTimeComposerクラスに渡すデータを生成 long _currenttime; if( _etc!= null ) { // ログを出力します _etc.printtime(_currenttime,5,"code","name","subname","messageid"); } else { // ログ出力クラスのオブジェクトがnullのため ログの出力ができません } } - 130 -
} 6.2.6 ULogComposer クラスを用いてログを出力する ULogComposer クラスを用いてログを出力する場合 (ULogComposer を用いてログ出力を行う場合 ) import java.sql.connection; import java.util.hashtable; import javax.naming.initialcontext; import javax.sql.datasource; import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.fujitsu.interstage.apfw.logging.apfwlogger; import com.fujitsu.uji.ulog.ulogcomposer; public class MyApp { Log _log = null; ApfwLogger _al = null; ULogComposer _ulc = null; public void method1() { if( _log == null ) { // ログ定義ファイルに記述したULogComposer"ULog1" のログ出力クラスを取得します _log = LogFactory.getLog("ULog1"); _al = (ApfwLogger)_log; // JNDI 環境の設定 Hashtable env = new Hashtable(); env.put(context.initial_context_factory, "com.fujitsu.symfoware.jdbc2.jndisp.symcontextfactory"); env.put(context.provider_url,"sym://..."); InitialContext ctx = null; DataSource ds = null; Connection connection = null; - 131 -
try { ctx = new InitialContext(env); ds = (DataSource)ctx.lookup("jdbc/..."); connection = ds.getconnection(); // ULogComposerを取得します _ulc = (ULogComposer)_al.getULogComposer(connection); if( _ulc!= null ) { // ログを出力します _ulc.println(null,null,"somemethod start"); } else { // 高信頼ログ出力クラスのオブジェクトがnullのため ログの出力ができません } // 高信頼性ログの出力を終了する場合に クローズをします if( _ulc!= null ) { _ulc.close(); } // コネクションをクローズします if( connection!= null ) { connection.close(); } } catch(throwable t) { // 例外の処理をおこないます } } } } Spring Framework が提供する AOP 機能を利用して 以下の処理を業務アプリケーションから分離する事が可能になります 1. JNDI 環境の情報を設定する処理と高信頼性ログを出力するための ULogComposer を取得する処理を Spring Framework が提供する AOP 機能を利用して業務アプリケーションの前処理として作成する 2. 高信頼性ログ出力クラス およびコネクションのクローズ処理を Spring Framework が提供する AOP 機能を利用して業務アプリケーションの後処理として作成する - 132 -
Spring Framework の AOP 機能を利用して 高信頼性ログを利用するために必要な処理を業務アプリケーションの処理から分離する事で 業務アプリケーションは commons-logging の API で高信頼性ログを利用する事が可能になります ULogComposer クラスを用いてログを出力する場合 (commons-logging API と AOP 機能 ) (commons-logging API Spring Framework の AOP を用いてログ出力を行う場合 ) package test; import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; public class MyApp { // AOP 機能のクラスからアクセス可能にします protected Log _log = null; public MyApp() { if( _log == null ) { // ログ定義ファイルに記述したULogComposer"ULog1" のログ出力クラスを取得します _log = LogFactory.getLog("ULog1"); } } public void method1() { // ログを出力します Try { _log.info("somemethod start"); } catch(throwable t) { // 例外の処理をおこないます ] } } (AOP 機能の利用 ) package test; - 133 -
import java.sql.connection; import java.util.hashtable; import javax.naming.initialcontext; import javax.sql.datasource; import com.fujitsu.interstage.apfw.logging.apfwlogger; import com.fujitsu.uji.ulog.ulogcomposer; public class MyAppAop { ApfwLogger _al = null; ULogComposer _ulc = null; // サーバアプリケーションのmethod1が実行される前に動作するメソッド public void execmethod1before() { _al = (ApfwLogger)MyApp._log; // JNDI 環境の設定 Hashtable env = new Hashtable(); env.put(context.initial_context_factory, "com.fujitsu.symfoware.jdbc2.jndisp.symcontextfactory"); env.put(context.provider_url,"sym://..."); InitialContext ctx = null; DataSource ds = null; Connection connection = null; try { ctx = new InitialContext(env); ds = (DataSource)ctx.lookup("jdbc/..."); connection = ds.getconnection(); // ULogComposerを取得します _ulc = (ULogComposer)_al.getULogComposer(connection); } catch(throwable t) { // 例外の処理をおこないます } - 134 -
} // サーバアプリケーションのmethod1が実行された後に動作するメソッド public void execmethod1after() { try { // 高信頼性ログの出力を終了する場合に クローズをします if( _ulc!= null ) { _ulc.close(); } // コネクションをクローズします if( connection!= null ) { connection.close(); } } catch(throwable t) { // 例外の処理をおこないます } } Spring Framework の Bean 定義ファイルのインスタンス生成方式には singleton を指定しないでください ( アプリケーションと AOP 機能 ) <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <aop:config> - 135 -
<aop:aspect id="ct001_asp" ref="myappaop"> <aop:pointcut id="pointcut" expression="execution(* method1())"/> <aop:before pointcut-ref="pointcut" method="execmethod1before"/> <aop:after pointcut-ref="pointcut" method="execmethod1after"/> </aop:aspect> </aop:config> <bean id="myappaop" class="test.myappaop"/> <bean id="myapp" class="test.myapp"/> </beans> 6.3 注意事項 ネーミングサービスが起動されているか確認してください RDB システムが起動しているか確認してください ログ定義ファイルが存在しているか確認してください ログ定義ファイルの定義に誤りがないか確認してください プロパティファイルが存在しているか確認してください プロパティファイルの定義に誤りがないか確認してください サブシステム名が以下の条件を満たした場合 正しく出力されません - 半角英数字以外でサブシステム名を指定している または - 8 文字以上の半角英数字でサブシステム名を指定している 開発環境におけるログ機能の動作について 開発環境において Interstage Studio のアプリケーションサーバ上でテストする場合 commons-logging のログ実装クラスとして ApfwLogger を利用することができません 6.4 トラブルシューティング javax.naming.communicationexception: SYMNameServer isn't being started. HostName : **** Exception: 接続が拒否されました というエラーメッセージが出力された 以下の可能性があります Symfoware のネーミングサービスが起動していない可能性があります ネーミングサービスのホスト名 ネーミングサービスのポート番号 で指定されているサーバで Symfoware のネーミングサービスが起動しているか確認してください ネーミングサービスのホスト名 に指定したホスト名 ネーミングサービスのポート番号 に指定したポート番号に誤りがある可能性があります 確認 修正後再度実施してください 詳細は Interstage Business Application Server セットアップガイド の 付録 B Symfoware の JDBC 環境の設定 > B.2 ネーミングサービスの起動 を参照してください 高信頼性ログの使用時に java.sql.sqlexception: [SymfoWARE ODBC Driver] JYP1010E サーバ接続要求が拒否されました. というエラーメッセージが出力された 以下の可能性があります - 136 -
入力した データソース名 接続ホスト名 接続ポート番号 に誤りがある可能性があります 設定情報を確認して誤りがある場合は正しく修正してください Symfoware Server の RDB システムが起動していない場合があります RDB システムが起動しているか確認してください ログにコンテキスト ID が "*****" で出力される 以下の条件を満たす場合 コンテキスト ID が ***** でログに出力されます 1. 利用するログクラスが以下のいずれかである - com.fujitsu.uji.log.logcomposer - com.fujitsu.uji.log.ext.extdatacomposer - com.fujitsu.uji.log.ext.extmessagecomposer - com.fujitsu.uji.log.ext.exttimecomposer - com.fujitsu.uji.ulog.ulogcomposer 2. リクエストを受信して動作するメソッド以外でログを出力している 3. ログを出力している API が commons-logging API である コンテキスト ID はリクエストから情報を取り出して生成しています リクエストを受信して動作するメソッド以外でログを出力した場合 ログ定義ファイルに記載したメッセージフォーマットにコンテキスト ID が定義されていても コンテキスト ID が生成されていないのでログを出力することができません そのため 内部でダミーのコンテキスト ID"*****" を設定し ログを出力しています ログにリクエスト情報から生成されたコンテキスト ID を出力させる場合は リクエストを受信してから動作するメソッドでログを出力するようにアプリケーションを修正してください ログにコンテキスト ID が出力されない 以下の条件を満たす場合 コンテキスト ID がログに出力されません 1. 利用するログクラスが以下のいずれかである - com.fujitsu.uji.log.logcomposer - com.fujitsu.uji.log.ext.extdatacomposer - com.fujitsu.uji.log.ext.extmessagecomposer - com.fujitsu.uji.log.ext.exttimecomposer 2. リクエストを受信して動作するメソッド以外でログを出力している 3. ログを出力している API が前述 (1) のクラスが持っている API である コンテキスト ID はリクエストから情報を取り出して生成しています リクエストを受信して動作するメソッド以外でログを出力した場合 ログ定義ファイルに記載したメッセージフォーマットにコンテキスト ID が定義されていても コンテキスト ID が生成されていないためコンテキスト ID が出力されません ログにコンテキスト ID を出力させる場合は リクエストを受信してから動作するメソッドでログを出力するようにアプリケーションを修正してください 高信頼性ログを出力する際にエラーが発生する 以下の条件を満たす場合 高信頼性ログへログを出力できずにエラーが発生します 1. 利用するログクラスが以下である - com.fujitsu.uji.ulog.ulogcomposer 2. リクエストを受信して動作するメソッド以外でログを出力している コンテキスト ID はリクエストから情報を取り出して生成しています また 高信頼性ログの出力にはコンテキスト ID が必須です - 137 -
リクエストを受信して動作するメソッド以外でログを出力した場合 必須であるコンテキスト ID が生成されていないため エラーとなります 高信頼性ログへログを出力させる場合は リクエストを受信してから動作するメソッドでログを出力するようにアプリケーションを修正してください 指定したサブシステム名が正しく出力されない 以下の可能性があります 半角英数字以外でサブシステム名を指定している または 8 文字以上の半角英数字でサブシステム名を指定している サブシステム名は半角英数字 7 文字以内を指定してください FSP_INTS-BAS_JF6002 の警告メッセージが出力される ユーザアプリケーションが動作するための外部ライブラリのモジュールで commons-logging を利用している場合 ユーザアプリケーションで設定したログ実装クラスの指定の影響を受けます ログ実装クラスに com.fujitsu.interstage.apfw.logging.apfwlogger を指定した場合は FSP_INTS-BAS_JF6002 の警告メッセージが出力される可能性があります 以下のログ定義を追加してください <logcomposer name="fsp_ints-bas_jf6002 の警告メッセージで出力された管理名 "> <output name=" 任意の名前 " type="stderr" /> </logcomposer> - 138 -
第 7 章標準ログ 7.1 標準ログの概要 システムの開発 運用および保守の各工程において 有用なログ機能を提供しています ログ機能を利用することで オープン Java フレームワークの稼働状況および性能情報といったオープン Java フレームワークを使用する上でのさまざまなログを採取することができます 本章では オープン Java フレームワークが出力を制御している標準ログについて説明します 標準ログの機能 ログ定義ファイルの定義内容に従ってオープン Java フレームワークの運用状況や性能情報をログとして出力します ログには ID( コンテキスト ID) が出力され オープン Java フレームワーク上で動作するアプリケーションが出力するログと関連付けることができます 標準ログの種類 以下の 2 種類があります システムログオープン Java フレームワークの稼働状況や エラー状況をファイルに出力します 性能ログアプリケーションおよびオープン Java フレームワークの処理に要した時間をファイルに出力します システムログ出力 システムログ出力機能は オープン Java フレームワークの稼働状況やエラー状況を出力する機能です システムの起動 停止 および異常検出時にオープン Java フレームワークよりメッセージが出力されます また オープン Java フレームワーク上で動作するアプリケーションで使用するログとシステムログは コンテキスト ID により対応づけを行うことにより一元化して管理することができます 性能ログ出力 性能ログ出力機能は オープン Java フレームワーク内部での実行時間を出力する機能です アプリケーションの呼出しから復帰 ビューの表示の開始から復帰 オープン Java フレームワークの処理開始から処理終了までの経過時間などを出力します 7.2 標準ログの定義 標準ログで使用するログ定義について 以下に説明します 標準ログのログ定義ファイル格納パス [Interstage のインストールディレクトリ ]\BAS\etc\def\log_inf\logconfOss.xml 標準ログのログ定義ファイル格納パス /opt/fjsvibs/etc/def/log_inf/logconfoss.xml ワークユニット運用中にログ定義ファイルの修正を行った場合は ワークユニットの再起動を行ってください - 139 -
ログ定義ファイルの修正 インストール時のログ定義ファイルをもとに 記述内容の変更方法について説明します なお 定義の変更の詳細については 以下を参照してください Interstage Business Application Server アプリケーション開発ガイド の 汎用ログ の ログ定義ファイルを用いたログ出力 Interstage Business Application Server リファレンス の ログ定義ファイルリファレンス 定義変更するログを選択する logcomposer タグの name には 以下の管理名が記述されています ログの目的管理名説明 システムログ system アプリケーションの稼動状況や エラー状況を出力します 性能ログ performance 特定の利用者による要求処理ごとの Web サーバ およびアプリケーションサーバでの処理時間を出力します 標準ログの出力先を変更する デフォルトの出力先を変更するには ログ定義ファイルの出力先を変更します ログ定義ファイルを変更するには 変更する管理名の定義の param タグを変更してください 出力先の変更の詳細については Interstage Business Application Server アプリケーション開発ガイド の 汎用ログ の ログ定義ファイルを用いたログ出力 の ログの出力先の設定 を参照してください 標準ログとユーザログの出力先を同じ出力先に指定して運用した場合 標準ログとユーザログが混在することがあります 標準ログのログ出力レベルを変更する デフォルトでは ログ出力レベルは 9 です 出力レベルを変更するには 変更する管理名の定義の level タグを変更してください 各ログ定義のログ出力レベルの詳細については 7.3 標準ログの出力レベル を参照してください 標準ログのログ出力フォーマットを変更する デフォルトでは 以下のフォーマットとなります コンテキスト ID メッセージ本文 ログ出力フォーマットを変更するには 変更する管理名の定義の msgformat タグを変更してください フォーマットの詳細については 7.5 標準ログの基本フォーマット を参照してください 標準ログの時刻を表示する デフォルトでは オープン Java フレームワークのランタイムが出力する標準ログは IJServer のコンテナログに出力されます コンテナログにはタイムスタンプが自動的に付与されて出力されます 以下のように 標準ログの出力先がコンテナログではない場合で かつ標準ログと共に時刻もあわせて出力する場合などは 標準ログで使用するログ定義ファイルを修正する必要があります 標準ログの出力先をコンテナログやシステムログ (syslog) 以外の ファイルなどに設定する場合 デフォルトでは 時刻を出力するための定義は以下に示すとおり 無効になっています <!-- <item name="%d" length="-1" format="yyyy/mm/dd kk:mm:ss.sss"> </item> --> 以下の例を参考にして 時刻を出力するための定義を有効にしてください <item name="%d" length="-1" format="yyyy/mm/dd kk:mm:ss.sss"> </item> - 140 -
7.3 標準ログの出力レベル ログ機能では 出力する情報に重要度を表すレベルを設定することができます また 特定のレベル以上のログだけを出力するように設定できます ログ出力レベルを設定することにより デバッグ時には多くの情報をログに出力したり 本稼働時には重要度が高いログに絞って出力したり ログを出力しない運用にするという制御が可能になります たとえば ログ定義ファイルにおいてログ出力レベルを 10 に設定すると ログ出力レベルが 3 や 5 のログが出力されます なお インストール時のデフォルト設定では 出力レベルは 9 となっています 標準ログで利用するログレベル オープン Java フレームワークのランタイムの標準ログのログレベルは それぞれ以下のようになっています なお ログ定義を変更することにより 標準ログのログ出力レベルを変更することが可能です ログ定義の変更については 7.2 標準ログの定義 をご参照ください ログレベルを 15 に設定した場合 大量のログが IJServer のコンテナログに出力されます そのため アプリケーションの処理が遅くなることがあります この場合は ログレベルを下げてください また 大量のログが出力されることにより 古いログが消えてしまうことがあります ログの出力情報は IJServer ワークユニットおよびオープン Java フレームワークのランタイムの動作解析を行うための情報です したがって ログレベルを 15 に設定する場合は 出力先のディスク容量を十分確保してください IJServer ワークユニットのコンテナログの設定を変更し 大量のログが出力された場合でも ログの出力情報が保存されるような設定にすることを推奨します 以下に IJServer のログの設定方法を示します ログファイルのロールオーバログをバックアップする場合に ログサイズとログ収集時間のどちらでバックアップするかを指定します お使いの環境にあわせて ログサイズを変更してください 世代数バックアップしたログファイルを保管する世代数を指定します IJServer のログの設定は Interstage 管理コンソールの以下から行います [ システム ] > [ ワークユニット ] > ワークユニット名 > [ ログ定義 ] タブ > [ ワークユニットログの設定 ] システムログのログレベル オープン Java フレームワークのランタイムが出力するシステムログを ログレベルを使用して採取できます オープン Java フレームワークのランタイムで使用するログレベルは以下の種類があります ログレベル 出力情報 3 オープン Java フレームワークの開始と終了を示すログを出力 5 オープン Java フレームワークの分岐点での稼働状態を示すログを出力 15 サブコンポーネント間での稼働状態を示すログを出力 出力情報の詳細については 7.5 標準ログの基本フォーマットおよび 7.6 標準ログのメッセージ本文 を参照してください 性能ログのログレベル 性能ログには 以下のログレベルの種類があります Struts における性能ログのログレベル ログレベル 出力情報 3 開始時間は ActionServlet を開始した直後の時間 終了時間は ActionServlet から応答を返す時間を表示 15 開始時間は Action クラスを呼び出す直前の時間 終了時間は ユーザが作成した Action クラスから応答が返った時間を表示 - 141 -
ログレベル 出力情報 開始時間は Servlet/JSP を呼び出す直前の時間 終了時間は Servlet/JSP から応答が返った時間を表示 開始時間は Validator クラスを呼び出す直前の時間 終了時間は Validator クラスから応答が返った時間を表示 SpringFramework における性能ログのログレベル ログレベル 出力情報 3 開始時間は Spring-MVC を開始した直後の時間 終了時間は Spring-MVC から応答を返す時間を表示 開始時間は リモート接続先の IJServer を呼び出す直前の時間 終了時間は リモート接続先の IJServer から応答が返った時間を表示 開始時間は リモート接続を開始した直後の時間 終了時間は リモート接続から応答を返す時間を表示 開始時間は リモート環境下にあるクラスを呼び出す直前の時間 終了時間は リモート環境下にあるクラスから応答が返った時間を表示 15 開始時間は Spring が提供する Controller からクラスを呼び出す直前の時間 終了時間は 呼びだしたクラスから応答が返った時間を表示 ibatis における性能ログのログレベル ログレベル 開始時間は ユーザ作成の Controller クラスを呼び出す直前の時間 終了時間は ユーザ作成の Controller クラスから応答が返った時間を表示 開始時間は Servlet/JSP を呼び出す直前の時間 終了時間は Servlet/JSP から応答が返った時間を表示 開始時間は Validator クラスを呼び出す直前の時間 終了時間は Validator クラスから応答が返った時間を表示 出力情報 5 開始時間は ibatis の SQL 文発行メソッドを呼び出す直前の時間 終了時間は ibatis の SQL 文発行メソッドから応答が返った時間を表示 15 開始時間は SQL 発行を呼び出す直前の時間 終了時間は SQL 発行処理から応答が返った時間を表示 出力情報の詳細については 7.5 標準ログの基本フォーマットおよび 7.6 標準ログのメッセージ本文 を参照してください 7.4 サブシステム名 性能ログのセション情報に WEBアプリケーション単位でサブシステム名を出力することができます 以下に 設定方法を示します apfwlog.propertiesに以下のパラメタを追加します No. パラメタ名値説明 1 apfwlog.subsystemid 7 文字以内の半角英数字を指 定します 性能ログで出力するセション情報のサブシステム名です 省略すると セション情報にサブシステム名が出力されません サブシステム名を設定して有効にする場合 アプリケーションをワークユニットに再配備してください - 142 -
7.5 標準ログの基本フォーマット 標準ログの基本フォーマットについて以下に説明します 標準ログの基本フォーマットを以下に示します 図 7.1 標準ログの基本フォーマット 以下に 基本フォーマットの説明をします No. 項目名定義名出力内容 1 時刻 %d ログを出力した日時が 以下のフォーマットで出力されます 年 / 月 / 日時 : 分 : 秒. ミリ秒 なお 日と時の間には空白が出力されます 2 コンテキストID %i オープンJavaフレームワークから引き継いだコンテキストIDを常にメッセージ本文の前へ出力します 本情報は コンテキストIDが確定した段階で出力されます また 出力される文字列は 大括弧 [] で括られます なお 本項目の出力内容には空白が含まれる場合があります 出力例 : [ID 001] 3 メッセージ本文 %m 出力するログによって可変です メッセージ本文については システムログおよび性能ログそれぞれで 出力する本文フォーマットは可変です 上の表の 定義名 は ログ定義ファイルにあらかじめ定義されています 基本フォーマットの出力項目については ログ定義ファイルに 定義名 の記述を行うことで変更することが可能です インストール時のデフォルトでは 項目名 時刻 の定義は無効になっています 時刻 の定義を有効にするためには 7.2 標準ログの定義 を参照してください 以下に 定義名 をログ定義ファイルに追記して 基本フォーマットを変更する例を示します 図 7.2 変更した基本フォーマットの例 以下に 基本フォーマットを変更した場合の説明をします No. 項目名定義名出力内容 1 時刻 %d ログを出力した日時が 以下のフォーマットで出力されます 年 / 月 / 日時 : 分 : 秒. ミリ秒 なお 日と時の間には空白が出力されます 2 スレッド名 %t ログを出力したスレッド名 3 メソッド名 %s ログ出力を行ったオープン Java フレームワークのクラスのメソッド名 - 143 -
No. 項目名定義名出力内容 4 ログレベル %l ログの重要度 5 % 記号 %% % 記号 6 コンテキストID %i オープンJavaフレームワークから引き継いだコンテキストIDを常にメッセージ本文の前へ出力します 本情報は コンテキストIDが確定した段階で出力されます また 出力される文字列は 大括弧 [] で括られます なお 本項目の出力内容には空白が含まれる場合があります 出力例 : [ID 001] 7 メッセージ本文 %m 出力するログによって可変です 基本フォーマットの設定の詳細については Interstage Business Application Server アプリケーション開発ガイド の 汎用ログ の ログのフォーマットの設定 を参照してください 7.6 標準ログのメッセージ本文 7.6.1 システムログ システムログは オープン Java フレームワークの稼働状態を表すインフォメーションログや エラー情報を表すエラーログを表します システムログのメッセージ本文には 以下に示すフォーマットでメッセージが出力されます 図 7.3 Struts が出力するシステムログのフォーマット 図 7.4 SpringFramework が出力するシステムログのフォーマット - 144 -
図 7.5 ibatis が出力するシステムログのフォーマット 以下に システムログのメッセージ本文の説明をします No. 項目名 出力内容 1 ログ種別 IBS-AP-SYSTEM という文字列が出力されます 2 採取契機 システムログが出力される契機です ログの出力契機 を参照してください 3 メッセージID メッセージIDが出力されます 4 発生した例外情報 または 以下の付加情報を出力します Struts Actionパス 画面遷移先 リクエストURL Validator 種別のいずれか1つ メッセージ SpringFramework Bean 名 Validator 名 リクエストURL のいずれか1つ ibatis SQL Mapファイルで定義されたSQL ID SQL 文のどちらか 各項目の出力内容のなかに空白が含まれることがあります 本ログで出力するメッセージ本文の項目は ログ定義ファイルを用いて変更することは出来ません ログの出力契機 システムログは 以下の表に示す契機で出力されます Struts におけるシステムログの出力契機 ログ出力契機メッセージ ID ログの出力レベル採取契機の出力内容 ActionServlet 開始 8300 3 ActionServlet-Call - 145 -
ログ出力契機 メッセージID ログの出力レベル 採取契機の出力内容 ActionServlet 終了 8301 3 ActionServlet-Return Actionクラス呼出し直前 8302 15 Action-Class-Call Actionクラス終了直後 8303 15 Action-Class-Return Servlet/JSP 呼出し直前 8304 15 Struts-View-Call Servlet/JSP 終了直後 8305 15 Struts-View-Return Validatorクラス呼出し直前 8306 15 Struts-Validator-Call Validatorクラス終了直後 8307 15 Struts-Validator-Return SpringFrameworkにおけるシステムログの出力契機 ログ出力契機 メッセージID ログの出力レベル 採取契機の出力内容 spring-mvc 入口 8341 3 Spring-MVC-Call spring-mvc 終了 8342 3 Spring-MVC-Return Spring が提供する Controller から呼び出されるクラス呼出し直前 Spring が提供する Controller から呼び出されるクラス終了直後 8343 15 Spring-Controller-Call 8344 15 Spring-Controller-Return ユーザ作成のControllerクラス呼出し直前 8345 15 Controller-Class-Call ユーザ作成のControllerクラス終了直後 8346 15 Controller-Class-Return Servlet/JSP 呼出し直前 8347 15 Spring-View-Call Servlet/JSP 終了直後 8348 15 Spring-View-Return Validatorクラス呼出し直前 8349 15 Spring-Validator-Call Validatorクラス終了直後 8350 15 Spring-Validator-Return リモート呼出し直前 8351 3 Spring-Remote-Call リモート終了直後 8352 3 Spring-Remote-Return リモート入口 8353 3 Spring-Remote-Receive リモート終了 8354 3 Spring-Remote-Reply リモート環境下にあるクラス呼び出し直前 8355 3 Remote-Class-Call リモート環境下にあるクラス終了直後 8356 3 Remote-Class-Return ibatisにおけるシステムログの出力契機 ログ出力契機 メッセージID ログの出力レベル 採取契機の出力内容 ibatisのsql 文発行メソッド実行の入口 8381 5 ibatis-call ibatisのsql 文発行メソッド実行の出口 8382 5 ibatis-return SQL 実行直前 8383 15 ibatis-sql-call SQL 実行直後 8384 15 ibatis-sql-return 出力例以下の条件におけるシステムログの出力例を示します コンテキストID:ContextID 出力契機 :ActionServlet-Call - 146 -
メッセージ ID:8300 2009/04/21 19:07:11.377 [ContextID] IBS-AP-SYSTEM ActionServlet-Call 8300 [/test.war] ActionPath="/testAction" 7.6.2 性能ログ 性能ログは オープン Java フレームワーク内部での実行時間を表します 性能ログのメッセージ本文には 以下に示すフォーマットでメッセージを出力します 図 7.6 Struts が出力する性能ログのフォーマット 図 7.7 SpringFramework が出力する性能ログのフォーマット - 147 -
図 7.8 ibatis が出力する性能ログのフォーマット 以下に 性能ログのメッセージ本文の説明をします No. 項目名 出力内容 1 ログ種別 IBS-AP-PERFORMANCE という文字列が出力されます 2 採取契機 性能ログが出力される契機です ログの出力契機 を参照してください 3 メッセージID メッセージIDが出力されます 4 以下の付加情報を出力します Struts Actionパス 画面遷移先 リクエストURL Validator 種別のいずれか1つ SpringFramework Bean 名 Validator 名 メッセージ リクエスト URL のいずれか 1 つ ibatis SQL Map ファイルで定義された SQL ID SQL 文 のどちらか 性能情報が出力されます メッセージには 以下の情報を出力します セション情報開始時刻出力時刻経過時間 開始時刻 および 出力時刻 は 年 / 月 / 日時 : 分 : 秒. ミリ秒 のフォーマットで出力されます なお 日と時の間には空白が出力されます 出力例 : ActionPath="/testAction.do" host1 Struts 2004/11/05 19:07:07.484 2004/11/05 19:07:11.377-148 -
各項目の出力内容のなかに空白が含まれることがあります セション情報 オープン Java フレームワークで出力されるセション情報は以下の 2 つがあります No. 項目名定義名長さ出力内容 1 ホスト名 session.hostname 16 ホスト名が出力されます 2 サブシステム名 session.subsystemid 7 オープンJavaフレームワークを識別する情 報を出力します ( 注 1) 注 1) オープン Java フレームワークのランタイムが出力する性能ログのサブシステム名は 以下のようになります Struts SpringFramework ibatis オープン Java フレームワーク名 Struts Spring ibatis サブシステム名 ログの出力契機 性能ログは 以下の表に示す契機で出力されます Strutsにおける性能ログの出力契機ログ出力契機 メッセージID ログの出力レベル 採取契機の出力内容 ActionServlet 終了 8500 3 ActionServlet Actionクラス終了直後 8501 15 Action-Class Servlet/JSP 終了直後 8502 15 Struts-View Validatorクラス終了直後 8503 15 Struts-Validator SpringFrameworkにおける性能ログの出力契機ログ出力契機 メッセージID ログの出力レベル 採取契機の出力内容 spring-mvc 終了 8541 3 Spring-MVC Spring が提供する Controller から呼び出されるクラス終了直後 8542 15 Spring-Controller ユーザ作成のControllerクラス終了直後 8543 15 Controller-Class Servlet/JSP 終了直後 8544 15 Spring-View Validatorクラス終了直後 8545 15 Spring-Validator リモート終了直後 8546 3 Spring-Remote リモート終了 8547 3 Spring-Remote-App リモート環境下にあるクラス終了直後 8548 3 Remote-Class ibatisにおける性能ログの出力契機ログ出力契機 メッセージID ログの出力レベル 採取契機の出力内容 ibatisのsql 文発行メソッド実行の出口 8581 5 ibatis - 149 -
ログ出力契機メッセージ ID ログの出力レベル採取契機の出力内容 SQL 実行直後 8582 15 ibatis-sql 出力例 以下の条件における性能ログの出力例を示します コンテキスト ID:ContextID 出力契機 :ActionServlet メッセージ ID:8500 ホスト名 :host1 サブシステム名 :Struts 開始時刻 :2009 年 05 月 01 日 19 時 07 分 07 秒 終了時刻 :2009 年 05 月 01 日 19 時 07 分 11 秒 2009/05/01 19:07:11.377 [ContextID] IBS-AP-PERFORMANCE ActionServlet 8500 [/test.war] host1 Struts 2009/05/01 19:07:07:484 2009/05/01 19:07:11:377 3893 7.7 注意事項 開発環境における標準ログの動作について 開発環境において Interstage Studio のアプリケーションサーバ上でオープン Java フレームワークを利用した場合 システムログ および性能ログを出力することはできません FSP_INTS-BAS_JF6010 の警告が表示されますが 問題ありません 7.8 トラブルシューティング 性能ログおよびシステムログを出力することができない 以下の可能性があります 性能ログ システムログの出力に必要な資材が IJServer のクラスパスに設定されていない可能性があります IJServer のクラスパスを確認してください - 150 -
第 8 章バックアップ リストアおよびクラスタ 8.1 バックアップ リストア資源の一覧 オープンJavaフレームワークのバックアップ リストア対象資源は以下の通りです アプリケーションサーバ環境資源 Interstage Business Application Serverのetcディレクトリ配下 Interstage Business Application Serverのvarディレクトリ配下 Interstage Application Server 用の資源ファイルユーザログ定義資源 ( 注 1) ( 注 2) : 必須 : 任意 注 1) 詳細は Interstage Application Server 運用ガイド ( 基本編 ) を参照してください 注 2) 該当する機能を利用している場合は バックアップ リストア資源の対象としてください 8.2 バックアップの手順 オープン Java フレームワークにおけるバックアップの作業の流れを以下に示します 1. アプリケーションサーバの停止 2. アプリケーションサーバ環境資源のバックアップ 3. アプリケーションサーバの起動 8.2.1 アプリケーションサーバの停止 Interstage 管理コンソールまたは isstop コマンドを使用し Interstage を強制停止します 詳細は Interstage Application Server 運用ガイド ( 基本編 ) を参照してください 8.2.2 アプリケーションサーバ環境資源のバックアップ Interstage Business Application Server の etc ディレクトリのバックアップ Interstage Business Application Server 運用ガイド ( アプリケーション連携実行基盤編 ) の Interstage Business Application Server の etc ディレクトリのバックアップ を参照してください Interstage Business Application Server の var ディレクトリのバックアップ Interstage Business Application Server 運用ガイド ( アプリケーション連携実行基盤編 ) の Interstage Business Application Server の var ディレクトリのバックアップ を参照してください Interstage Application Server 用の資源ファイルのバックアップ Interstage Application Server 運用ガイド ( 基本編 ) を参照してください ユーザログ定義資源のバックアップ Interstage Business Application Server 運用ガイド ( アプリケーション連携実行基盤編 ) の ユーザログ定義資源のバックアップ を参照してください - 151 -
8.2.3 アプリケーションサーバの起動 処理前に停止したサービスを Interstage 管理コンソールまたは isstart コマンドで起動します 詳細は Interstage Application Server 運用ガイド ( 基本編 ) を参照してください 8.3 リストアの手順 オープン Java フレームワークにおけるリストアの作業の流れを以下に示します 1. アプリケーションサーバの停止 2. アプリケーションサーバ環境資源のリストア 3. アプリケーションサーバの起動 8.3.1 アプリケーションサーバの停止 Interstage 管理コンソールまたは isstop コマンドを使用し Interstage を強制停止します 詳細は Interstage Application Server 運用ガイド ( 基本編 ) を参照してください 8.3.2 アプリケーションサーバ環境資源のリストア Interstage Business Application Server の etc ディレクトリのリストア Interstage Business Application Server 運用ガイド ( アプリケーション連携実行基盤編 ) の Interstage Business Application Server の etc ディレクトリのリストア を参照してください Interstage Business Application Server の var ディレクトリのリストア Interstage Business Application Server 運用ガイド ( アプリケーション連携実行基盤編 ) の Interstage Business Application Server の var ディレクトリのリストア を参照してください Interstage Application Server 用の資源ファイルのリストア Interstage Application Server 運用ガイド ( 基本編 ) を参照してください ユーザログ定義資源のリストア Interstage Business Application Server 運用ガイド ( アプリケーション連携実行基盤編 ) の ユーザログ定義資源のリストア を参照してください 8.3.3 アプリケーションサーバの起動 処理前に停止したサービスを Interstage 管理コンソールまたは isstart コマンドで起動します 詳細は Interstage Application Server 運用ガイド ( 基本編 ) を参照してください 8.4 クラスタ構成 クラスタについての詳細は Interstage Application Server 高信頼性システム運用ガイド を参照してください - 152 -
付録 A TERASOLUNA のサンプルアプリケーション ここでは TERASOLUNA アプリケーションのサンプルの作成方法および 動作方法を説明します A.1 サンプルの導入方法 ここでは サンプルの導入方法について説明します 本製品では以下のプロジェクトを提供します これらを開発環境にインポートして使用してください ブランクプロジェクトの所在ブランクプロジェクトは Interstage Business Application Serverの開発環境パッケージに同梱されています <Interstageインストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaBatchBlank.zip <Interstageインストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaRichBlank.zip <Interstageインストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaWebBlank.zip サンプルの所在サンプルプロジェクトは Interstage Business Application Serverの開発環境パッケージに同梱されています <Interstage インストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaBatchSample.zip <Interstage インストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaRichSample.zip <Interstage インストールディレクトリ >\BAS\sample\openjava\terasoluna\ISTerasolunaWebSample.zip A.2 TERASOLUNA Server Framework for Java (Web 版 ) のサンプル ここでは TERASOLUNA Server Framework for Java(Web 版 ) のサンプルの構成および動作方法を説明します サンプルの詳細については TERASOLUNAのドキュメント ( チュートリアル ) を参照してください A.2.1 サンプルの構成 このサンプルは ブランクプロジェクトをもとに 追加 修正を行って作成しています このサンプルでは 以下のことが行えます 項目ログオン / ログオフ画面分岐登録処理一覧表示入力チェック ( 単項目 ) 入力チェック ( 相関 ) アクセス制御 説明ビジネスロジッククラスの実行方法とユーザーバリューオブジェクトの使用方法画面のボタンによる分岐方法データベースアクセス一覧表示の実装方法単項目チェックの実装方法相関チェックの実装方法ログオン済みチェック方法 変更点 ブランクプロジェクトからの変更点について 以下に記載します - 153 -
変更を加えた設定ファイル ファイル名説明変更した箇所 sqlmap.xml commoncontext.xml applicationcontext.xml struts-config.xml web.xml SQL 設定ファイル SQL 文を設定する Spring 設定ファイル モジュール共通の Bean 定義ファイル Spring 設定ファイル アプリケーション全体の Bean 定義ファイル Struts 設定ファイル アクションフォームやアクションパスの設定を行う Web アプリケーション設定ファイル フィルタの設定を行う SQL 文の追加トランザクション AOP 定義各種フィルタコントローラ定義プラグイン定義 SpringBean 設定ファイル バリデーション設定ファイル 入出力設定ファイルサーブレット定義各業務のStruts 設定ファイルを定義フィルタ定義 変更を加えたファイル ファイル名説明変更した箇所 welcome.jsp 初期画面ログオン画面へのリンク ApplicationResources.properties アプリケーションリソースファイル UVO の設定 認証を行わないパス application-messages.properties メッセージリソースファイルメッセージの追加 エラーメッセージの追加 pagelinks.properties ページリンクプロパティファイル 遷移できるページ数 リンクの文字列を設 定 追加作成したフォルダ フォルダ名 ContextRoot\WEB-INF\logon ContextRoot\WEB-INF\userManager ContextRoot\logon ContextRoot\userManager ログオン業務ユーザ管理業務ログオン業務ユーザ管理業務 業務名 追加作成したファイルファイル名 ContextRoot\WEB-INF\logon\struts-logon-config.xml ContextRoot\WEB-INF\logon\logonContext.xml ContextRoot\WEB-INF\logon\validation-logon.xml 説明 Struts 設定ファイル Spring 設定ファイルバリデーション設定ファイル - 154 -
ファイル名 ContextRoot\WEB-INF\logon\blogic-logon-io.xml ContextRoot\WEB-INF\userManager\struts-userManager-config.xml ContextRoot\WEB-INF\userManager\userManagerContext.xml ContextRoot\WEB-INF\userManager\validation-userManager.xml ContextRoot\WEB-INF\userManager\blogic-userManager-io.xml ContextRoot\logon\logon.jsp ContextRoot\logon\menu.jsp ContextRoot\userManager\insert.jsp ContextRoot\userManager\list.jsp ContextRoot\userManager\result.jsp jp.terasoluna.thin.sample.web.common.controller.sampleauthcontroller jp.terasoluna.thin.sample.web.common.uvo.sampleuvo jp.terasoluna.thin.sample.web.logon.blogic.logonblogic jp.terasoluna.thin.sample.web.logon.dto.logoninput jp.terasoluna.thin.sample.web.logon.dto.logonoutput jp.terasoluna.thin.sample.web.logon.form.logonform jp.terasoluna.thin.sample.web.usermanager.blogic.insertblogic jp.terasoluna.thin.sample.web.usermanager.blogic.listblogic jp.terasoluna.thin.sample.web.usermanager.dto.insertinput jp.terasoluna.thin.sample.web.usermanager.dto.listinput jp.terasoluna.thin.sample.web.usermanager.dto.listoutput jp.terasoluna.thin.sample.web.usermanager.exception.insertexception jp.terasoluna.thin.sample.web.usermanager.form.agevalidator jp.terasoluna.thin.sample.web.usermanager.form.usermanagerform jp.terasoluna.thin.sample.web.usermanager.vo.selectuseroutput 説明 入出力設定ファイル Struts 設定ファイル Spring 設定ファイル バリデーション設定ファイル 入出力設定ファイル ログオン画面 メニュー画面 登録画面 一覧表示画面 結果画面 認証チェックを行う ユーザバリューオブジェクト実装クラス ログオン処理を行うビジネスロジック ログオン処理の入力クラス ログオン処理の出力クラス ログオン業務で使用するアクションフォーム 登録処理を行うビジネスロジック 一覧データを取得するビジネスロジック 登録処理の入力クラス 一覧データ取得処理の入力クラス 一覧データ取得処理の出力クラス 業務例外クラス 入力された年齢と生年月日の相関入力チェックを行うクラス ユーザ管理業務で使用するアクションフォーム 情報保持 Bean データベースからの取得時に画面からの入力時に使用される 変更内容の詳細については TERASOLUNA のドキュメント ( チュートリアル ) を参照してください Java のビルドパスの修正 サンプルでは Interstage を C:\Interstage にインストールされたものとして あらかじめ Java のビルドパスを設定してあります Interstage を C:\Interstage 以外のディレクトリにインストールした場合は Java のビルドバスを修正してください A.2.2 動作方法 サンプルを実行するための手順を説明します 1. データベースの作成 2. JDBC データソースの作成 - 155 -
3. IJServer ワークユニットの作成 4. 配備 5. 実行 1. データベースの作成 データベースを作成します サンプル用テーブルの作成については サンプルプロジェクトに含まれるスクリプトを利用してください 2. JDBC データソースの作成 Interstage 管理コンソールを使用し JDBC データソースを作成します [Interstage Application Server]>[ システム ]>[ リソース ]>[JDBC] を選択し 新規作成を行います 定義名 :TerasolunaWebSampleDataSource とし それ以外については 使用するデータベースに合わせて JDBC データソースを作成してください なお ここに作成するデータソースの内容と サンプルプロジェクト内の context.xml の記載内容を一致させてください 3. IJServer ワークユニットの作成 Interstage 管理コンソールを使用し IJServer ワークユニットを作成します [Interstage Application Server]>[ システム ]>[ ワークユニット ] を選択し 新規作成を行います また 5.2.2 クラスパスの設定 で説明しているクラスパスを追加します 4. 配備 作成した IJServer ワークユニットに サンプルプロジェクトでビルドした war を配備します 5. 実行 http://localhost/isterasolunawebsample/ にアクセスし サンプルを実行します 動作確認方法の詳細については TERASOULA のドキュメント ( チュートリアル ) を参照してください A.3 TERASOLUNA Server Framework for Java (Rich 版 ) のサンプル ここでは TERASOLUNA Server Framework for Java(Rich 版 ) のサンプルの構成および動作方法を説明します サンプルの詳細については TERASOLUNAのドキュメント ( チュートリアル ) を参照してください A.3.1 サンプルの構成 このサンプルは ブランクプロジェクトをもとに 追加 修正を行って作成しています このサンプルでは 以下のことが行えます 項目単純なロジックデータベースアクセス入力チェック ( 単項目 ) 入力チェック ( 相関 ) 例外処理アクセス制御 説明クライアントからのリクエスト処理データベースからのデータ取得やデータ更新単項目チェックの実装相関チェックの実装例外発生時の対処特定のパスへのアクセス制御 - 156 -
変更点 ブランクプロジェクトからの変更点について 以下に記載します ブランクプロジェクトから名前変更を行ったファイル リネーム前 blank-businesslogic.xml blank-controller.xml blank-servlet.xml リネーム後 sample-businesslogic.xml sample-controller.xml sample-servlet.xml 変更を加えた設定ファイル sqlmap.xml ファイル名説明変更した箇所 SQL 設定ファイル SQL 文を設定する SQL 文の追加 validation.xml バリデーション設定ファイル formset タグ内 commoncontext.xml applicationcontext.xml sample-businesslogic.xml sample-controller.xml Spring 設定ファイル AOP の Bean 定義ファイル Spring 設定ファイル アプリケーション全体の Bean 定義ファイル Spring 設定ファイル モジュール固有の Bean 定義ファイル Spring 設定ファイル モジュール固有の Bean 定義ファイル トランザクション AOP 定義 AOP の定義 入力チェック定義 業務ロジック定義 単純なロジック simpleservice 定義 データベースアクセス dbaccessservice 定義 コントローラ定義 単純なロジック xml-blogic-castor 定義 データベースアクセス xml-blogiccaster 定義 sample-setvlet.xml web.xml Spring 設定ファイル プレゼンテーション層共通の Bean 定義ファイル Web アプリケーション設定ファイル フィルタの設定を行う オブジェクト-XMLマッピング定義 BLogicコントローラ定義サーブレットマッピング定義エラーリソース定義 変更を加えたファイル ファイル名 説明 変更した箇所 application-messages.properties メッセージリソースファイル 共通 Validation 例外制御で使うメッセージ - 157 -
追加作成したファイル ファイル名 jp.terasoluna.rich.sample.service.bean.userbean jp.terasoluna.rich.sample.service.bean.resultdata jp.terasoluna.rich.sample.service.blogic.simpleblogic jp.terasoluna.rich.sample.service.blogic.dbaccessblogic jp.terasoluna.rich.sample.service.validation.agevalidator 説明 ユーザ情報保持 Bean 入力クラス データベースからの取得時に使用される 結果クラス 入力クラスを結果クラスに格納する BLogic クラス データベースアクセスの BLogic クラス 入力された年齢と 生年月日の相関入力チェックを行う 変更内容の詳細については TERASOLUNA のドキュメント ( チュートリアル ) を参照してください Java のビルドパスの修正 サンプルでは Interstage を C:\Interstage にインストールされたものとして あらかじめ Java のビルドパスを設定してあります Interstage を C:\Interstage 以外のディレクトリにインストールした場合は Java のビルドバスを修正してください A.3.2 動作方法 サンプルを実行するための手順を説明します 1. データベースの作成 2. JDBC データソースの作成 3. IJServer ワークユニットの作成 4. 配備 5. 実行 1. データベースの作成 データベースを作成します サンプル用テーブルの作成については サンプルプロジェクトに含まれるスクリプトを利用してください 2. JDBC データソースの作成 Interstage 管理コンソールを使用し JDBC データソースを作成します [Interstage Application Server]>[ システム ]>[ リソース ]>[JDBC] を選択し 新規作成を行います 定義名 :TerasolunaRichSampleDataSource とし それ以外については 使用するデータベースに合わせて JDBC データソースを作成してください なお ここに作成するデータソースの内容と サンプルプロジェクト内の context.xml の記載内容を一致させてください 3. IJServer ワークユニットの作成 Interstage 管理コンソールを使用し IJServer ワークユニットを作成します [Interstage Application Server]>[ システム ]>[ ワークユニット ] を選択し 新規作成を行います また 5.2.2 クラスパスの設定 で説明しているクラスパスを追加します 4. 配備 作成した IJServer ワークユニットに サンプルプロジェクトでビルドした war を配備します - 158 -
5. 実行 サンプルプロジェクト内に含まれる index.html(isterasolunarichsample/contextroot/web-inf/index.html) を Web ブラウザで開き サンプルを実行します 動作確認方法の詳細については TERASOULA のドキュメント ( チュートリアル ) を参照してください A.4 TERASOLUNA Batch Framework for Java のサンプル ここでは TERASOLUNA Batch Framework for Javaのサンプルの作成方法および 動作方法を説明します なお ここで説明する手順で作成したサンプルの所在は サンプルの所在 を参照してください A.4.1 サンプルの作成方法 ここでは ブランクプロジェクトを元に サンプルを作成する手順を説明します サンプルを作成する手順を 次に示します 1. ブランクプロジェクトのインポート 2. プロジェクト名の変更 3. ファイルパスの修正 4. Javaパッケージの作成 5. 非同期ジョブを実行するJavaクラスの作成 6. 非同期ジョブを実行するサーブレットの作成 7. JSPの作成 8. ビジネスロジックの作成 9. ジョブ定義 Beanファイルの作成 ブランクプロジェクトのインポート 次の手順で ブランクプロジェクトをインポートします 1. Interstage Studio を起動します 2. Interstage Studio のメニューバーから [ ファイル ] > [ インポート ] を実行し [ インポート ] の画面を表示します 3. [ 選択 ] の画面で [ 一般 ] > [ 既存プロジェクトをワークスペースへ ] を選択し [ 次へ ] を実行します 4. [ プロジェクトのインポート ] の画面で [ アーカイブファイルの選択 ] を選択します 5. [ 参照 ] を実行し ブランクプロジェクトの zip ファイルを指定します なお ブランクプロジェクトの所在は ブランクプロジェクトの所在 を参照してください 6. [ プロジェクト ] に [ISTerasolunaBatchBlank] が表示されます 7. [ 終了 ] を実行します プロジェクト名の変更次の手順で プロジェクト名を変更します 1. Interstage Studioの [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchBlank] を選択する 2. Interstage Studioのメニューバーから [ ファイル ] > [ 名前変更 ] を実行し [Java プロジェクト名の変更 ] の画面を表示します 3. [ 新しい名前 ] に ISTerasolunaBatchSample を入力し [OK] を実行します なお プロジェクト名の変更に伴い プロジェクトのルートフォルダに ISTerasolunaBatchBlank.war が残っている場合は 削除します - 159 -
ファイルパスの修正 サンプルでは Interstage を C:\Interstage にインストールされたものとして あらかじめファイルパスを設定しています Interstage を C:\Interstage 以外のディレクトリにインストールした場合は 5.3.2 ファイルパスの修正 を参照してファイルパスを修正してください Java パッケージの作成 次の手順で src フォルダ配下に Java パッケージ servlet を作成します 1. Interstage Studio の [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchSample] > [src] を選択します 2. Interstage Studio のメニューバーから [ ファイル ] > [ 新規作成 ] > [ パッケージ ] を実行し [ 新規 Java パッケージ ] の画面を表示します 3. [Java パッケージ ] の画面で [ 名前 ] に servlet を入力し [ 終了 ] を実行します 次の手順で src フォルダ配下に Java パッケージ job.job001 を作成します 1. Interstage Studio の [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchSample] > [src] を選択します 2. Interstage Studio のメニューバーから [ ファイル ] > [ 新規作成 ] > [ パッケージ ] を実行し [ 新規 Java パッケージ ] の画面を表示します 3. [Java パッケージ ] の画面で [ 名前 ] に job.job001 を入力し [ 終了 ] を実行します 次の手順で batchappes フォルダ配下に Java パッケージ job.job001 を作成します 1. Interstage Studio の [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchSample] > [batchapps] を選択します 2. Interstage Studio のメニューバーから [ ファイル ] > [ 新規作成 ] > [ パッケージ ] を実行し [ 新規 Java パッケージ ] の画面を表示します 3. [Java パッケージ ] の画面で [ 名前 ] に job.job001 を入力し [ 終了 ] を実行します 非同期ジョブを実行するJavaクラスの作成次の手順で 非同期ジョブを実行するクラス servlet.jobstarterinternal を作成します 1. Interstage Studioの [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchSample] > [src] > [servlet] を選択します 2. Interstage Studioのメニューバーから [ ファイル ] > [ 新規作成 ] > [ クラス ] を実行し [ 新規 Java クラス ] の画面を表示します 3. [Java クラス ] の画面で [ 名前 ] に JobStarterInternal を入力し [ 終了 ] を実行します 4. servlet.jobstarterinternalクラスを 下図になるようにコーディングします /* * Interstage Business Application Server * * Copyright (c) 2009 FUJITSU LIMITED All Rights Reserved. */ package servlet; import jp.terasoluna.fw.batch.commonj.init.jobstarterimpl; import org.springframework.context.configurableapplicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; /** *CommonJ 用ジョブ起動クラスを介して ジョブを実行するクラスです */ class JobStarterInternal { /** * ジョブの実行が成功したことを示します */ public static final int SCHDULE_SUCCESS = 0; - 160 -
/** * ジョブの実行が失敗したことを示します */ public static final int SCHDULE_ERROR = 1; /** * ジョブを実行します *@param jobid ジョブ ID *@param beanfilename ジョブ Bean 定義ファイル *@param args ジョブパラメーター *@return 実行結果 */ public static int execute(string jobid, String beanfilename, String[] args){ final String[] xmlpaths = new String[]{"common/WorkManagerContext.xml", "common/dataaccesscontext-batch.xml"}; final ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(xmlPaths); final JobStarterImpl starter = (JobStarterImpl)context.getBean("jobStarter"); } } if(args == null){ args = new String[0]; } return starter.execute(jobid, beanfilename, args); servlet.jobstarterinternalクラスの内容非同期ジョブを実行するサーブレットの作成次の手順で 非同期ジョブを実行するサーブレット servlet.executejobservlet を作成します 1. Interstage Studioの [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchSample] > [src] > [servlet] を選択します 2. Interstage Studioのメニューバーから [ ファイル ] > [ 新規作成 ] > [ その他 ] を実行し [ 新規 ] の画面を表示します 3. [ ウィザードを選択 ] の画面で [J2EE] > [ サーブレット ] を選択し [ 次へ ] を実行します 4. [ サーブレット ] の画面で [ クラス名 ] に ExecuteJobServlet を入力し [ 終了 ] を実行します 5. servlet.executejobservletクラスを 下図になるようにコーディングします /* * Interstage Business Application Server * * Copyright (c) 2009 FUJITSU LIMITED All Rights Reserved. */ package servlet; import java.io.ioexception; import javax.servlet.requestdispatcher; import javax.servlet.servletcontext; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; /** * クライアントからのジョブ実行要求を受け付けて ジョブを実行するサーブレットです */ public class ExecuteJobServlet extends HttpServlet { private static final long serialversionuid = -2914225006698774210L; @Override protected void service(httpservletrequest rq, HttpServletResponse rs) throws ServletException, IOException{ - 161 -
final String jobid = rq.getparameter("jobid"); // ジョブID final String beanfilename = rq.getparameter("beanfilename"); // ジョブBean 定義ファイル final String arguments = rq.getparameter("arguments"); // ジョブパラメーター final String[] args = (arguments!=null)? arguments.split(" ") : null; boolean result = false; try { final int r = JobStarterInternal.execute(jobId, beanfilename, args); result = (r == JobStarterInternal.SCHDULE_SUCCESS); } catch (Throwable e) { e.printstacktrace(); } } } rq.setattribute("result", result); ServletContext servletcontext = this.getservletcontext(); RequestDispatcher dispatcher = servletcontext.getrequestdispatcher("/result.jsp"); rs.setcharacterencoding("windows-31j"); dispatcher.forward(rq, rs); servlet.executejobservlet クラスの内容 JSPの作成次の手順で トップページとなるJSP /index.jsp を作成します 1. Interstage Studioの [ パッケージエクスプローラ ] ビューで [ContextRoot] を選択します 2. Interstage Studioのメニューバーから [ ファイル ] > [ 新規作成 ] > [ その他 ] を実行し [ 新規 ] の画面を表示します 3. [ ウィザードを選択 ] の画面で [J2EE] > [JSP] を選択し [ 次へ ] を実行します 4. [JavaServer Page] の画面で [ ファイル名 ] に index.jsp を入力し [ 終了 ] を実行します 5. /index.jspを 下図になるようにコーディングします <%@ page language="java" contenttype="text/html; charset=windows-31j" pageencoding="windows-31j"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=shift_jis"> <title>top</title> </head> <body bgcolor="#cccccc"> <h1> 非同期バッチデーモン </h1> <form action="executejobservlet" method="post"> <input type="hidden" name="jobid" value="asyncbatchdaemon"> <input type="hidden" name="beanfilename" value="common/asyncbatchdaemonforcommonjbean.xml"> <input type="submit" value=" 非同期バッチデーモンの実行 "> </form> <hr> <h1> 非同期ジョブ </h1> <form action="executejobservlet" method="post"> <table border="0"> <tr><td> ジョブ ID</td><td>:<input type="text" size="80" name="jobid" value="samplejob"></td></tr> <tr><td> ジョブ Bean 定義ファイル </td><td>:<input type="text" size="80" name="beanfilename" value="job/job001/ SampleJob.xml"></td></tr> <tr><td> ジョブパラメーター </td><td>:<input type="text" size="80" name="arguments" value=""></td></tr> <tr><td colspan="2" align="right"><input type="submit" value=" 非同期ジョブの実行 "></td></tr> </table> </form> - 162 -
</body> </html> index.jspの内容次の手順で 前述の servlet.executejobservlet サーブレットの実行結果を出力するJSP /result.jsp を作成します 1. Interstage Studioの [ パッケージエクスプローラ ] ビューで [ContextRoot] を選択します 2. Interstage Studioのメニューバーから [ ファイル ] > [ 新規作成 ] > [ その他 ] を実行し [ 新規 ] の画面を表示します 3. [ ウィザードを選択 ] の画面で [J2EE] > [JSP] を選択し [ 次へ ] を実行します 4. [JavaServer Page] の画面で [ ファイル名 ] に result.jsp を入力し [ 終了 ] を実行します 5. /result.jspを 下図になるようにコーディングします <%@ page language="java" contenttype="text/html; charset=windows-31j" pageencoding="windows-31j"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=shift_jis"> <title>result</title> </head> <body bgcolor="#cccccc"> <h1> ジョブの実行結果 </h1> <p> <% boolean success = (Boolean)request.getAttribute("result"); if(success){ out.print(" 実行に成功しました "); }else{ out.print(" 実行に失敗しました "); } %> </p> </body> </html> result.jsp の内容 ビジネスロジックの作成 次の手順で ビジネスロジック job.job001.sampleblogic を作成します 1. Interstage Studio の [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchSample] > [src] > [job.job001] を選択します 2. Interstage Studio のメニューバーから [ ファイル ] > [ 新規作成 ] > [ クラス ] を実行し [ 新規 Java クラス ] の画面を表示します 3. [Java クラス ] の画面で [ 名前 ] に SampleBLogic を入力し [ インタフェース ] に jp.terasoluna.fw.batch.openapi.blogic を追加し [ 終了 ] を実行します 4. job.job001.sampleblogic クラスを 下図になるようにコーディングします /* * Interstage Business Application Server * * Copyright (c) 2009 FUJITSU LIMITED All Rights Reserved. */ package job.job001; import jp.terasoluna.fw.batch.openapi.blogic; import jp.terasoluna.fw.batch.openapi.blogicresult; - 163 -
import jp.terasoluna.fw.batch.openapi.jobcontext; import jp.terasoluna.fw.batch.openapi.returncode; /** * サンプルのビジネスロジックです */ public class SampleBLogic implements BLogic<String, JobContext> { } public BLogicResult execute(string data, JobContext jobcontext) { System.out.println(this.getClass().getName()+": data="+data); return new BLogicResult(ReturnCode.NORMAL_CONTINUE); } job.job001.sampleblogic クラスの内容 ジョブ定義 Beanファイルの作成次の手順で ジョブ定義 Beanファイル job.job001.samplejob.xml を作成します 1. Interstage Studioの [ パッケージエクスプローラ ] ビューで [ISTerasolunaBatchSample] > [batchapps] > [job.job001] を選択します 2. Interstage Studioのメニューバーから [ ファイル ] > [ 新規作成 ] > [ その他 ] を実行し [ 新規 ] の画面を表示します 3. [ ウィザードを選択 ] の画面で [XML] > [XML 文書ファイル ] を選択し [ 次へ ] を実行します 4. [XML ファイルの作成 ] の画面で [XML ファイルを最初から作成 ] を選択し [ 次へ ] を実行します 5. [XML ファイル名 ] の画面で [ ファイル名 ] に SampleJob.xml を入力し [ 終了 ] を実行します 6. job.job001.samplejob.xmlを 下図になるようにコーディングします <?xml version="1.0" encoding="utf-8"?> <!-- サンプルのジョブ定義ファイルです --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemalocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> <import resource="classpath:/template/notransactionbean.xml"/> <bean id="collector" parent="stringarraypropertychunkcollector"> <property name="dataarray" value="data1,data2,data3" /> </bean> <bean id="blogic" class="job.job001.sampleblogic"> </bean> </beans> job.job001.samplejob.xmlの内容以上で サンプルの完成です A.4.2 サンプルの動作方法 ここでは サンプルを実行する手順を説明します サンプルを実行する手順を 次に示します 1. データベースの作成 - 164 -
2. JDBCデータソースの作成 3. IJServerワークユニットの作成 4. サンプルの配備 5. サンプルの実行 データベース作成 データベースを作成します なお テーブルを作成する SQL のサンプルは /sql フォルダにあります JDBC データソースの作成 Interstage 管理コンソールもしくは j2eeadmin コマンドを使用し JDBC データソースを作成します その際 [ 定義名 ] には TerasolunaBatch を設定し それ以外の項目には使用するデータベースに合わせて適切な設定を行います また JDBC データソースが使用する JDBC ドライバの jar を Interstage Application Server のシステムのクラスパスに追加します IJServer ワークユニットの作成 Interstage 管理コンソールを使用し IJServer ワークユニットを作成します [Interstage Application Server]>[ システム ]>[ ワークユニット ] を選択し 新規作成を行います また 5.2.2 クラスパスの設定 で説明しているクラスパスを追加します サンプルの配備 作成した IJServer ワークユニットに サンプルプロジェクトでビルドした war を配備します サンプルの実行 http://localhost/isterasolunabatchsample/ にアクセスすると 次の画面が表示されます 続いて [ 非同期ジョブの実行 ] を実行します サンプルの実行結果の確認 ジョブの実行に成功すると 次の画面が表示されます - 165 -
また コンテナログに 次のログが出力されていれば ジョブが正常に実行されたことを示します job.job001.sampleblogic: data=data1 job.job001.sampleblogic: data=data2 job.job001.sampleblogic: data=data3 Job processing END : [jobid=samplejob] [jobrequestno=] [StartType=SYNC] [jobexitcode=0] - 166 -
付録 B 謝辞 免責文 ライセンス文 ここでは Interstage Business Application Server オープン Java フレームワーク機能に関わる謝辞 免責文そしてライセンス文について記載します B.1 Apache License のライセンス文 本製品は Apache License Version 2.0 のもとで開発されたソフトウェアを含んでいます 以下に Apache License Version 2.0 のライセンス文を示します Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical - 167 -
transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - 168 -
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works - 169 -
that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify - 170 -
the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this - 171 -
License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/license-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. B.2 AspectJ のライセンス文 本製品に含まれる以下のモジュールは Eclipse Public License の適用対象であるソフトウェアです - 172 -
< インストールディレクトリ > BAS lib aspectjweaver.jar < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.aspectj.ajde_1.5.4.200705211336 < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.aspectj.runtime_1.5.4.200705211336 < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.aspectj.weaver_1.5.4.200705211336 < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.eclipse.ajdt.examples_1.4.2.200705221209 < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.eclipse.ajdt.pde.build_1.4.2.200705221209 < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.aspectj.aspectjrt_1.6.0.v200805211800.jar < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.aspectj.weaver-1.6.4.jar < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.eclipse.ajdt.core_1.4.2.200705221209.jar < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.eclipse.ajdt.ui_1.4.2.200705221209.jar < 開発環境インストールディレクトリ >\IDE\0902\eclipse\plugins\org.eclipse.aspectj_1.4.2.200705221209.jar < 開発環境インストールディレクトリ > BAS lib aspectjweaver.jar /opt/fjsvibs/lib/aspectjweaver.jar Eclipse Public License 対象のファイルについては 要請に応じてソースコードの提供を行います ソースコードを必要とする方は弊社営業までご連絡ください 以下に AspectJ のライセンス文を示します AspectJ TM Compiler and Core Tools License This is a binary-only release.~ Source code is available from http://eclipse.org/aspectj The Eclipse Foundation makes available all content in this distribution ("Content"). Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content. If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party ("Redistributor") and different terms and conditions may apply to your use of any object code in the Content. Check the Redistributor's license that was provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at http:// www.eclipse.org. Third Party Content The Content includes items that have been sourced from third parties as set out below. If you did not receive this Content directly from the Eclipse Foundation, the following is provided for informational purposes only, and you should look to the RedistributorÕs license for terms and conditions of use. BCEL v5.1 This product contains software developed by the Apache Software Foundation (http://www.apache.org). AspectJ includes a modified version of the Apache Jakarta Byte Code Engineering Library (BCEL) v5.1. BCEL is available at http:// jakarta.apache.org/bcel/. Source code for the modified version of BCEL is available at Eclipse.org in the AspectJ source tree. This code is made available under the Apache Software License v1.1 ASM v2.2.1 AspectJ includes a binary version of ASM v2.2.1 (http://asm.objectweb.org/) The source code for ASM is available from the ObjectWeb download site at http://asm.objectweb.org/download/. The ASM license is available at http://asm.objectweb.org/license.html. The license is also reproduced here: Copyright (c) 2000-2005 INRIA, France Telecom - 173 -
All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. B.3 Spring IDE のライセンス文 本製品に含まれる以下のモジュールは Eclipse Public Licenseの適用対象であるソフトウェア Spring IDE の派生物です < 開発環境インストールディレクトリ > IDE\0902\eclipse\features\org.springframework.ide.eclipse.ajdt.feature_2.0.6 < 開発環境インストールディレクトリ > IDE\0902\eclipse\features\org.springframework.ide.eclipse.aop.feature_2.0.6 < 開発環境インストールディレクトリ > IDE\0902\eclipse\features\org.springframework.ide.eclipse.autowire.feature_2.0.6 < 開発環境インストールディレクトリ > IDE\0902\eclipse\features\org.springframework.ide.eclipse.dependency.feature_2.0.6 < 開発環境インストールディレクトリ > IDE\0902\eclipse\features\org.springframework.ide.eclipse.feature_2.0.6 < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.ajdt.ui.visualiser_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.ajdt.ui.xref_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.aop.core_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.aop.ui_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.beans.core.autowire_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.beans.core_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.beans.ui.editor_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.beans.ui.graph_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.beans.ui.search_2.0.6.jar - 174 -
< 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.beans.ui_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.core_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse.ui_2.0.6.jar < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.springframework.ide.eclipse_2.0.6.jar Eclipse Public License 対象のファイルについては 要請に応じてソースコードの提供を行います ソースコードを必要とする方は弊社営業までご連絡ください 以下に Eclipse Public License のライセンス文を示します Eclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: - 175 -
a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL - 176 -
If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. B.4 ASM のライセンス文 本製品に含まれる以下のモジュールは ASMのライセンスの適用対象であるソフトウェアです < 開発環境インストールディレクトリ > IDE\0902\eclipse\plugins\org.objectweb.asm_2.2.3.jar 以下にASMのライセンス文を示します Copyright (c) 2000-2005 INRIA, France Telecom All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holders nor the names of its - 177 -
contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - 178 -