Red Hat Training
A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform
移行ガイド
Red Hat JBoss Enterprise Application Platform 6 向け
概要
第1章 はじめに
1.1. Red Hat JBoss Enterprise Application Platform 6
1.2. 移行ガイド
第2章 移行の準備
2.1. 移行の準備
JBoss EAP 6 の新機能と変更内容
本リリースには JBoss EAP 5 アプリケーションのデプロイメントに影響する可能性がある複数の変更が含まれています。これには、ファイルディレクトリー構造、スクリプト、デプロイメント設定、クラスローディング、および JNDI ルックアップの変更が含まれます。詳細は、 「JBoss EAP 6 の新機能と変更内容」 を参照してください。スタートガイドのドキュメント
必ずJBoss EAP 6 の『Development Guide』 の『Get Started Developing Applications』の章を確認してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。これには、以下に関する重要な情報が含まれています。- Java EE 6
- 新しいモジュラークラスローディングシステム
- ファイル構造の変更
- JBoss EAP 6 のダウンロードおよびインストール方法
- JBoss Developer Studio のダウンロードおよびインストール方法
- 開発環境用に Maven を設定する方法
- 製品に同梱されたクイックスタートサンプルアプリケーションのダウンロードおよび実行方法
Maven プロジェクトで JBoss EAP 6 の依存関係を使用する方法
必ずJBoss EAP 6 の『Development Guide』 の『Maven Guide』の章を確認してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。プロジェクト 『Manage Project Dependencies』 セクションには、JBoss EAP の BOM (Bill of Material)アーティファクトを使用するようにプロジェクトを設定する方法に関する重要な情報が記載されています。アプリケーションの分析と理解
アプリケーションはそれぞれ異なるため、移行を始める前に既存のアプリケーションのコンポーネントおよびアーキテクチャーを十分に理解する必要があります。
2.2. JBoss EAP 6 の新機能と変更内容
はじめに
以下は、以前のリリースから JBoss EAP 6 への主な変更点です。
- モジュールベースのクラスローディング
- JBoss EAP 5 では、クラスローディングアーキテクチャーは階層的でした。JBoss EAP 6 では、クラスローディングは JBoss Modules をベースにしています。これにより、完全にアプリケーションが分離され、サーバー実装クラスが隠され、アプリケーションが必要とするクラスのみが読み込まれます。クラスローディングにより、同時にパフォーマンスが向上します。JBoss EAP 5 用に作成されたアプリケーションでは、モジュールの依存関係を指定し、場合によってはアーカイブを再パッケージ化するように変更する必要があります。詳細については、JBoss EAP 6 『Development Guide』の 『Class Loading and Modules』を参照してください(https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
- ドメイン管理
- JBoss EAP 6 では、サーバーをスタンドアロンサーバーまたは管理対象ドメインで実行できます。管理対象ドメインでは、サーバーのグループ全体を一度に設定し、サーバーのネットワーク全体で設定を同期できます。これは以前のリリース用にビルドされたアプリケーションに影響を与えることはありませんが、これにより複数のサーバーへのデプロイメントの管理が簡素化されます。詳細については、JBoss EAP 6 の 『Administration and Configuration Guide』の『About Managed Domains』を参照してください(https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
- デプロイメント設定
- スタンドアロンサーバーおよび管理対象ドメイン
- JBoss EAP 5 はプロファイルベースのデプロイメント設定を使用していました。これらのプロファイルは
EAP_HOME/server/
ディレクトリーににありました。アプリケーションには、多くの場合、セキュリティー、データベース、リソースアダプター、およびその他の設定用に複数の設定ファイルが含まれていました。JBoss EAP 6 では、デプロイメント設定は 1 つのファイルを使用して行われます。このファイルは、デプロイメントに使用されるすべてのサービスおよびサブシステムを設定するために使用されます。スタンドアロンサーバーはEAP_HOME/standalone/configuration/standalone.xml
ファイルを使用して設定されます。管理対象ドメインで稼働しているサーバーの場合は、EAP_HOME/domain/configuration/domain.xml
ファイルを使用して設定されます。複数の JBoss EAP 5 設定ファイルに含まれる情報を新しい単一の設定ファイルに移行する必要があります。 - デプロイメントの順序
- JBoss EAP 6 は、デプロイメントに高速な同時初期化を使用するため、パフォーマンスと効率性が向上します。ほとんどの場合、アプリケーションサーバーは、依存関係を事前に自動的に判断し、最も効率的なデプロイメント方式を選択できます。しかし、EAR としてデプロイされた複数のモジュールで構成される JBoss EAP 5 アプリケーション、または CDI インジェクションやリソース参照エントリーの代わりにレガシー JNDI ルックアップを使用する JBoss EAP 5 アプリケーションには、設定の変更が必要になる場合があります。
- ディレクトリー構造およびスクリプト
- 前述のように、JBoss EAP 6 はプロファイルベースのデプロイメント設定を使用しないため、
EAP_HOME/server/
ディレクトリーはありません。スタンドアロンサーバーの設定ファイルはEAP_HOME/standalone/configuration/
ディレクトリーに配置され、デプロイメントはEAP_HOME/standalone/deployments/
ディレクトリーにあります。管理対象ドメインで稼働しているサーバーの場合は、設定ファイルはEAP_HOME/domain/configuration/
ディレクトリーにあります。JBoss EAP 5 では、Linux スクリプト EAP_HOME/bin/run.sh または Windows スクリプト EAP_HOME/bin/run.bat がサーバーの起動に使用されました。JBoss EAP 6 では、サーバー起動スクリプトはサーバーの実行方法によって異なります。Linux スクリプトEAP_HOME/bin/standalone.sh または Windows スクリプト EAP_HOME/bin/standalone.bat を使用してスタンドアロンサーバーを起動します。Linux スクリプト EAP_HOME/bin/domain.sh または Windows スクリプト EAP_HOME/bin/domain.bat は、管理対象ドメインの起動に使用されます。 - JNDI ルックアップ
- JBoss EAP 6 は、標準化された移植可能な JNDI 名前空間を使用するようになりました。JNDI ルックアップを使用する JBoss EAP 5 用に書かれたアプリケーションは、新しい標準化された JNDI 名前空間規則に従うように変更する必要があります。JNDI 命名構文の詳細は、「移植可能な EJB JNDI 名」 を参照してください。
- 仮想ファイルシステム
- JBoss EAP 6 では、VFS2 が VFS3 に置き換えられました。VFS2 を使用した JBoss EAP 5 で利用できた設定オプションの一部が JBoss EAP 6 では必要なくなりました。VFS2 で利用できたSystemプロパティー設定は、VFS3 では使用されず、利用できなくなりました。キャッシュシステムが VFS3 で置き換えられ、VFS2 に存在したキャッシュ問題を解決しました。VFS は JBoss EAP によって内部的に使用され、アプリケーションコード内で直接アクセスする必要はありません。
2.3. 非推奨および未サポート機能リストの確認
- サーバー起動の -b コマンドライン引数
- 以前のバージョンでは、JBoss EAP は IP アドレスに関係なく、
-b
起動パラメーターで指定されたアドレスを自動的に使用していました。JBoss EAP 6 では、サーバー<inet-address>
設定は、一致する IP アドレスで設定されたネットワークインターフェースを検索します。IPアドレス127.0.0.1
は機能しますが、127.*.*.*
は機能しなくなりました。127.*.*.*
IP アドレスにバインドする-b
コマンドライン引数を使用して JBoss EAP 6 サーバーを起動した場合は、まずサーバー設定ファイルでインターフェースを<inet-address>
から<loopback-address>
に変更する必要があります。管理 CLI を使用してサーバーを設定する方法は、カスタマーポータルの JBoss Enterprise Application Platform の 『Administration and Configuration Guide』 の 『Management CLI Operations』 を参照してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。 - EJB 依存関係
- これまでのバージョンの JBoss EAP では、他の EJB を含むサービスの EJB 依存関係は、
jboss.xml
デプロイメント記述子の<depends>
タグを使用して指定できました。以下に例を示します。<depends>jboss.j2ee:jndiName=com/myorg/app/Foo,service=EJB</depends> <depends>jboss.mq.destination:service=Queue,name=queue/HelloworldQueue</depends>
JBoss EAP 6 では、@EJB
アノテーションを使用して EJB 参照を注入し、@Resource
アノテーションを使用してデータソースやその他のリソースにアクセスする必要があります。以下に例を示します。@EJB(lookup="java:global/MyApp/FooImpl!com.myorg.app.Foo") @Resource(mappedName = "java:/queue/HelloworldQueue")
JNDI ルックアップも変更になりました。詳細は、本ガイドの 『JNDI の変更』 セクションを参照してください。EJB 参照の詳細は、カスタマーポータルの JBoss Enterprise Application Platform の 『Development Guide』 の 『EJB Reference Resolution』 セクションを参照してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。 - HTTPInvoker
- これまでのバージョンの JBoss EAP では、HTTPInvoker を使用して EJB、JNDI、または JMS を設定して HTTP プロトコルを使用することができました。これは JBoss EAP 6 では不可能になりました。
- HA Singleton デプロイメントおよび BarrierController サービス
- HA SingletonService は、クラスター内で実行されるサービスのインスタンスが 1 つだけであることを保証します。JBoss EAP 5 は、HASingletonDeployer サービス、HASingletonController を使用した POJO デプロイメント、BarrierController サービスを使用した HASingleton デプロイメントなど、HA Singleton デプロイメントの複数の方式をサポートしていました。これらの方式は、クラスター内の異なるノードが起動および停止した際の通知を提供するのにすべて HAPartition に依存していたので、利用できなくなりました。JBoss EAP 6 では、HA Singleton デプロイメントが完全に変更になりました。シングルトンデプロイヤーは Modular Service Container (MSC)サービスでのみ動作するようになりました。SingletonService を使用すると、ターゲットサービスはクラスター内のすべてのノードにインストールされますが、常に1つのノード上でのみ起動されます。この方法では、デプロイメント要件を単純化し、シングルトンマスターサービスをノード間で再配置するために必要な時間を最小限にします。ただし、同じ機能を実現するには、カスタムコードを作成する必要があります。HA Singleton デプロイメントの例は、製品に同梱される JBoss EAP クイックスタートサンプルアプリケーションに含まれています。HA Singleton に関する詳細は、「HA シングルトンの実装」 を参照してください。
- JAAS Security Manager サービス
- JBoss EAP 5 には JAAS Security Manager が同梱されており、データソースパスワード暗号化サービスを提供し、パスワードベースの暗号化(PBE)でアイデンティティーを設定していました。このサービスは JBoss EAP 6 には含まれていません。JBoss EAP 6 では、データソースパスワードの暗号化にパスワード vault を使用することを推奨しています。JAAS Security Manager サービスと JBoss EAP 5 を使用したパスワード暗号化アルゴリズムは、JBoss EAP 6 でパスワード vault を使用してパスワードを暗号化するときに使用されるアルゴリズムと互換性がありません。管理者は、以前のリリースでパスワードベースの暗号化を使用して暗号化されたパスワードを再生成する必要があります。以前のバージョンの JBoss EAP でクレデンシャルを動的にデプロイするのに DynamicLoginConfig サービスを使用した場合、JBoss EAP 6 ではクレデンシャルを動的にデプロイするための同様の方法はありません。広く知られた既知のマスク値以外の方法で vault パスワードをセキュアにする機能は、JBoss EAP 6.4 以降でのみ利用できます。
2.4. 移行およびアップグレード
メジャーアップグレード
JBoss EAP 5 から JBoss EAP 6 など、アプリケーションを他のメジャーリリースに移動する場合にメジャーアップグレードまたは移行が必要になります。これは、本ガイドで取り上げている移行のタイプです。アプリケーションが Java EE 仕様に準拠し、非推奨の API にアクセスせず、プロプライエタリーコードを含まない場合、変更なしにアプリケーションを JBoss EAP 6 で実行できる可能性があります。それ以外の場合は、アプリケーションコードの変更が必要になることがあります。JBoss EAP 6 でサーバー設定が変更になり、すべてのサーバー設定で移行が必要です。
マイナーアップデート
JBoss EAP では、定期的にポイントリリースが提供されます。JBoss EAP 6.3 から JBoss EAP 6.4 など、ある JBoss EAP ポイントリリースから別のポイントリリースに移行する予定の場合は、カスタマーポータルのJBoss EAP 6の『Installation Guide』 の『Patching JBoss EAP 6』の章を参照してください(https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
累積パッチ
JBoss EAP では、バグおよびセキュリティーの修正が含まれる累積パッチも定期的に提供されます。累積パッチのリリースごとに、リリース番号の最後の数字が 1 ずつ増えます (例: 6.4.1 から 6.4.2)。パッチインストールの詳細は、カスタマーポータルの JBoss EAP 6 の『Installation Guide』 の『Patching JBoss EAP 6』を参照してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
第3章 アプリケーションの移行
3.1. ほとんどのアプリケーションで必要な変更
3.1.1. ほとんどのアプリケーションで必要な変更の確認
3.1.2. クラスローディングの変更
3.1.2.1. クラスローディングの変更によるアプリケーションの更新
- まず、アプリケーションとその依存関係のパッケージ化を確認します。詳細は、 「クラスローディングの変更によるアプリケーション依存関係の更新」を参照してください。
- アプリケーションがロギングする場合は、正しいモジュール依存関係を指定する必要があります。詳細は、 「ロギング依存関係の変更」を参照してください。
- モジュラークラスローディングの変更により、EAR または WAR のパッケージ構造を変更しなければならない場合があります。詳細は、 「EAR と WAR のパッケージ化の変更」を参照してください。
3.1.2.2. モジュール依存関係について
概要
モジュールは、独自のクラスと、明示的または暗黙的な依存関係がある任意のモジュールのクラスにのみアクセスできます。
暗黙的な依存関係
サーバー内のデプロイヤーは、javax.api
や sun.jdk
などの一般的に使用されているモジュールの依存関係を暗黙的に自動的に追加します。これにより、クラスが実行時にデプロイメントからアクセス可能になり、依存関係を明示的に追加するタスクから開発者を解放します。これらの暗黙的な依存関係が追加される方法とタイミングに関する詳細は、JBoss EAP 6 の 『Development Guide』 の『Class Loading and Modules』の章の『Implicit Module Dependencies』を参照してください(https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
明示的な依存関係
他のクラスでは、モジュールを明示的に指定しないと、依存関係がないため、デプロイメントまたはランタイムエラーが発生します。依存関係がない場合、サーバーログに ClassNotFoundExceptions
または NoClassDefFoundErrors
トレースが記録されます。複数のモジュールが同じ JAR を読み込むか、またはモジュールが別のモジュールによって読み込まれたクラスを拡張するクラスを読み込む場合、サーバーログに ClassCastExceptions
トレースが記録されます。依存関係を明示的に指定するには、MANIFEST.MF
を変更するか、JBoss 固有のデプロイメント記述子ファイル jboss-deployment-structure.xml
を作成します。モジュールの依存関係の詳細は、JBoss EAP 6 の『Development Guide』 の『Class Loading and Module』 の章の『Overview of Class Loading and Modules』を参照してください(https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
3.1.2.3. クラスローディングの変更によるアプリケーション依存関係の更新
概要
JBoss EAP 6 でのクラスローディングは、これまでのバージョンの JBoss EAP とは大きく異なります。クラスローディングは JBoss Modules プロジェクトをベースにするようになりました。すべての JAR をフラットクラスパスに読み込む単一の階層構造クラスローダーではなく、各ライブラリーは、依存するモジュールにのみリンクするモジュールになります。JBoss EAP 6 のデプロイメントもモジュールであり、これらのクラスへの明示的な依存関係が定義されない限り、アプリケーションサーバーの JAR で定義されたクラスにアクセスできません。アプリケーションサーバーによって定義されるモジュール依存関係の一部が自動的に設定されます。たとえば、Java EE アプリケーションをデプロイする場合は、Java EE API の依存関係が自動的または暗黙的に追加されます。サーバーによって自動的に追加される依存関係の完全なリストについては、JBoss EAP 6 の 『Development Guide』 の『Class Loading and Modules』の章の『Implicit Module Dependencies』を参照してください(https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
タスク
アプリケーションを JBoss EAP 6 に移行する場合は、モジュラークラスローディングの変更により、以下のタスクの 1 つまたは複数を実行しなければならない場合があります。
3.1.3. 設定ファイルの変更
3.1.3.1. JBoss EAP 6 でクラスローディングを制御するファイルの作成または変更
概要
モジュラークラスローディングを使用する JBoss EAP 6 の変更に伴い、1 つまたは複数のファイルを作成または編集して依存関係を追加したり、自動的な依存関係がロードされないようにする必要がある場合があります。クラスローディングとクラスローディングの優先順位に関する詳細は、JBoss EAP 6 の 『Development Guide』 の『Class Loading and Modules』の章を参照してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
- jboss-web.xml
jboss-web.xml
ファイルに<class-loading>
要素を定義した場合は、これを削除する必要があります。JBoss EAP 5 でこれが呼び出した動作が、JBoss EAP 6 ではデフォルトのクラスローディング動作であるため、これは不要になりました。この要素を削除しないと、サーバーログに ParseError および XMLStreamException が記録されます。これは、コメントアウトされるjboss-web.xml
ファイルの<class-loading>
要素の例です。<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 4.2//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd"> <jboss-web> <!-- <class-loading java2ClassLoadingCompliance="false"> <loader-repository> seam.jboss.org:loader=MyApplication <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> </class-loading> --> </jboss-web>
- MANIFEST.MF
- 手動での編集
- アプリケーションが使用するコンポーネントまたはモジュールによっては、このファイルに依存関係を 1 つまたは複数追加する必要がある場合があります。
Dependencies
またはClass-Path
エントリーとして追加できます。以下は、開発者により編集されるMANIFEST.MF
の例です。Manifest-Version: 1.0 Dependencies: org.jboss.logmanager Class-Path: OrderManagerEJB.jar
このファイルを変更する場合は、ファイルの最後に改行文字を含めるようにしてください。 - Maven を使用した生成
- Maven を使用する場合は、
pom.xml
ファイルを変更してMANIFEST.MF
ファイルの依存関係を生成する必要があります。アプリケーションが EJB 3.0 を使用する場合は、pom.xml
ファイルに以下のようなセクションがある可能性があります。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <configuration> <ejbVersion>3.0</ejbVersion> </configuration> </plugin>
EJB 3.0 コードがorg.apache.commons.log
を使用する場合は、MANIFEST.MF
ファイルにその依存関係が必要になります。その依存関係を生成するには、以下のように<plugin>
要素をpom.xml
ファイルに追加します。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <configuration> <ejbVersion>3.0</ejbVersion> <archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin>
上記の例では、src/main/resources/META-INF/MANIFEST.MF
ファイルには依存関係エントリーのみを含める必要があります。Dependencies: org.apache.commons.logging
Maven は完全なMANIFEST.MF
ファイルを生成します。Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
- jboss-deployment-structure.xml
- このファイルは、詳細な方法でクラスローディングを制御するために使用できる JBoss 固有のデプロイメント記述子です。
MANIFEST.MF
と同様に、このファイルを使用して依存関係を追加できます。また、自動依存関係が追加されなくなり、追加のモジュールを定義し、EAR デプロイメントの分離されたクラスローディング動作を変更し、さらにリソースルートをモジュールに追加することもできます。以下は、JSF 1.2 モジュールの依存関係を追加し、JSF 2.0 モジュールの自動読み込みを阻止するjboss-deployment-structure.xml
ファイルの例になります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
このファイルの詳細は、 「jboss-deployment-structure.xml」 を参照してください。 - application.xml
- これまでのバージョンの JBoss EAP では、
jboss-app.xml
ファイルを使用して EAR 内のデプロイメントの順序を制御していました。これは当てはまらなくなりました。Java EE6 仕様は、application.xml
の<initialize-in-order>
要素を提供し、EAR 内の Java EE モジュールがデプロイされる順序を制御することができます。多くの場合、デプロイメント順序を指定する必要はありません。アプリケーションが依存関係注入とリソース参照を使用して外部モジュールのコンポーネントを参照する場合、アプリケーションサーバーは正しく最適なコンポーネントの順序決定方法を暗黙的に決定できるため、多くの場合<initialize-in-order>
要素は必要ありません。myApp.ear
内にパッケージ化されたmyBeans.jar
とmyApp.war
が含まれるアプリケーションがあるとします。myApp.war
のサーブレットは@EJB
アノテーションを使用して、myBeans.jar
から Bean を注入します。この場合、アプリケーションサーバーは、サーブレットが起動される前に EJB コンポーネントが利用可能であることを把握し、<initialize-in-order>
要素を使用する必要はありません。ただし、そのサーブレットが以下のようなレガシー JNDI ルックアップスタイルのリモート参照を使用して Bean にアクセスする場合は、モジュールの順序を指定する必要がある場合があります。init() { Context ctx = new InitialContext(); ctx.lookup("TheBeanInMyBeansModule"); }
この場合、サーバーは EJB コンポーネントがmyBeans.jar
にあることを判断できず、myBeans.jar
のコンポーネントがmyApp.war
のコンポーネントよりも先に初期化および起動されるように強制する必要があります。これには、<initialize-in-order>
要素をtrue
に設定し、application.xml
ファイルでmyBeans.jar
モジュールおよびmyApp.war
モジュールの順序を指定します。以下は、<initialize-in-order>
要素を使用してデプロイメントの順序を制御する例です。myBeans.jar
はmyApp.war
ファイルよりも先にデプロイされます。<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd"> <application-name>myApp</application-name> <initialize-in-order>true</initialize-in-order> <module> <ejb>myBeans.jar</ejb> </module> <module> <web> <web-uri>myApp.war</web-uri> <context-root>myApp</context-root> </web> </module> </application>
application.xml
ファイルのスキーマについては、http://java.sun.com/xml/ns/javaee/application_6.xsdを参照してください。注記<initialize-in-order>
要素をtrue
に設定すると、デプロイメントが遅くなることに注意してください。デプロイメントの最適化に関してコンテナーの柔軟性を高めることができるため、依存関係の注入やリソース参照を使用して適切な依存関係を定義することが推奨されます。 - jboss-ejb3.xml
jboss-ejb3.xml
デプロイメント記述子はjboss.xml
デプロイメント記述子に置き換わり、Java Enterprise Edition (EE)で定義されたejb-jar.xml
デプロイメント記述子によって提供された機能をオーバーライドおよび追加します。新しいファイルはjboss.xml
と互換性がなく、デプロイメントでjboss.xml
は無視されるようになりました。- login-config.xml
login-config.xml
ファイルはセキュリティー設定に使用されなくなりました。セキュリティーはサーバー設定ファイルの<security-domain>
要素に設定されるようになりました。スタンドアロンサーバーの場合、これはstandalone/configuration/standalone.xml
ファイルになります。管理対象ドメインでサーバーを実行している場合は、domain/configuration/domain.xml
ファイルになります。
3.1.3.2. jboss-deployment-structure.xml
jboss-deployment-structure.xml
は JBoss EAP 6 の新しい任意のデプロイメント記述子です。このデプロイメント記述子を使用すると、デプロイメントでクラスローディングを制御できます。
EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd
にあります。
3.1.3.3. 新しいモジュラークラスローティングシステムのパッケージリソース
概要
以前のバージョンの JBoss EAP では、WEB-INF/
ディレクトリー内のすべてのリソースが WAR クラスパスに追加されました。JBoss EAP 6 では、Web アプリケーションのアーティファクトのみが WEB-INF/classes
および WEB-INF/lib
ディレクトリーから読み込まれます。指定された場所にアプリケーションのアーティファクトをパッケージ化できないと、ClassNotFoundException
、NoClassDefError
、またはその他のランタイムエラーが発生する可能性があります。
- リソースのパッケージの変更
- アプリケーションだけがリソースを利用できるようにするには、プロパティーファイル、JAR、または他のアーティファクトを
WEB-INF/classes/
またはWEB-INF/lib/
ディレクトリーに移動し、それらをWAR でバンドル化する必要があります。このアプローチの詳細は、 「ResourceBundle プロパティーの場所の変更」 を参照してください。 - カスタムモジュールの作成
- JBoss EAP 6 サーバーで実行しているすべてのアプリケーションでカスタムリソースを使用できるようにするには、カスタムモジュールを作成する必要があります。このアプローチの詳細は、 「カスタムモジュールの作成」 を参照してください。
3.1.3.4. ResourceBundle プロパティーの場所の変更
概要
これまでのバージョンの JBoss EAP では、EAP_HOME/server/SERVER_NAME/conf/
ディレクトリーがクラスパスにあり、アプリケーションで利用できていました。JBoss EAP 6 のアプリケーションのクラスパスでプロパティーを使用できるようにするには、アプリケーション内にプロパティーをパッケージ化する必要があります。
手順3.1 ResourceBundle プロパティーの場所の変更
- WAR アーカイブをデプロイする場合は、これらのプロパティーを WAR の
WEB-INF/classes/
フォルダーにパッケージ化する必要があります。 - これらのプロパティーを EAR のすべてのコンポーネントで利用できるようにしたい場合は、JAR のルートにパッケージ化してから JAR を EAR の
lib/
フォルダーに配置する必要があります。
3.1.3.5. カスタムモジュールの作成
手順3.2 カスタムモジュールの作成
module/
ディレクトリー構造を作成し、反映させます。EAP_HOME/module
ディレクトリーにディレクトリー構造を作成し、ファイルと JAR が含まれるようにします。以下に例を示します。$ cd EAP_HOME/modules/ $ mkdir -p myorg-conf/main/properties
- プロパティーファイルを、前のステップで作成した
EAP_HOME/modules/myorg-conf/main/properties/
ディレクトリーに移動します。 EAP_HOME/modules/myorg-conf/main/
ディレクトリーに、以下の XML が含まれるmodule.xml
ファイルを作成します。<module xmlns="urn:jboss:module:1.1" name="myorg-conf"> <resources> <resource-root path="properties"/> </resources> </module>
- サーバー設定ファイルの
ee
サブシステムを変更します。管理 CLI を使用するか、ファイルを手動で編集できます。- 管理 CLI を使用してサーバー設定ファイルを変更するには、以下の手順に従います。
- サーバーを起動し、管理 CLI へ接続します。
- Linux の場合は、コマンドラインで以下を入力します。
EAP_HOME/bin/jboss-cli.sh --connect
- Windows の場合は、コマンドラインで以下を入力します。
C:\>EAP_HOME\bin\jboss-cli.bat --connect
次の応答が表示されるはずです。Connected to standalone controller at localhost:9999
ee
サブシステムでmyorg-conf
<global-modules> 要素を作成するには、コマンドラインで以下を入力します。/subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
以下の結果が表示されるはずです。{"outcome" => "success"}
- サーバー設定ファイルを手作業で編集する場合は、次の手順に従ってください。
- サーバーを停止し、サーバー設定ファイルをテキストエディターで開きます。スタンドアロンサーバーを実行している場合は、これは
EAP_HOME/standalone/configuration/standalone.xml
ファイルで、管理対象ドメインを実行している場合はEAP_HOME/domain/configuration/domain.xml
ファイルになります。 ee
サブシステムを見つけ、myorg-conf
のグローバルモジュールを追加します。以下は、myorg-conf
要素が含まれるように変更されたee
サブシステム要素の例になります。例3.1
myorg-conf
要素<subsystem xmlns="urn:jboss:domain:ee:1.0" > <global-modules> <module name="myorg-conf" slot="main" /> </global-modules> </subsystem>
my.properties
という名前のファイルを正しいモジュールの場所にコピーした場合は、以下のようなコードを使用してプロパティーファイルをロードできるようになります。例3.2 プロパティーファイルの読み込み
Thread.currentThread().getContextClassLoader().getResource("my.properties");
3.1.4. ロギングの変更
3.1.4.1. ロギング依存関係の変更
概要
JBoss LogManager はすべてのロギングフレームワークのフロントエンドをサポートするため、現在のロギングコードを維持したり、新しい JBoss ロギングインフラストラクチャーに移行したりできます。意思決定に関係なく、モジュラークラスローディングの変更により、アプリケーションを変更して必要な依存関係を追加する必要があります。
手順3.3 アプリケーションのロギングコードの更新
3.1.4.2. サードパーティーロギングフレームワーク用のアプリケーションコードの更新
概要
JBoss EAP 6 では、Apache Commons Logging、Apache log4j、SLF4J、Java Logging などの一般的なサードパーティーフレームワークのロギング依存関係がデフォルトで追加されます。ほとんどの場合、JBoss EAP コンテナーによって提供されるロギングフレームワークを使用することが推奨されます。ただし、サードパーティーフレームワークが提供する特定の機能が必要な場合は、デプロイメントから対応する JBoss EAP モジュールを除外する必要があります。デプロイメントでサードパーティーのロギングフレームワークが使用されますが、サーバーログは JBoss EAP ロギングサブシステム設定を引き続き使用します。
org.apache.log4j
モジュールを除外する方法を示しています。最初の手順は、JBoss EAP 6 の任意のリリースで機能します。2 つ目の手順は、JBoss EAP 6.3 以降にのみ適用されます。
手順3.4 log4j.properties または log4j.xml ファイルを使用する JBoss EAP 6 を設定
- 以下の内容で
jboss-deployment-structure.xml
を作成します。<jboss-deployment-structure> <deployment> <!-- Exclusions allow you to prevent the server from automatically adding some dependencies --> <exclusions> <module name="org.apache.log4j" /> </exclusions> </deployment> </jboss-deployment-structure>
- WAR をデプロイする場合は
META-INF/
ディレクトリーまたはWEB-INF/
ディレクトリーに、EAR をデプロイする場合はMETA-INF/
ディレクトリーに、それぞれjboss-deployment-structure.xml
ファイルを配置します。デプロイメントに依存する子デプロイメントが含まれる場合は、それぞれのサブデプロイメントについてもモジュールを除外する必要があります。 - EAR の
lib/
ディレクトリーまたは WAR デプロイメントのWEB-INF/classes/
ディレクトリーに、それぞれlog4j.properties
またはlog4j.xml
ファイルを追加します。WAR のlib/
ディレクトリーにファイルを配置する場合は、jboss-deployment-structure.xml
ファイルに<resource-root>
パスを指定する必要があります。<jboss-deployment-structure> <deployment> <!-- Exclusions allow you to prevent the server from automatically adding some dependencies --> <exclusions> <module name="org.apache.log4j" /> </exclusions> <resources> <resource-root path="lib" /> </resources> </deployment> </jboss-deployment-structure>
- 以下のランタイム引数を使用して JBoss EAP 6 サーバーを起動します。これにより、アプリケーションのデプロイメント時に
ClassCastException
がコンソールに表示されなくなります。-Dorg.jboss.as.logging.per-deployment=false
- アプリケーションをデプロイします。
手順3.5 JBoss EAP 6.3 以降のロギング依存関係の設定
add-logging-api-dependencies
ロギングシステムプロパティーを使用して、サードパーティーのロギングフレームワークの依存関係を除外できます。以下の手順は、JBoss EAP スタンドアロンサーバーでこのロギング属性を変更する方法を示しています。
- 以下のランタイム引数を使用して JBoss EAP 6 サーバーを起動します。これにより、アプリケーションのデプロイメント時に
ClassCastException
がコンソールに表示されなくなります。-Dorg.jboss.as.logging.per-deployment=false
- ターミナルを開き、管理 CLI に接続します。
- Linux の場合は、コマンドラインで以下を入力します。
$ EAP_HOME/bin/jboss-cli.sh --connect
- Windows の場合は、コマンドラインで以下を入力します。
C:\>EAP_HOME\bin\jboss-cli.bat --connect
- logging サブシステムの
add-logging-api-dependencies
属性を変更します。この属性は、コンテナーが暗黙的なロギング API 依存関係をデプロイメントに追加するかどうかを制御します。- デフォルトの
true
に設定すると、暗黙的なロギング API 依存関係がすべて追加されます。 false
に設定すると、依存関係はデプロイメントに追加されません。
サードパーティーのロギングフレームワークの依存関係を除外するには、以下のコマンドを使用してこの属性をfalse
に設定する必要があります。/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
このコマンドは、<add-logging-api-dependencies>
要素をstandalone.xml
設定ファイルのlogging
サブシステムに追加します。<subsystem xmlns="urn:jboss:domain:logging:1.4"> <add-logging-api-dependencies value="false"/> .... </subsystem>
- アプリケーションをデプロイします。
3.1.4.3. 新しい JBoss ロギングフレームワークを使用するためのコード変更
概要
新しいフレームワークを使用するには、以下の手順のようにインポートとコードを変更します。
手順3.6 JBoss ロギングフレームワークを使用するためのコードと依存関係の変更
- インポートとロギングコードを変更します。新しい JBoss ロギングフレームワークを使用するコードの例を以下に示します。
import org.jboss.logging.Level; import org.jboss.logging.Logger; private static final Logger logger = Logger.getLogger(MyClass.class.toString()); if(logger.isTraceEnabled()) { logger.tracef("Starting...", subsystem); }
- ロギング依存関係を追加します。JBoss Logging クラスが含まれる JAR は、
org.jboss.logging
という名前のモジュールにあります。MANIFEST-MF
ファイルは以下のようになるはずです。Manifest-Version: 1.0 Dependencies: org.jboss.logging
モジュール依存関係を探す方法は、「クラスローディングの変更によるアプリケーション依存関係の更新」 および 「移行の問題のデバッグおよび解決」 を参照してください。
3.1.5. アプリケーションのパッケージ化の変更
3.1.5.1. EAR と WAR のパッケージ化の変更
概要
アプリケーションを移行する場合、モジュラークラスローディングへの変更が原因で EAR または WAR のパッケージ構造を変更しなければならない場合があります。モジュール依存関係は、以下の特定の順序で読み込まれます。
- システムの依存関係
- ユーザーの依存関係
- ローカルリソース
- デプロイメント間の依存関係
手順3.7 アーカイブパッケージの変更
- WAR をパッケージ化します。WAR は 1 つのモジュールで、WAR のすべてのクラスは、同じクラスローダーで読み込まれます。つまり、
WEB-INF/lib
ディレクトリーにパッケージ化されたクラスはWEB-INF/classes
ディレクトリーにあるクラスと同じように処理されます。 - EAR をパッケージ化します。EAR は複数のモジュールで構成されます。
EAR/lib/
ディレクトリーは単一のモジュールで、EAR 内のすべての WAR または EJB jar サブデプロイメントは個別のモジュールです。明示的な依存関係が定義されない限り、クラスは EAR 内の他のモジュールのクラスにアクセスできません。サブデプロイメントは、EAR/lib/
ディレクトリーのクラスへのアクセスを提供する親モジュールの自動的な依存関係を常に持ちます。ただし、サブデプロイメントには相互のアクセスを許可する自動依存関係が常にあるわけではありません。この動作は、以下のようにee
サブシステム設定の<ear-subdeployments-isolated>
要素を設定することで制御されます。<subsystem xmlns="urn:jboss:domain:ee:1.0" > <ear-subdeployments-isolated>false</ear-subdeployments-isolated> </subsystem>
デフォルトでは false に設定され、サブデプロイメントは EAR 内の他のサブデプロイメントに属するクラスを参照できます。クラスローディングに関する詳細は、JBoss EAP 6 の 『Development Guide』 の『Class Loading and Modules』の章を参照してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
3.1.5.2. ルートコンテキストの優先順位の変更
jboss-web.xml
WAR ファイルで定義された <context-root>
要素が application.xml
EAR ファイルで定義された <context-root>
要素よりも優先されます。
application.xml
EAR ファイルで定義された <context-root>
要素は、jboss-web.xml
WAR ファイルで定義された <context-root>
要素よりも優先されます。WAR ファイルが EAR アーカイブ内にデプロイされている場合、application.xml
ファイルに <context-root>
要素を定義します。
3.1.6. データソースおよびリソースアダプター設定の変更
3.1.6.1. 設定変更によるアプリケーションの更新
- アプリケーションがデータソースを使用する場合は、 「DataSource設定の更新」 を参照してください。
- アプリケーションが JPA を使用し、現在 Hibernate JAR をバンドルしている場合は、移行オプションについて 「Hibernate または JPA のデータソースの設定」 を参照してください。
- アプリケーションがリソースアダプターを使用する場合は、 「リソースアダプター設定の更新」 を参照してください。
- 基本的なセキュリティーの変更の設定方法に関する情報は、 「アプリケーションセキュリティーの変更の設定」 を参照してください。
3.1.6.2. DataSource設定の更新
概要
これまでのバージョンの JBoss EAP では、JCA DataSource 設定は *-ds.xml
のサフィックスのファイルで定義されていました。その後、このファイルはサーバーの deploy/
ディレクトリーにデプロイされるか、アプリケーションとともにパッケージ化されます。JDBC ドライバーは server/lib/
ディレクトリーにコピーされるか、アプリケーションの WEB-INF/lib/
ディレクトリーにパッケージ化されます。DataSource のこの設定方法は開発用に引き続きサポートされますが、JBoss の管理ツールではサポートされないため、本番環境では推奨されません。
domain/configuration/domain.xml
ファイルで設定されます。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、DataSource は standalone/configuration/standalone.xml
ファイルで設定されます。このように設定されたDataSourceは、Web 管理コンソールやコマンドラインインターフェース(CLI)などの JBoss 管理インターフェイスを使用して管理および制御できます。これらのツールにより、デプロイメントの管理や、管理対象ドメインで実行されている複数のサーバーの設定が容易になります。
JBoss EAP 6 の管理可能な DataSource 設定への移行
JDBC 4.0 準拠のドライバーは、デプロイメントまたはコアモジュールとしてインストールできます。JDBC 4.0 に準拠するドライバーには、ドライバークラス名を指定する META-INF/services/java.sql.Driver
ファイルが含まれます。JDBC 4.0 に準拠していないドライバーには、追加の手順が必要です。ドライバーを JDBC 4.0 準拠にする方法や、現在の DataSource 設定を Web 管理コンソールおよび CLI で管理できる設定に更新する方法は、 「JDBC ドライバーのインストールおよび設定」 を参照してください。
IronJacamar 移行ツールを使用した設定データの変換
IronJacamar ツールを使用して DataSource および ResourceAdapter 設定を移行できます。このツールは、*-ds.xml
スタイルの設定ファイルを JBoss EAP 6 で想定される形式に変換します。詳細は、 「IronJacamar Tool を使用したデータソースおよびリソースアダプター設定の移行」 を参照してください。
リモートDataSourceルックアップを実行するコードの移行
以前のバージョンの JBoss EAP では、DataSource オブジェクトの JNDI リモートルックアップを実行できますが、以下の理由により推奨されません。
- サーバーリソースのクライアント制御は信頼性がなく、クライアントがクラッシュしたり、サーバーへの接続を失うと接続が漏洩する可能性があります。
- すべてのデータベース操作が
MBean
を介してプロキシーされるため、パフォーマンスは非常に遅くなります。 - トランザクションの伝播はサポートされていません。
NotSerializableException
が表示されることがあります。推奨される方法は、EJB を作成してDataSource にアクセスし、EJB をリモートで呼び出すことです。詳細は、本ガイドの「『リモート呼び出しの変更』」を参照してください。詳細は、JBoss EAP 6の 『Development Guide』 を参照してください (https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4)。
3.1.6.3. JDBC ドライバーのインストールおよび設定
概要
JDBC ドライバーは、以下の 2 つの方法のいずれかでコンテナーにインストールできます。
- デプロイメントとして
- コアモジュールとして
domain/configuration/domain.xml
ファイルで設定されます。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、データソースは standalone/configuration/standalone.xml
ファイルで設定されます。両方のモードで同じであるスキーマ参照情報は、JBoss EAP 6 のインストールの docs/schema/
ディレクトリーにあります。ここでは、サーバーがスタンドアロンサーバーとして実行され、データソースが standalone.xml
ファイルで設定されることを前提とします。
手順3.8 JDBC ドライバーのインストールおよび設定
- JDBC ドライバーをインストールします。
- JDBC ドライバーをデプロイメントとしてインストールします。これが、ドライバーをインストールするのに推奨される方法です。JDBC ドライバーがデプロイメントとしてインストールされると、通常の JAR としてデプロイされます。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、JDBC 4.0 準拠の JAR を
EAP_HOME/standalone/deployments/
ディレクトリーにコピーします。管理対象ドメインでは、管理コンソールまたは管理 CLI を使用して JAR をサーバーグループにデプロイする必要があります。以下は、デプロイメントとしてスタンドアロンサーバーにインストールされた MySQL JDBC ドライバーの例です。$cp mysql-connector-java-5.1.15.jar
EAP_HOME/standalone/deployments/
JDBC 4.0 準拠のドライバーは自動的に認識され、名前とバージョンでシステムにインストールされます。JDBC 4.0 準拠の JAR には、ドライバークラス名を指定するMETA-INF/services/java.sql.Driver
という名前のテキストファイルが含まれます。ドライバーが JDBC 4.0 に準拠していない場合には、以下のいずれかの方法でデプロイ可能にすることができます。java.sql.Driver
ファイルを作成し、META-INF/services/
パスの下にある JAR に追加します。このファイルにはドライバークラス名が含まれている必要があります。以下に例を示します。com.mysql.jdbc.Driver
- デプロイメントディレクトリーに
java.sql.Driver
ファイルを作成します。スタンドアロンサーバーとして実行されている JBoss EAP 6 インスタンスの場合は、ファイルをEAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver
に配置する必要があります。サーバーが管理対象ドメインにある場合は、管理コンソールまたは管理 CLI を使用してファイルをデプロイする必要があります。
このアプローチの利点は以下のとおりです。このアプローチの短所は以下のとおりです。- モジュールを定義する必要がないため、これが最も簡単な方法です。
- 管理対象ドメインでサーバーを実行している場合は、このアプローチを使用するデプロイメントは、ドメイン内のすべてのサーバーに自動的に伝播されます。これは、管理者がドライバー JAR を手動で配布する必要がないことを意味します。
- JDBC ドライバーが複数の JAR(ドライバー JAR および依存ライセンス JAR、またはローカリゼーション JAR など)で構成される場合、ドライバーをデプロイメントとしてインストールすることはできません。JDBC ドライバーをコアモジュールとしてインストールする必要があります。
- ドライバーが JDBC 4.0 に準拠していない場合、ドライバークラス名が含まれるファイルを作成し、JARにインポートするか、
deployments/
ディレクトリーにオーバーレイする必要があります。
- JDBC ドライバーをコアモジュールとしてインストールします。JDBC ドライバーをコアモジュールとしてインストールするには、
EAP_HOME/modules/
ディレクトリーにファイルパス構造を作成する必要があります。この構造には、JDBC ドライバー JAR、追加のベンダーライセンスまたはローカリゼーション JAR、およびモジュールを定義するmodule.xml
ファイルが含まれます。- コアモジュールとしてのMySQL JDBC ドライバーのインストール
- ディレクトリー構造
EAP_HOME/modules/com/mysql/main/
を作成します。 main/
サブディレクトリーで、MySQL JDBC ドライバーの以下のモジュール定義が含まれるmodule.xml
ファイルを作成します。<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-5.1.15.jar"/> </resources> <dependencies> <module name="javax.api"/> </dependencies> </module>
モジュール名 "com.mysql" は、このモジュールのディレクトリー構造と一致します。<dependencies>
要素は、このモジュールの依存関係を他のモジュールに指定するために使用されます。この場合、すべての JDBC データソースの場合と同様に、javax.api
という名前の別のモジュールで定義される Java JDBC API に依存します。このモジュールはmodules/system/layers/base/javax/api/main/
ディレクトリーにあります。注記module.xml
ファイルの先頭にスペースがないことを確認します。そうでないと、このドライバーの「New missing/unsatisfied dependencies」エラーが表示されます。- MySQL JDBC ドライバー JAR を
EAP_HOME/modules/com/mysql/main/
ディレクトリーにコピーします。$ cp mysql-connector-java-5.1.15.jar
EAP_HOME/modules/com/mysql/main/
- IBM DB2 JDBC ドライバーおよびライセンス JAR をコアモジュールとしてインストールします。この例は、JDBC ドライバー JAR に加えて JAR を必要とするドライバーをデプロイする方法を説明するためにのみ提供されています。
- ディレクトリー構造
EAP_HOME/modules/com/ibm/db2/main/
を作成します。 main/
サブディレクトリーで、IBM DB2 JDBC ドライバーおよびライセンスの以下のモジュール定義が含まれるmodule.xml
ファイルを作成します。<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="com.ibm.db2"> <resources> <resource-root path="db2jcc.jar"/> <resource-root path="db2jcc_license_cisuz.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
注記module.xml
ファイルの先頭にスペースがないことを確認します。そうでないと、このドライバーの「New missing/unsatisfied dependencies」エラーが表示されます。- JDBC ドライバーおよびライセンス JAR を
EAP_HOME/modules/com/ibm/db2/main/
ディレクトリーにコピーします。$ cp db2jcc.jar
EAP_HOME/modules/com/ibm/db2/main/
$ cp db2jcc_license_cisuz.jarEAP_HOME/modules/com/ibm/db2/main/
このアプローチの利点は以下のとおりです。このアプローチの短所は以下のとおりです。- これは、JDBC ドライバーが複数の JAR で構成される場合に機能する唯一の方法です。
- この方法では、JDBC 4.0 に準拠していないドライバーを、ドライバー JAR を変更したり、ファイルオーバーレイを作成したりせずにインストールできます。
- モジュールの設定がより困難です。
- モジュールは、管理対象ドメインで実行されているすべてのサーバーに手動でコピーする必要があります。
- データソースを設定します。
- データベースドライバーを追加します。同じファイルの
<drivers>
要素に<driver>
要素を追加します。ここでも、これには*-ds.xml
ファイルで以前に定義された同じデータソース情報が含まれます。まず、ドライバー JAR が JDBC 4.0 に準拠しているかどうかを判断します。JDBC 4.0 に準拠するJARには、ドライバークラス名を指定するMETA-INF/services/java.sql.Driver
ファイルが含まれます。サーバーはこのファイルを使用して JAR のドライバークラスの名前を探します。JDBC 4.0 に準拠するドライバーは、JAR ですでに指定されているため、<driver-class>
要素は必要ありません。以下は、JDBC 4.0 準拠の MySQL ドライバーのドライバー要素の例です。<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
JDBC 4.0 に準拠していないドライバーでは、ドライバークラス名を指定するMETA-INF/services/java.sql.Driver
ファイルがないため、ドライバークラスを識別する<driver-class>
属性が必要です。以下は、JDBC 4.0 に準拠していないドライバーのドライバー要素の例です。<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"> <driver-class>com.mysql.jdbc.Driver</driver-class></driver>
- データソースを作成します。
standalone.xml
ファイルの<datasources>
セクションに<datasource>
要素を作成します。このファイルには、*-ds.xml
ファイルで以前に定義された同じデータソース情報の多くが含まれます。重要サーバーの再起動後に変更が維持されるようにするには、サーバーを停止してからサーバー設定ファイルを編集する必要があります。以下は、standalone.xml
ファイルの MySQL データソース要素の例になります。<datasource jndi-name="java:/YourDatasourceName" pool-name="YourDatasourceName"> <connection-url>jdbc:mysql://localhost:3306/YourApplicationURL</connection-url> <driver>mysql-connector-java-5.1.15.jar</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>100</min-pool-size> <max-pool-size>200</max-pool-size> </pool> <security> <user-name>USERID</user-name> <password>PASSWORD</password> </security> <statement> <prepared-statement-cache-size>100</prepared-statement-cache-size> <share-prepared-statements/> </statement> </datasource>
- アプリケーションコードの JNDI 参照を更新します。定義した新しい JNDI 標準データソース名を使用するには、アプリケーションのソースコードの古い JNDI ルックアップ名を置き換える必要があります。詳細は、 「新しい JNDI 名前空間ルールに従うようにアプリケーションを変更」 を参照してください。新しい JNDI 名を使用するには、データソースにアクセスする既存の
@Resource
アノテーションも置き換える必要があります。以下に例を示します。@Resource(name = "java:/YourDatasourceName").
3.1.6.4. Hibernate または JPA のデータソースの設定
手順3.9 Hibernate バンドルの削除
- アプリケーションライブラリーフォルダーから Hibernate JAR を削除します。
persistence.xml
ファイルの<hibernate.transaction.manager_lookup_class>
要素は必要ないため、この要素を削除またはコメントアウトします。
3.1.6.5. リソースアダプター設定の更新
概要
以前のバージョンのアプリケーションサーバーでは、リソースアダプターの設定は、*-ds.xml
のサフィックスのファイルで定義されていました。JBoss EAP 6 では、リソースアダプターはサーバー設定ファイルで設定されます。管理対象ドメインで実行している場合、設定ファイルは EAP_HOME/domain/configuration/domain.xml
ファイルになります。スタンドアロンサーバーとして実行している場合は、EAP_HOME/standalone/configuration/standalone.xml
ファイルでリソースアダプターを設定します。両方のモードで同じであるスキーマ参照情報は、IronJacamar Web サイト(http://www.ironjacamar.org/documentation.html)の 『Schemas』 セクションにあります。
リソースアダプターの定義
リソースアダプター記述子情報は、サーバー設定ファイルの以下のサブシステム要素で定義されます。
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>リソースアダプターの
*-ds.xml
ファイルで以前に定義された同じデータソース情報の一部を使用します。
<resource-adapters> <resource-adapter> <archive>multiple-full.rar</archive> <config-property name="Name">ResourceAdapterValue</config-property> <transaction-support>NoTransaction</transaction-support> <connection-definitions> <connection-definition class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory1" enabled="true" jndi-name="java:/eis/MultipleConnectionFactory1" pool-name="MultipleConnectionFactory1"> <config-property name="Name">MultipleConnectionFactory1Value</config-property> </connection-definition> <connection-definition class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory2" enabled="true" jndi-name="java:/eis/MultipleConnectionFactory2" pool-name="MultipleConnectionFactory2"> <config-property name="Name">MultipleConnectionFactory2Value</config-property> </connection-definition> </connection-definitions> <admin-objects> <admin-object class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject1Impl" jndi-name="java:/eis/MultipleAdminObject1"> <config-property name="Name">MultipleAdminObject1Value</config-property> </admin-object> <admin-object class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject2Impl" jndi-name="java:/eis/MultipleAdminObject2"> <config-property name="Name">MultipleAdminObject2Value</config-property> </admin-object> </admin-objects> </resource-adapter> </resource-adapters>
3.1.6.6. リークしたデータソース接続の検出
概要
JBoss EAP 6 では、Cached Connection Manager (CCM)デバッグユーティリティーを使用して、リークされたデータソース接続を検出できます。このトピックでは、CCM ユーティリティーを有効にしてデバッグする方法を説明します。
手順3.10 Cached Connection Managerの有効化
<use-ccm="true"
を設定して、サーバー設定ファイルのdatasources
サブシステムで CCM を有効にします。これはデフォルト値であり、明示的に設定する必要はありません。<subsystem xmlns="urn:jboss:domain:datasources:1.2"> <datasources> <datasource ... enabled="true" use-ccm="true"> ... </datasource> </datasources> </subsystem>
<cached-connection-manager>
がサーバー設定ファイルのjca
サブシステムに存在することを確認します。debug
属性をtrue
に設定します。<subsystem xmlns="urn:jboss:domain:jca:1.1"> ... <cached-connection-manager debug="true" error="true"/> ... </subsystem>
debug="true"
を設定すると、以下が発生します。追加のプロパティー- "Closing a connection for you. Please close them yourself"というメッセージと共に、
INFO
メッセージがログに記録されます。 - リークした接続を開いたコード用にスタックトレースが生成されます。
- リークした接続が閉じられます。
error="true"
を使用すると、RuntimeException
を発生させ、ログにERROR
メッセージを生成できます。- デバッグを有効にすることは、パフォーマンスおよびログファイルのサイズに影響を及ぼすため、テスト時のみを使用することが推奨されます。リークが残っていないことを確認してから、アプリケーションを実稼働環境にデプロイする前に、
debug="true"
設定を削除するか、<cached-connection-manager debug="false"/>
を使用して、設定を元に戻します。
手順3.11 Cached Connection Manager によって報告されないリークのデバッグ
- サーバー設定ファイルの
datasource
サブシステムにuse-ccm="false"
が設定されていないことを確認します。 - サーバー設定ファイルの
datasource
サブシステムにjta="false"
が設定されていないことを確認します。 org.jboss.jca
では、最小ロギングレベルがINFO
に設定されていることを確認します。
3.1.7. セキュリティーの変更
3.1.7.1. アプリケーションセキュリティーの変更の設定
Basic 認証のセキュリティー設定
これまでのバージョンの JBoss EAP では、EAP_HOME/server/SERVER_NAME/conf/
ディレクトリーに置かれたプロパティーファイルはクラスパス上にあり、UsersRolesLoginModule
によって簡単に確認できました。JBoss EAP 6 では、ディレクトリー構造が変更になりました。プロパティーファイルは、クラスパスで利用できるようにするためにアプリケーション内にパッケージ化する必要があります。
standalone/configuration/standalone.xml
または domain/configuration/domain.xml
サーバー設定ファイルのsecurity-domains
の下に、新しいセキュリティードメインを追加します。
<security-domain name="example"> <authentication> <login-module code="UsersRoles" flag="required"> <module-option name="usersProperties" value="${jboss.server.config.dir}/example-users.properties"/> <module-option name="rolesProperties" value="${jboss.server.config.dir}/example-roles.properties"/> </login-module> </authentication> </security-domain>
${jboss.server.config.dir}
EAP_HOME/Standalone/configuration/
ディレクトリーを参照します。インスタンスが管理対象ドメインで実行されている場合には、 ${jboss.server.config.dir}
EAP_HOME/domain/configuration/
ディレクトリーを参照します。
セキュリティードメイン名の変更
JBoss EAP 6 では、セキュリティードメインの名前にプレフィックス java:/jaas/
が使用されなくなりました。
- Web アプリケーションの場合、
jboss-web.xml
のセキュリティードメイン設定からこのプレフィックスを削除する必要があります。 - エンタープライズアプリケーションの場合、
jboss-ejb3.xml
ファイルのセキュリティードメイン設定からこのプレフィックスを削除する必要があります。JBoss EAP 6 では、このファイルはjboss.xml
に置き換えられています。
3.1.7.2. PicketLink STS および Web サービスを使用するアプリケーションの更新
概要
JBoss EAP 6.1 アプリケーションが PicketLink STS および Web サービスを使用する場合、JBoss EAP 6.2 以降に移行するときに変更が必要になる場合があります。CVE-2013-2133 に対応するために JBoss EAP に適用された修正により、EJB3 ベースの WS エンドポイントにアタッチされた JAXWS ハンドラーを実行する前に、コンテナーによる承認チェックが実施されます。したがって、PicketLink SAML2Handler
は後でプロセスで使用されるセキュリティープリンシパルを確立するため、PicketLink STS 機能の一部が影響を受ける可能性があります。HandlerAuthInterceptor
が SAML2Handler
にアクセスする際にプリンシパルが NULL
であるため、サーバーログに NullPointerException
が記録されることがあります。この問題を修正するには、このセキュリティーチェックを無効にする必要があります。
手順3.12 追加の承認チェックの無効化
- 以下の方法のいずれかを使用して、追加の承認チェックを無効にし、既存の PicketLink デプロイメントを引き続き使用できます。
- システム全体のプロパティーを設定します。
org.jboss.ws.cxf.disableHandlerAuthChecks
システムプロパティーの値をtrue
に設定すると、サーバーレベルで追加の承認チェックを無効にできます。この方法は、アプリケーションサーバーに加えられたすべてのデプロイメントに影響します。システムプロパティーの設定方法は、JBoss EAPの『Administration and Configuration Guide』の『Configure System Properties Using the Management CLI』というトピックを参照してください。 - デプロイメントの Web サービス記述子ファイルにプロパティーを作成します。
jboss-webservices.xml
ファイルでorg.jboss.ws.cxf.disableHandlerAuthChecks
プロパティーの値をtrue
に設定すると、デプロイメントレベルで追加の承認チェックを無効にできます。この方法は、特定のデプロイメントにのみ影響します。- 追加の承認チェックを無効にするデプロイメントの
META-INF/
ディレクトリーにjboss-webservices.xml
ファイルを作成します。 - 以下の内容を追加します。
<?xml version="1.1" encoding="UTF-8"?> <webservices xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee"> <property> <name>org.jboss.ws.cxf.disableHandlerAuthChecks</name> <value>true</value> </property> </webservices>
org.jboss.ws.cxf.disableHandlerAuthChecks
プロパティーを有効にすると、CVE-2013-2133 に対してシステムが脆弱になります。アプリケーションが EJB メソッドで宣言されたセキュリティー制限が適用されることを期待しているにも関わらず、JAX-WS ハンドラーに依存しないセキュリティー制限を適用しない場合、プロパティーを有効化しないでください。このプロパティーは、アプリケーションの破損を回避するために必要な場合、後方互換性の目的でのみ使用してください。
3.1.8. JNDI の変更
3.1.8.1. アプリケーション JNDI 名前空間名の更新
概要
EJB 3.1 では、標準化されたグローバル JNDI 名前空間と、Java EE アプリケーションのさまざまなスコープにマッピングする関連する名前空間が導入されました。移植可能な EJB 名は java:global
、java:module
、および java:app
の 3 つのみにバインドされます。JNDI を使用する EJB のアプリケーションは、新しい標準化された JNDI 名前空間規則に従うように変更する必要があります。
手順3.13 JNDI ルックアップの変更
- 以下について詳しく確認する 「移植可能な EJB JNDI 名」
JNDI マッピングの例
以前のリリースの JNDI 名前空間の例と JBoss EAP 6 でどのように指定されているかは、 「以前のリリースの JNDI 名前空間の例と JBoss EAP 6 での指定方法」を参照してください。
3.1.8.2. 移植可能な EJB JNDI 名
概要
Java EE 6 仕様は、それぞれ独自のスコープを持つ 4 つの論理名前空間を定義しますが、移植可能な EJB 名はその内の 3 つにのみバインドされます。以下の表は、各名前空間の使用方法と使用するタイミングの詳細を示しています。
表3.1 移植可能な JNDI 名前空間
JNDI 名前空間 | 説明 |
---|---|
java:global |
この名前空間内の名前は、アプリケーションサーバーインスタンスにデプロイされたすべてのアプリケーションによって共有されます。この名前空間の名前を使用して、同じサーバーにデプロイされた EJB 外部アーカイブを検索します。
java:global/jboss-seam-booking/jboss-seam-booking-jar/HotelBookingAction は、java:global 名前空間の例です。
|
java:module |
この名前空間内の名前は、モジュールのすべてのコンポーネント(例:単一の EJB モジュールのすべてのエンタープライズBeanや Web モジュールのすべてのコンポーネント)によって共有されます。
java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking は、java:module 名前空間の例です。
|
java:app |
この名前空間内の名前は、単一アプリケーションのすべてのモジュールのすべてのコンポーネントで共有されます。たとえば、同じ EAR ファイルの WAR と EJB jar ファイルは java:app 名前空間内のリソースにアクセスできます。
java:app/jboss-seam-booking-jar/HotelBookingAction は、java:app 名前空間の例です。
|
3.1.8.3. JNDI 名前空間ルールの確認
概要
JBoss EAP 6 で JNDI 名前空間名が改善され、アプリケーションサーバーにバインドされるすべての名前に対して予測可能かつ一貫性のあるルールを提供するだけでなく、今後の互換性の問題を回避します。したがって、アプリケーションの現在の名前空間が新しいルールに準拠しない場合に、問題が発生する可能性があります。
名前空間は以下のルールに従う必要があります。
DefaultDS
やjdbc/DefaultDS
などの修飾されていない相対名は、コンテキストに応じてjava:comp/env
、java:module/env
、またはjava:jboss/env
との相対値として修飾する必要があります。/jdbc/DefaultDS
などの修飾されていない絶対
名は、java:jboss/root
名との相対値として修飾する必要があります。java:/jdbc/DefaultDS
などの修飾された絶対
名は、上記の非修飾絶対
名と同じ方法で修飾する必要があります。- 特別な
java:jboss
名前空間は AS サーバーインスタンス全体で共有されます。 java:
プレフィックスの相対
名は、5つの名前空間comp
、module
、app
、global
、またはプロプライエタリーのjboss
のいずれかになければなりません。java:xxx
(ここで、xxx は上記の 5 つのいずれとも一致しない)で始まる名前の場合、無効な名前エラーが発生します。
3.1.8.4. 新しい JNDI 名前空間ルールに従うようにアプリケーションを変更
- 以下は、JBoss EAP 5.1 の JNDI ルックアップの例になります。このコードは、通常初期化メソッドにあります。
private ProductManager productManager; try { context = new InitialContext(); productManager = (ProductManager) context.lookup("OrderManagerApp/ProductManagerBean/local"); } catch(Exception lookupError) { throw new ServletException("Unable to find the ProductManager bean", lookupError); }
ルックアップ名はOrderManagerApp/ProductManagerBean/local
であることに注意してください。 - 以下は、依存性注入を使用して同じルックアップを JBoss EAP 6 でコーディングする方法の例になります。
@EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager") private ProductManager productManager;
ルックアップ値は、メンバー変数として定義され、新しい移植可能なjava:app
JNDI 名前空間名java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager
を使用するようになりました。 - 依存性注入を使用しない場合は、上記のように新しい InitialContext を作成し、新しい JNDI 名前空間名を使用するようにルックアップを変更できます。
private ProductManager productManager; try { context = new InitialContext(); productManager = (ProductManager) context.lookup("java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager"); } catch(Exception lookupError) { throw new ServletException("Unable to find the ProductManager bean", lookupError); }
3.1.8.5. 以前のリリースの JNDI 名前空間の例と JBoss EAP 6 での指定方法
表3.2 JNDI 名前空間マッピングテーブル
JBoss EAP 5.x での名前空間 | JBoss EAP 6 での名前空間 | 追加のコメント |
---|---|---|
OrderManagerApp/ProductManagerBean/local | java:module/ProductManagerBean!services.ejb.ProductManager | Java EE 6 の標準バインディング。現在のモジュールがスコープで、同じモジュール内でのみアクセスできます。 |
OrderManagerApp/ProductManagerBean/local | java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | Java EE 6 の標準バインディング。現在のアプリケーションがスコープで、同じアプリケーション内でのみアクセスできます。 |
OrderManagerApp/ProductManagerBean/local | java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | Java EE 6 の標準バインディング。アプリケーションサーバーがスコープで、グローバルにアクセスできます。 |
java:comp/UserTransaction | java:comp/UserTransaction | 名前空間は現在のコンポーネントがスコープです。Java EE 6 ではないスレッド(例:アプリケーションが直接作成したスレッド)からはアクセスできません。 |
java:comp/UserTransaction | java:jboss/UserTransaction | グローバルにアクセス可能。java:comp/UserTransaction が利用できない場合に使用します。 |
java:/TransactionManager | java:jboss/TransactionManager | |
java:/TransactionSynchronizationRegistry | java:jboss/TransactionSynchronizationRegistry |
3.2. アプリケーションアーキテクチャーおよびコンポーネントに応じた変更
3.2.1. アプリケーションアーキテクチャーおよびコンポーネントに応じた変更の確認
- Hibernate および JPA
- アプリケーションが Hibernate または JPA を使用する場合は、アプリケーションの変更が必要になる場合があります。詳細は、 「Hibernate や JPA を使用するアプリケーションの更新」 を参照してください。
- REST
- アプリケーションが JAX-RS を使用する場合は、JBoss EAP 6 が RESTEasy を自動的に設定するため、自分で設定する必要がないことに注意してください。詳細は、 「JAX-RS および RESTEasy の変更の設定」を参照してください。
- LDAP
- JBoss EAP 6 では、LDAP セキュリティーレルムは異なる方法で設定されます。アプリケーションが LDAP を使用する場合は、 「LDAP セキュリティーレルムの変更の設定」 のトピックで詳細を参照してください。
- Messaging
- JBoss Messaging は JBoss EAP 6 に含まれなくなりました。アプリケーションが JBoss Messaging をメッセージングプロバイダーとして使用する場合は、JBoss Messaging コードを HornetQ に置き換える必要があります。 「HornetQ を JMS プロバイダーとして使用するためのアプリケーションの移行」 のトピックで、必要な操作について説明します。
- クラスタリング
- JBoss EAP 6 では、クラスタリングを有効にする方法が変更になりました。詳細は、 「クラスタリング向けにアプリケーションに変更を加える。」 を参照してください。
- サービススタイルのデプロイメント
- JBoss EAP 6 はサービススタイルの記述子を使用しなくなりましたが、コンテナーは可能な限り変更なしにサービススタイルのデプロイメントをサポートします。デプロイメントの情報は、 「サービススタイルのデプロイメントを使用するアプリケーションの更新」を参照してください。
- リモート呼び出し
- アプリケーションがリモート呼び出しを行う場合、JNDI を使用して Bean のプロキシーを検索し、返されたプロキシーで呼び出しを行うことができます。必要な構文および名前空間の変更に関する詳細は、 「リモート呼び出しを JBoss EAP 6 に作成する JBoss EAP 5 のデプロイされたアプリケーションの移行」 を参照してください。
- Seam 2.2
- アプリケーションが Seam 2.2 を使用する場合は、必要な変更について 「Seam 2.2 アーカイブの JBoss EAP 6 への移行」 のトピックを参照してください。
- Spring
- アプリケーションが Spring を使用する場合は、 「Spring アプリケーションの移行」 を参照してください。
- 移行に影響を与える可能性のあるその他の変更
- アプリケーションに影響を与える可能性がある JBoss EAP 6 のその他の変更については、 「移行の影響を受ける可能性がある他の変更点についてよく知る」 を参照してください。
3.2.2. Hibernate および JPA の変更
3.2.2.1. Hibernate や JPA を使用するアプリケーションの更新
概要
アプリケーションが Hibernate または JPA を使用する場合は、以下のセクションを読んで JBoss EAP 6 に移行するために必要な変更を加えてください。
3.2.2.2. Hibernate および JPA を使用するアプリケーションの変更の設定
概要
アプリケーションに persistence.xml
ファイルが含まれる場合や、コードが @PersistenceContext
または @PersistenceUnit
アノテーションを使用する場合、JBoss EAP 6 はデプロイメント時にこれを検出し、アプリケーションが JPA を使用すると仮定します。暗黙的に Hibernate 4 と他の依存関係をアプリケーションクラスパスに追加します。
ClassNotFoundExceptions
が表示される場合は、以下の方法の 1 つを使用して解決できます。
手順3.14 アプリケーションの設定
- 必要な Hibernate 3 JAR をアプリケーションライブラリーにコピーします。不足しているクラスが含まれる特定の Hibernate 3 JAR をアプリケーションの
lib/
ディレクトリーにコピーするか、他の方法を使用してクラスパスに追加して、問題を解決できる場合があります。これにより、Hibernate バージョンの混合使用が原因でClassCastExceptions
やその他のクラスローディングの問題が発生することがあります。その場合には、次の方法を使用する必要があります。 - Hibernate 3 ライブラリーのみを使用するようにサーバーに指示します。JBoss EAP 6 では、アプリケーションで Hibernate 3.5(またはそれ以降)の永続プロバイダー jar をパッケージ化できます。Hibernate 3 ライブラリーのみを使用し、Hibernate 4 ライブラリーを除外するようにサーバーに指示するには、以下のように
persistence.xml
のjboss.as.jpa.providerModule
をhibernate3-bundled
に設定する必要があります。<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="plannerdatasource_pu"> <description>Hibernate 3 Persistence Unit.</description> <jta-data-source>java:jboss/datasources/PlannerDS</jta-data-source> <properties> <property name="hibernate.show_sql" value="false" /> <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" /> </properties> </persistence-unit> </persistence>
Java Persistence API (JPA)デプロイヤーは、アプリケーション内に永続プロバイダーの存在を検出し、Hibernate 3 ライブラリーを使用します。JPA 永続プロパティーの詳細は、 「永続ユニットプロパティー」 を参照してください。 - Hibernate 二次キャッシュを無効にします。Hibernate 3 の 二次キャッシュは、JBoss EAP 6 では以前のリリースと同じようには動作しません。アプリケーションで Hibernate 二次キャッシュを使用している場合は、Hibernate 4 にアップグレードするまで無効にする必要があります。二次キャッシュを無効にするには、
persistence.xml
ファイルで<hibernate.cache.use_second_level_cache>
をfalse
に設定します。 org.jboss.ejb3.entity.ExtendedEntityManager
への参照を置き換えます。JBoss EAP 5 では、拡張永続コンテキスト管理のためにorg.jboss.ejb3.entity.ExtendedEntityManager
クラスがjavax.persistence.EntityManager
を拡張しました。JBoss EAP 6 では、このクラスはorg.jboss.as.jpa.container.ExtendedEntityManager
クラスに置き換えられました。ただし、プロプライエタリークラスの代わりに標準の Java EE 6 JPA APIjavax.persistence.EntityManager
クラスを使用するようコードを更新することが推奨されます。
3.2.2.3. 永続ユニットプロパティー
Hibernate 4.x 設定プロパティー
JBoss EAP 6 は以下の Hibernate 4.x 設定プロパティーを自動的に設定します。
表3.3 Hibernate 永続ユニットプロパティー
プロパティー名 | デフォルト値 | 目的 |
---|---|---|
hibernate.id.new_generator_mappings | true |
この設定は、
@GeneratedValue(AUTO) を使用して新規エンティティーの一意のインデックスキーの値を生成する場合に該当します。新規アプリケーションはデフォルト値の true を維持する必要があります。Hibernate 3.3.x を使用した既存のアプリケーションは、シーケンスオブジェクトまたはテーブルベースのジェネレーターを使用し、後方互換性を維持するために false に変更する必要がある場合があります。アプリケーションは persistence.xml ファイルのこの値をオーバーライドできます。
この動作の詳細については、以下を参照してください。
|
hibernate.transaction.jta.platform | org.hibernate.service.jta.platform.spi.JtaPlatform インターフェイスのインスタンス |
このクラスは、トランザクションマネージャー、ユーザートランザクション、トランザクション同期レジストリーを Hibernate に渡します。
|
hibernate.ejb.resource_scanner | org.hibernate.ejb.packaging.Scanner インターフェイスのインスタンス |
このクラスは、JBoss EAP 6 のアノテーションインデクサーを使用してデプロイメントを迅速化する方法を認識します。
|
hibernate.transaction.manager_lookup_class |
このプロパティーは、
hibernate.transaction.jta.platform と競合する可能性があるため、persistence.xmlにあれば削除されます。
| |
hibernate.session_factory_name | QUALIFIED_PERSISTENCE_UNIT_NAME |
これは、アプリケーション名と永続ユニット名の組み合わせに設定されます。アプリケーションは異なる値を指定できますが、JBoss EAP 6 インスタンスのすべてのアプリケーションデプロイメントで一意である必要があります。
|
hibernate.session_factory_name_is_jndi | false |
これは、アプリケーションが
hibernate.session_factory_name の値を指定しなかった場合にのみ設定されます。
|
hibernate.ejb.entitymanager_factory_name | QUALIFIED_PERSISTENCE_UNIT_NAME |
これは、アプリケーション名と永続ユニット名の組み合わせに設定されます。アプリケーションは異なる値を指定できますが、JBoss EAP 6 インスタンスのすべてのアプリケーションデプロイメントで一意である必要があります。
|
new_generator_mappings
が true
に設定されている場合:
@GeneratedValue(AUTO)
はorg.hibernate.id.enhanced.SequenceStyleGenerator
にマッピングします。@GeneratedValue(TABLE)
はorg.hibernate.id.enhanced.TableGenerator
にマッピングします。@GeneratedValue(SEQUENCE)
はorg.hibernate.id.enhanced.SequenceStyleGenerator
にマッピングします。
new_generator_mappings
が false
に設定されている場合:
@GeneratedValue(AUTO)
はHibernate の「native」にマッピングします。@GeneratedValue(TABLE)
はorg.hibernate.id.MultipleHiLoPerTableGenerator
にマッピングします。@GeneratedValue(SEQUENCE)
はHibernate の「seqhilo」にマッピングします。
JPA 永続プロパティー
以下の JPA プロパティーは persistence.xml
ファイルの永続ユニット定義でサポートされます。
表3.4 JPA 永続ユニットプロパティー
プロパティー名 | デフォルト値 | 目的 |
---|---|---|
jboss.as.jpa.providerModule | org.hibernate |
永続プロバイダーモジュールの名前。
Hibernate 3 JAR がアプリケーションアーカイブに ある場合は、値を
hibernate3-bundled にする必要があります。
永続プロバイダーがアプリケーションとともにパッケージ化されている場合は、この値は
application である必要があります。
|
jboss.as.jpa.adapterModule | org.jboss.as.jpa.hibernate:4 |
JBoss EAP 6 が永続プロバイダーと動作するようにする統合クラスの名前。
現在の有効な値は以下のとおりです。
|
3.2.2.4. Hibernate 4 を使用するように Hibernate 3 アプリケーションを更新
概要
Hibernate 4 を使用するようにアプリケーションを更新すると、一部の更新は一般的で、アプリケーションによって現在使用されている Hibernate のバージョンに関係なく適用されます。その他の更新では、アプリケーションが現在使用しているバージョンを決定する必要があります。
手順3.15 Hibernate 4 を使用するようにアプリケーションを更新
- JBoss EAP 6 では、自動インクリメントシーケンスジェネレーターのデフォルト動作が変更されました。詳細は、 「Hibernate のアイデンティティー自動生成値に関する既存動作の維持」 を参照してください。
- アプリケーションによって現在使用されている Hibernate のバージョンを確認し、以下の正しい更新手順を選択します。
- クラスター環境でアプリケーションを実行する予定の場合には、 「クラスター環境で実行する移行した Seam および Hibernate アプリケーションの永続プロパティーの変更」 を参照してください。
3.2.2.5. Hibernate のアイデンティティー自動生成値に関する既存動作の維持
@GeneratedValue
の使用時にアイデンティティー列またはシーケンス列が生成される方法を示す hibernate.id.new_generator_mappings
という名前のコアプロパティーが導入されました。JBoss EAP 6 では、このプロパティーのデフォルト値は以下のように設定されます。
- ネイティブ Hibernate アプリケーションをデプロイする場合、デフォルト値は
false
です。 - JPA アプリケーションをデプロイする場合、デフォルト値は
true
です。
新規アプリケーションのガイドライン
@GeneratedValue
アノテーションを使用する新規アプリケーションは、hibernate.id.new_generator_mappings
プロパティーの値を true
に設定する必要があります。異なるデータベース間で移植できるので、この設定が推奨されます。多くの場合、効率的であり、場合によっては JPA 2 仕様との互換性に対応します。
- 新しい JPA アプリケーションでは、JBoss EAP 6 は
hibernate.id.new_generator_mappings
プロパティーをtrue
にデフォルト設定するため、変更しないでください。 - 新しいネイティブ Hibernate アプリケーションの場合、JBoss EAP 6 は
hibernate.id.new_generator_mappings
プロパティーをfalse
にデフォルト設定します。このプロパティーをtrue
に設定する必要があります。
既存の JBoss EAP 5 アプリケーションのガイドライン
@GeneratedValue
アノテーションを使用する既存のアプリケーションは、アプリケーションが JBoss EAP 6 に移行するときに、新しいエンティティーのプライマリーキー値を作成するために同じジェネレーターが使用されることを確認する必要があります。
- 既存の JPA アプリケーションの場合、JBoss EAP 6 は
hibernate.id.new_generator_mappings
プロパティーをtrue
にデフォルト設定します。persistence.xml
ファイルで、このプロパティーをfalse
に設定する必要があります。 - 既存のネイティブ Hibernate アプリケーションの場合、JBoss EAP 6 は
hibernate.id.new_generator_mappings
をfalse
にデフォルト設定するため、変更しないでください。
3.2.2.6. Hibernate 3.3.x アプリケーションの Hibernate 4.x への移行
- Hibernate
テキスト
タイプはJDBC LONGVARCHAR
にマッピングされるようになりました。3.5 よりも前のバージョンの Hibernate では、テキスト
タイプはJDBC CLOB
にマッピングされました。新しい Hibernate タイプmaterialized_clob
が Hibernate 4 に追加され、JavaString
プロパティーをJDBC CLOB
にマッピングします。JDBC CLOB
にマッピングすることが意図されたアプリケーションのプロパティーがtype="text"
として設定されている場合、以下のいずれかを実行する必要があります。- アプリケーションが hbm マッピングファイルを使用する場合は、プロパティーを
type="materialized_clob"
に変更します。 - アプリケーションがアノテーションを使用する場合は、
@Type(type = "text")
を@Lob
に置き換える必要があります。
- 戻り値タイプの変更を探すコードの確認数値集約基準のプロジェクションは、HQL のカウンターパートと同じ値タイプを返すようになりました。その結果、
org.hibernate.criterion
の以下のプロジェクションからの戻り値の型が変更されました。CountProjection
、Projections.rowCount()
、Projections.count(propertyName)
、Projections.countDistinct(propertyName)
の変更により、count
およびcount distinct
プロジェクションはLong
値を返すようになりました。Projections.sum(propertyName)
の変更により、sum
プロジェクションはプロパティータイプに依存する値タイプを返すようになりました。注記アプリケーションコードの変更に失敗すると、java.lang.ClassCastException
が発生することがあります。- Long、Short、Integer、またはプリミティブ整数タイプとしてマッピングされたプロパティーの場合、Long 値が返されます。
- Float、Double、またはプリミティブ浮動小数点タイプとしてマッピングされたプロパティーの場合は、Double 値が返されます。
nullSafeGet()
およびnullSafeSet()
メソッドのUserType
署名を更新します。UserType
クラスのnullSafeGet()
およびnullSafeSet()
メソッドの署名が Hibernate 4 で変更になりました。これらのメソッドを使用するアプリケーションコードは、新しい署名を使用するように更新する必要があります。以下は、Hibernate 3.x のメソッド署名の例です。public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException; public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException;
以下は、Hibernate 4 の新しいメソッド署名の例です。public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException; public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException;
3.2.2.7. Hibernate 3.5.x アプリケーションの Hibernate 4.x への移行
- AnnotationConfiguration が Configurationにマージされました。
AnnotationConfiguration
は非推奨になりましたが、移行には影響しません。hbm.xml
ファイルをまだ使用している場合は、JBoss EAP 6 では、以前のリリースで使用されていたorg.hibernate.cfg.DefaultNamingStrategy
ではなく、AnnotationConfiguration
のorg.hibernate.cfg.EJB3NamingStrategy
が使用されるようになったことに注意してください。これにより、命名が一致しなくなる可能性があります。- 関連付け(多対多および要素のコレクション)表の名前のデフォルト設定を命名ストラテジーに依存している場合、この問題が発生する可能性があります。この問題を解決するには、
Configuration#setNamingStrategy
を呼び出してorg.hibernate.cfg.DefaultNamingStrategy#INSTANCE
に渡すことで、レガシーorg.hibernate.cfg.DefaultNamingStrategy
を使用するように Hibernate に指示できます。
- 以下の表にあるように、新しい Hibernate DTD ファイル名に準拠するように名前空間を変更します。
表3.5 DTD 名前空間マッピングテーブル
以前の DTD 名前空間 新しい DTD 名前空間 http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd - 環境変数を変更します。
- Oracle を使用し、
materialized_clob
またはmaterialized_blob
プロパティーを使用している場合は、グローバル環境変数hibernate.jdbc.use_streams_for_binary
を true に設定する必要があります。 - PostgreSQL を使用し、
CLOB
またはBLOB
プロパティーを使用している場合は、グローバル環境変数hibernate.jdbc.use_streams_for_binary
を false に設定する必要があります。
nullSafeGet()
およびnullSafeSet()
メソッドのUserType
署名を更新します。UserType
クラスのnullSafeGet()
およびnullSafeSet()
メソッドの署名が Hibernate 4 で変更になりました。これらのメソッドを使用するアプリケーションコードは、新しい署名を使用するように更新する必要があります。詳細は、 「Hibernate 3.3.x アプリケーションの Hibernate 4.x への移行」 を参照してください。
3.2.2.8. クラスター環境で実行する移行した Seam および Hibernate アプリケーションの永続プロパティーの変更
javax.ejb.EJBTransactionRolledbackException: JBAS010361: Failed to deserialize .... Caused by: java.io.InvalidObjectException: could not resolve session factory during session deserialization [uuid=8aa29e74373ce3a301373ce3a44b0000, name=null]これらのエラーを解決するには、設定ファイルのプロパティーを変更する必要があります。ほとんどの場合、これは
persistence.xml
ファイルです。ネイティブ Hibernate API アプリケーションの場合、これは hibernate.cfg.xml
ファイルです。
手順3.16 クラスター環境で実行するための永続プロパティーの設定
hibernate.session_factory_name
の値を一意の名前に設定します。この名前は、JBoss EAP 6 インスタンス上のすべてのアプリケーションデプロイメントで一意である必要があります。以下に例を示します。<property name="hibernate.session_factory_name" value="jboss-seam-booking.ear_session_factory"/>
hibernate.ejb.entitymanager_factory_name
の値を一意の名前に設定します。この名前は、JBoss EAP 6 インスタンス上のすべてのアプリケーションデプロイメントで一意である必要があります。以下に例を示します。<property name="hibernate.ejb.entitymanager_factory_name" value="seam-booking.ear_PersistenceUnitName"/>
3.2.2.9. JPA 2.0 仕様に準拠するようにアプリケーションを更新
概要
JPA 2.0 仕様では、永続コンテキストを JTA トランザクションの外部に伝播できないことが求められます。アプリケーションがトランザクションスコープの永続コンテキストのみを使用する場合、JBoss EAP 6 での動作は以前のバージョンのアプリケーションサーバーと同じで、変更する必要はありません。ただし、アプリケーションが拡張永続コンテキスト(XPC)を使用してデータ変更のキューイングやバッチングを許可する場合は、アプリケーションに変更を加える必要がある場合があります。
永続コンテキストの伝播動作
アプリケーションに、拡張永続コンテキストを使用するステートフルセッション Bean Bean1
があり、トランザクションスコープの永続コンテキストを使用するステートレスセッション Bean Bean2
を呼び出す場合は、以下の動作が発生することが予想されます。
Bean1
が JTA トランザクションを開始し、JTA トランザクションを有効にしてBean2
メソッドの呼び出しを行う場合、JBoss EAP 6 での動作は以前のリリースと同じであるため、変更する必要はありません。Bean1
が JTA トランザクションを開始せず、Bean2
メソッド呼び出しを行う場合、JBoss EAP 6 は拡張永続コンテキストをBean2
に伝播しません。この動作は、拡張永続コンテキストをBean2
に伝播していた以前のリリースとは異なります。アプリケーションが、トランザクションエンティティーマネージャーにより拡張永続コンテキストが Bean に伝播されることを期待する場合は、アクティブな JTA トランザクション内で呼び出しを行うようにアプリケーションを変更する必要があります。
3.2.2.10. JPA/Hibernate 二次キャッシュの Infinispan への置き換え
概要
二次キャッシュ(2LC)については、JBoss キャッシュが Infinispan に置き換えられました。これには、persistence.xml
ファイルを変更する必要があります。JPA または Hibernate 二次キャッシュを使用しているかどうかによって、構文は若干異なります。これらの例では、Hibernate を使用していることを前提としています。
persistence.xml
ファイルで二次キャッシュのプロパティーがどのように指定されるかの例になります。
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory"/> <property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager"/> <property name="hibernate.cache.use_second_level_cache" value="true"/> <property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity"/> <property name="hibernate.cache.region_prefix" value="services"/>以下の手順では、この例を使用して JBoss EAP 6 で Infinispan を設定します。
手順3.17 Infinispan を使用するように persistence.xml
ファイルを変更します。
- JBoss EAP 6 での JPA アプリケーション用 Infinispan の設定以下は、JBoss EAP 6 で Infinispan を使用して JPA アプリケーション用に同じ設定を実現するためにプロパティーを指定する方法の例です。
<property name="hibernate.cache.use_second_level_cache" value="true"/>
さらに、以下のようにENABLE_SELECTIVE
またはALL
の値でshared-cache-mode
を指定する必要があります。ENABLE_SELECTIVE
はデフォルト値であり、推奨される値です。つまり、エンティティーを明示的にキャッシュ可能としてマークしない限り、エンティティーはキャッシュされません。<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
ALL
は、エンティティーをキャッシュ可能ではないとマークしても常にキャッシュされることを意味します。<shared-cache-mode>ALL</shared-cache-mode>
- JBoss EAP 6 でのネイティブ Hibernate アプリケーション用 Infinispan の設定以下は、JBoss EAP 6 で Infinispan を使用してネイティブ Hibernate アプリケーション用に同じ設定を指定する方法の例です。
<property name="hibernate.cache.region.factory_class" value="org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory"/> <property name="hibernate.cache.infinispan.cachemanager" value="java:jboss/infinispan/container/hibernate"/> <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/> <property name="hibernate.cache.use_second_level_cache" value="true"/>
MANIFEST.MF
ファイルに以下の依存関係も追加する必要があります。Manifest-Version: 1.0 Dependencies: org.infinispan, org.hibernate
3.2.2.11. Hibernate キャッシュプロパティー
表3.6 プロパティー
プロパティー名 | 説明 |
---|---|
hibernate.cache.region.factory_class |
カスタム
CacheProvider のクラス名。
|
hibernate.cache.use_minimal_puts |
ブール値。書き込みを最小限に抑えるために 2 次レベルのキャッシュ操作を最適化し、読み取りの頻度を上げます。この設定はクラスター化されたキャッシュで最も便利なもので、Hibernate3 ではクラスター化されたキャッシュ実装に対してデフォルトで有効になっています。
|
hibernate.cache.use_query_cache |
ブール値。クエリーキャッシュを有効にします。個別のクエリーをキャッシュ可能に設定する必要があります。
|
hibernate.cache.use_second_level_cache |
ブール値。
<cache> マッピングを指定するクラスに対してデフォルトで有効になっている 2 次レベルのキャッシュを完全に無効にするために使用されます。
|
hibernate.cache.query_cache_factory |
カスタム
QueryCache インターフェイスのクラス名。デフォルト値はビルトインの StandardQueryCache です。
|
hibernate.cache.region_prefix |
2 次キャッシュリージョン名に使用するプレフィックス。
|
hibernate.cache.use_structured_entries |
ブール値。Hibernate が、よりヒューマンリーダブルな形式で、2 次レベルのキャッシュにデータを格納するように強制します。
|
hibernate.cache.default_cache_concurrency_strategy | @Cacheable または @Cache のいずれかが使用された場合に使用するデフォルトの org.hibernate.annotations.CacheConcurrencyStrategy の名前を付与するために使用される設定。@Cache(strategy="..") は、このデフォルトを上書きするのに使用されます。
|
3.2.2.12. Hibernate Validator 4 への移行
概要
Hibernate Validator 4.x は JSR 303 - Bean Validation を実装する完全に新しいコードベースです。Validator 3.x から 4.x への移行プロセスは比較的直接的ですが、アプリケーションの移行時にいくつかの変更を加える必要があります。
手順3.18 以下のタスクの 1 つまたは複数を実行する必要がある場合があります。
- デフォルトの ValidatorFactory へのアクセスJBoss EAP 6 は、デフォルトの ValidatorFactory を
java:comp/ValidatorFactory
という名前のセクションの JNDI コンテキストにバインドします。 - ライフサイクルによりトリガーされる検証についてHibernate Core 4 と組み合わせて使用すると、ライフサイクルベースの検証は Hibernate Core によって自動的に有効になります。
- 検証は、エンティティーの
INSERT
、UPDATE
、DELETE
操作で実行されます。 - 以下のプロパティーを使用して、イベントタイプで検証するようにグループを設定できます。これらのプロパティーの値は、検証するグループの完全修飾クラス名のコンマ区切りリストです。
javax.persistence.validation.group.pre-persist
、javax.persistence.validation.group.pre-update
、およびjavax.persistence.validation.group.pre-remove
検証グループは Bean Validation 仕様の新しい機能です。この新機能を活用しない場合は、Hibernate Validator 4 に移行するときに変更は必要ありません。 javax.persistence.validation.mode
プロパティーをnone
に設定すると、ライフサイクルベースの検証を無効にできます。このプロパティーの他の有効な値は、auto
(デフォルト)、callback
、およびddl
です。
- 手動検証を使用するようにアプリケーションを設定
- 検証を手動で制御するには、以下のいずれかの方法でValidatorを作成します。
getValidator()
メソッドを使用してValidatorFactory
からValidator
インスタンスを作成します。- EJB、CDI Bean、またはその他の Java EE の注入可能なリソースにValidatorインスタンスを注入します。
ValidatorFactory.usingContext()
によって返されるValidatorContext
を使用してValidatorインスタンスをカスタマイズできます。この API を使用すると、カスタムMessageInterpolator
、TraverableResolver
、およびConstraintValidatorFactory
を設定できます。これらのインターフェイスは Bean Validation 仕様で指定され、Hibernate Validator 4 の新機能です。
- 新しい Bean Validation 制約を使用するためのコードの変更Hibernate Validator 4 に移行する際、新しい Bean レベルの検証制約にはコードの変更が必要です。
- Hibernate Validator 4 にアップグレードするには、以下のパッケージの制約を使用する必要があります。
javax.validation.constraints
org.hibernate.validator.constraints
- Hibernate Validator 3 に存在していた制約はすべて Hibernate Validator 4 で引き続き利用できます。これらを使用するには、指定のクラスをインポートする必要があり、場合によっては、制約パラメーターの名前またはタイプを変更します。
- カスタム制約の使用Hibernate Validator 3 では、
org.hibernate.validator.Validator
インターフェイスを実装するのにカスタム制約が必要でした。Hibernate Validator 4 では、javax.validation.ConstraintValidator
インターフェイスを実装する必要があります。このインターフェイスには、以前のインターフェイスと同じinitialize()
メソッドおよびisValid()
メソッドが含まれますが、メソッドの署名が変更されました。さらに、Hibernate Validator 4 ではDDL
の変更に対応しなくなりました。 - 以下の Hibernate 3.x
Validator
クラスは廃止されました。org.hibernate.validator.NotNull
をjavax.validation.constraints.NotNull
に置き換えます。org.hibernate.validator.ClassValidator
をjavax.validation.Validator.
に置き換えます。org.hibernate.validator.InvalidValue
をjavax.validation.Validator.
に置き換えます。
詳細は、『Hibernate Valitator Reference Guide』を参照してください。 jboss-ejb3-ext-api-VERSION.jar
ファイルでは、多くのアノテーションエクステンション API が削除されました。JBoss EAP 6 では必要なくなったためです。たとえば、JBoss EAP 6 は相互互換性を自動的に処理するため、org.jboss.ejb3.annotation.IgnoreDependency
クラスは利用できないか、または不要になりました。
3.2.3. JTS および JTA の変更
3.2.3.1. JBoss Transaction Service 設定の移行
概要
これまでのバージョンの JBoss EAP では、JBoss Transaction Service トランザクションマネージャーは以下の XML ファイルのいずれかで設定されていました。
表3.7 JBossTS 設定ファイル
JBoss EAP バージョン | 設定ファイル名 |
---|---|
4.2
|
jboss-eap-4.2.0/server/default/conf/jbossjta-properties.xml
|
4.3
|
jboss-eap-4.3.0/server/default/conf/jbossjta-properties.xml
|
5.2
|
jboss-eap-5.2.0/server/default/conf/jbossts-properties.xml
|
- JBoss EAP 6 には、ノード識別子のデフォルト値が含まれています。これは、単一のJBoss EAP サーバーインスタンスを実行する場合は問題ありませんが、複数のサーバーインスタンスを実行する場合は変更する必要があります。
- JBoss EAP 6 には、デフォルトで JTA トランザクションが有効になっています。JTS トランザクションを設定するには、追加の手順が必要です。
JTA トランザクションのノード識別子設定の移行
JBoss EAP 6 には、ノード識別子のデフォルト設定値が同梱されます。これは、単一のJBoss EAP サーバーインスタンスを実行する場合は問題ありませんが、ノード識別子はすべての JBoss EAP サーバーインスタンスについて一意でなければならないので、複数のサーバーインスタンスを実行する場合は値を変更する必要があります。
jbossts-properties.xml
ファイルで設定されていました。
<property name="com.arjuna.ats.arjuna.xa.nodeIdentifier" value=UNIQUE_NODE_ID/>
transaction
サブシステムで設定されます。使用するコマンドは、管理対象ドメインとスタンドアロンサーバーのどちらを実行しているかによって異なります。
/system-property=jboss.tx.node.id:add(value=UNIQUE_NODE_ID) /subsystem=transactions:write-attribute(name=node-identifier,value="${jboss.tx.node.id}") reload
/host=master/server-config=server-one/system-property=jboss.tx.node.id:add(boot-time=true,value=UNIQUE_NODE_ID) /profile=PROFILE_NAME/subsystem=transactions:write-attribute(name=node-identifier,value="${jboss.tx.node.id}") reload
JBoss EAP 6 で JTS トランザクションを有効にするための変更
JBoss EAP 5 では、EAP5_HOME/docs/examples/transactions
ディレクトリーにある Ant スクリプトを実行して JTS トランザクションを有効にし、いくつかの手動の手順を実行していました。このスクリプトは、すべての JBoss EAP サーバー設定の jbossts-properties.xml
および jacorb.properties
ファイルが更新されました。
batch # Create a system property for the unique node identifier /system-property=jboss.tx.node.id:add(value=UNIQUE_NODE_ID) /system-property=jacorb.node.id:add(value=UNIQUE_JACORB_ID) # JacORB properties must be unique for each JBoss server instance # JacORB name must appear in JacORB context root i.e. ${jacorb.name}/Naming/root /subsystem=jacorb:write-attribute(name=transactions,value="on") /subsystem=jacorb:write-attribute(name="name",value="${jacorb.node.id}") /subsystem=jacorb:write-attribute(name="root-context",value="${jacorb.node.id}/Naming/root") /subsystem=transactions:write-attribute(name=jts,value=true) /subsystem=transactions:write-attribute(name=node-identifier,value="${jboss.tx.node.id}") run-batch reload
batch # # Define global system properties for the node identifier and JacORB implementation name. # /system-property=jboss.tx.node.id/:add(value="11",boot-time="true") /system-property=jacorb.node.id:add(value="mars",boot-time="true") /profile=PROFILE_NAME/subsystem=jacorb:write-attribute(name="security",value="on") /profile=PROFILE_NAME/subsystem=jacorb:write-attribute(name="transactions",value="on") /profile=PROFILE_NAME/subsystem=jacorb:write-attribute(name="name",value="${jacorb.node.id}") /profile=PROFILE_NAME/subsystem=jacorb:write-attribute(name="root-context",value="${jacorb.node.id}/Naming/root") /profile=PROFILE_NAME/subsystem=transactions:write-attribute(name="jts",value="true") /profile=PROFILE_NAME/subsystem=transactions:write-attribute(name="node-identifier",value="${jboss.tx.node.id:1}") run-batch reload --host=master
3.2.4. JSF の変更
3.2.4.1. 以前のバージョンの JSF を使用するアプリケーションの有効化
概要
アプリケーションが古いバージョンの JSF を使用する場合は、JSF 2.0 にアップグレードする必要はありません。代わりに、jboss-deployment-structure.xml
ファイルを作成して、JBoss EAP 6 がアプリケーションデプロイメントで JSF 2.0 ではなく JSF 1.2 を使用するように要求できます。この JBoss 固有のデプロイメント記述子はクラスローディングを制御するのに使用され、WAR の META-INF/
または WEB-INF/
ディレクトリー、または EAR の META-INF/
ディレクトリーに配置されます。
jboss-deployment-structure.xml
ファイルの例です。
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
3.2.5. キャッシュの変更
3.2.5.1. JBoss キャッシュの置き換え
infinispan
サブシステムで設定されます。これらがアプリケーションによって直接使用されることはなく、この目的ではサポートされません。
- リモートクライアント/サーバー
- このモードは、管理、分散、およびクラスター化が可能なデータグリッドサーバーを提供します。アプリケーションは、Hot Rod、memcached または REST クライアント API を使用して、データグリッドサーバーにリモートでアクセスできます。
- ライブラリー
- このモードでは、ユーザーはカスタムランタイム環境をビルドおよびデプロイできます。ライブラリー使用モードは、アプリケーションプロセスの単一のデータグリッドノードをホストし、このノードは他の JVM でホストされるノードへのリモートアクセスが可能です。
3.2.6. Web サービスの変更
3.2.6.1. Web サービスの変更
- JBossWS API の変更
- SPI および Common コンポーネントが、JBossWS 4 でリファクタリングされました。以下の表は、アプリケーションの移行に影響を及ぼす可能性がある API およびパッケージングの変更の一覧です。
表3.8 JBossWS API の変更
従来の JAR 従来のパッケージ 新しい JAR 新しいパッケージ JBossWS SPI org.jboss.wsf.spi.annotation.* JBossWS API org.jboss.ws.api.annotation.* JBossWS SPI org.jboss.wsf.spi.binding.* JBossWS API org.jboss.ws.api.binding.* JBossWS SPI org.jboss.wsf.spi.management.recording.* JBossWS API org.jboss.ws.api.monitoring.* JBossWS SPI org.jboss.wsf.spi.tools.* JBossWS API org.jboss.ws.api.tools.* JBossWS SPI org.jboss.wsf.spi.tools.ant.* JBossWS API org.jboss.ws.tools.ant.* JBossWS SPI org.jboss.wsf.spi.tools.cmd.* JBossWS API org.jboss.ws.tools.cmd.* JBossWS SPI org.jboss.wsf.spi.util.ServiceLoader JBossWS API org.jboss.ws.api.util.ServiceLoader JBossWS Common org.jboss.wsf.common.* JBossWS API org.jboss.ws.common.* JBossWS Common org.jboss.wsf.common.handler.* JBossWS API org.jboss.ws.api.handler.* JBossWS Common org.jboss.wsf.common.addressing.* JBossWS API org.jboss.ws.api.addressing.* JBossWS Common org.jboss.wsf.common.DOMUtils JBossWS API org.jboss.ws.api.util.DOMUtils JBossWS Native org.jboss.ws.annotation.EndpointConfig JBossWS API org.jboss.ws.api.annotation.EndpointConfig JBossWS Framework org.jboss.wsf.framework.invocation.RecordingServerHandler JBossWS Common org.jboss.ws.common.invocation.RecordingServerHandler - @WebContext アノテーション
- JBossWS 3.4.x では、このアノテーションは JBossWS SPI JAR で
org.jboss.wsf.spi.annotation.WebContext
としてパッケージ化されました。JBossWS 4.0 では、このアノテーションは JBossWS API JAR のorg.jboss.ws.api.annotation.WebContext
に移動しました。アプリケーションに廃止された依存関係が含まれる場合、アプリケーションのソースコードのインポートおよび依存関係を置き換え、新しい JBossWS API JAR に対してコンパイルする必要があります。また、後方互換性のない属性にも変更があります。String[] virtualHosts
属性がString virtualHost
に変更になりました。JBoss EAP 6 では、デプロイメントごとに 1 つの仮想ホストだけを指定できます。複数の Web サービスで@WebContext
アノテーションが使用される場合、virtualHost の値はデプロイメントアーカイブで定義されるすべてのエンドポイントで同一である必要があります。 - エンドポイント設定
- JBossWS 4.0 は、ほとんどの Apache CXF モジュールで JBoss Web Services スタックを統合します。インテグレーションレイヤーにより、JAX-WS を含む標準の webservices API を使用できます。また、複雑な設定や構成を必要とせずに JBoss EAP 6 コンテナー上で Apache CFX の高度な機能を使用することもできます。JBoss EAP 6 のドメイン設定の
webservice
サブシステムには事前に定義されたエンドポイント設定が含まれます。また、独自の追加のエンドポイント設定を定義することもできます。@org.jboss.ws.api.annotation.EndpointConfig
アノテーションは、指定のエンドポイント設定を参照するために使用されます。JBoss サーバーで web サービスエンドポイントを設定する方法は、JBoss EAP 6 の『開発ガイド』の「『JAX-WS Web Services』」というタイトルの章を参照してください。 - jboss-webservices.xml デプロイメント記述子
- JBossWS 4.0 では、Web サービスを設定するための新しいデプロイメント記述子が導入されました。
jboss-webservices.xml
ファイルは指定のデプロイメントに関する追加情報を提供し、廃止されたjboss.xml
ファイルを部分的に置き換えます。EJB webservice デプロイメントの場合は、jboss-webservices.xml
記述子ファイルの場所としてMETA-INF/
ディレクトリーに配置されることが想定されます。POJO および EJB webservice エンドポイントが WAR ファイルにバンドルされている場合には、jboss-webservices.xml
ファイルの場所としてWEB-INF/
ディレクトリーに配置されることが想定されます。以下は、jboss-webservices.xml
記述子ファイルと要素を記述するテーブルの例になります。<webservices> <context-root>foo<context-root> <config-name>Standard WSSecurity Endpoint</config-name> <config-file>META-INF/custom.xml</config-file> <property> <name>prop.name</name> <value>prop.value</value> </property> <port-component> <ejb-name>TestService</ejb-name> <port-component-name>TestServicePort</port-component-name> <port-component-uri>/*</port-component-uri> <auth-method>BASIC</auth-method> <transport-guarantee>NONE</transport-guarantee> <secure-wsdl-access>true</secure-wsdl-access> </port-component> <webservice-description> <webservice-description-name>TestService</webservice-description-name> <wsdl-publish-location>file:///bar/foo.wsdl</wsdl-publish-location> </webservice-description> </webservices>
表3.9 jboss-webservice.xml ファイル要素の説明
要素名 説明 context-rootwebservices デプロイメントのコンテキストルートをカスタマイズするために使用されます。config-nameconfig-fileエンドポイントデプロイメントと指定のエンドポイント設定の関連付けに使用されます。エンドポイント設定は、参照される設定ファイルまたはドメイン設定のwebservices
サブシステムに指定されます。プロパティー単純なプロパティー名の値ペアを設定するのに使用し、webservice スタックの動作を設定します。port-componentEJB エンドポイントのターゲット URI をカスタマイズしたり、セキュリティー関連のプロパティーを設定したりするために使用されます。webservice-descriptionwebservice WSDL で公開された場所をカスタマイズしたり上書きしたりするために使用されます。
3.2.6.2. JBoss EAP 6 での Apache Axis の使用
概要
Web サービスアプリケーションの開発およびデプロイには JBoss EAP 6 にバンドルされた JBossWS Apache CXF を使用することを推奨します。JBoss EAP 6 に同梱される JBossWS Apache CXF はサポート対象の設定です。Axis を使用する場合は、このトピックで JBoss EAP 6 での使用方法を説明します。この実装はアプリケーションの一部とみなされており、サポート対象の設定ではない点に注意してください。
手順3.19 Axis を使用するための JBoss EAP の設定
- 最初に、JBoss EAP 6 に同梱される web サービス実装を無効にする必要があります。詳細な手順は、 「JBoss EAP 6 での JBossWS の無効化」 を参照してください。
- アプリケーションを再ビルドし、デプロイします。Axis WS API 実装が Java EE 6 API クラスに正しくアクセスされるはずです。
3.2.6.3. JBoss EAP 6 での JBossWS の無効化
概要
Java Enterprise Edition Specification (Java EE) 6 では、Web サービスアプリケーションの開発およびデプロイに、アプリケーションサーバーが統合された JAX-WS 実装を提供する必要があります。JAX-WS のサポートを提供しないサーブレットコンテナーなど、他のコンテナーから移行するアプリケーションは、独自の JAX-WS 実装とともにパッケージ化される場合があります。JBossWS CXF を使用して独自の JAX-WS 実装をパッケージ化する予定がない場合は、JBoss EAP 6 で webservices
サブシステムを無効にすることができます。JBoss EAP 6 に同梱される JBossWS Apache CXF はサポート対象の設定であることに注意してください。その他の実装はアプリケーションの一部とみなされ、サポート対象の設定ではありません。
手順3.20 単一デプロイメントでの JBossWS の無効化
- アプリケーション用の
jboss-deployment-structure.xml
ファイルを作成します。- アプリケーションが WAR としてパッケージ化されてデプロイされている場合は、以下の内容で WAR の
META-INF/
またはWEB-INF/
ディレクトリーに、jboss-deployment-structure.xml
ファイルを作成します。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> <deployment> <!-- Exclude webservices subsystem so the implicit dependencies will not be added --> <exclude-subsystems> <subsystem name="webservices"/> </exclude-subsystems> </deployment> </jboss-deployment-structure>
- アプリケーションが EAR でパッケージ化されてデプロイされている場合は、以下の例のような内容で EAR の
META-INF/
ディレクトリーにjboss-deployment-structure.xml
ファイルを作成します。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> ... <sub-deployment name="example.war"> <!-- Exclude webservices subsystem so the implicit dependencies will not be added --> <exclude-subsystems> <subsystem name="webservices"/> </exclude-subsystems> <dependencies> ... </dependencies> </sub-deployment> </jboss-deployment-structure>
- 通常の方法でアプリケーションをデプロイします。JBossWS がアプリケーションで無効になりました。
手順3.21 サーバーに対する全デプロイメントでの JBossWS の無効化
- JBoss EAP サーバーを停止します。
- 編集するため、サーバー設定ファイルを開きます。スタンドアロンサーバーの場合には、これは
EAP_HOME/standalone/configuration/standalone.xml
ファイルです。管理対象ドメインの場合には、これはEAP_HOME/domain/configuration/domain.xml
ファイルです。 org.jboss.as.webservices
拡張を見つけ、コメントアウトまたは削除します。webservices
サブシステムプロファイルを見つけ、コメントアウトまたは削除します。- 以下は、
standalone.xml
ファイルに加えられた変更の例になります。<?xml version='1.0' encoding='UTF-8'?> <server xmlns="urn:jboss:domain:1.7"> <extensions> ... <!-- <extension module="org.jboss.as.webservices"/> --> ... </extensions> ... <profile> <!-- <subsystem xmlns="urn:jboss:domain:webservices:1.2"> <modify-wsdl-address>true</modify-wsdl-address> <wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host> <endpoint-config name="Standard-Endpoint-Config"/> <endpoint-config name="Recording-Endpoint-Config"> <pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM"> <handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/> </pre-handler-chain> </endpoint-config> <client-config name="Standard-Client-Config"/> </subsystem> --> ... </profile> ... </server>
3.2.7. JAX-RS および RESTEasy の変更
3.2.7.1. JAX-RS および RESTEasy の変更の設定
web.xml
ファイルから既存の RESTEasy 設定をすべて削除し、これを以下の 3 つのオプションのいずれかに置き換える必要があります。
- サブクラス
javax.ws.rs.core.Application
で、@ApplicationPath
アノテーションを使用します。これは最も簡単なオプションで、xml 設定は必要ありません。アプリケーションでjavax.ws.rs.core.Application
サブクラスに JAX-RS クラスを利用可能にするパスでアノテーションを付けるだけです。以下に例を示します。@ApplicationPath("/mypath") public class MyApplication extends Application { }
上記の例では、JAX-RS リソースはパス/MY_WEB_APP_CONTEXT/mypath/
で利用できます。注記パスは/mypath/*
ではなく、/mypath
として指定する必要があり ます。末尾に、スラッシュまたはアスタリスクは付けないでください。 - サブクラス
javax.ws.rs.core.Application
。web.xml
ファイルを使用して JAX-RS マッピングを設定します。@ApplicationPath
アノテーションを使用しない場合は、javax.ws.rs.core.Application
のサブクラスは依然として必要です。次に、web.xml
ファイルで JAX-RS マッピングを設定します。以下に例を示します。public class MyApplication extends Application { }
<servlet-mapping> <servlet-name>com.acme.MyApplication</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
上記の例では、JAX-RS リソースはパス/MY_WEB_APP_CONTEXT/hello
で利用できます。注記この方法を使用して、@ApplicationPath
アノテーションを使用して設定されたアプリケーションパスを上書きすることもできます。 web.xml
ファイルを変更します。サブクラスApplication
を使用しない場合は、以下のようにweb.xml
ファイルに JAX-RS マッピングを設定できます。<servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
上記の例では、JAX-RS リソースはパス/MY_WEB_APP_CONTEXT/hello
で利用できます。注記このオプションを選択した場合には、マッピングを追加するだけです。対応するサーブレットを追加する必要はありません。サーバーは対応するサーブレットを自動的に追加します。
3.2.8. LDAP セキュリティーレルムの変更
3.2.8.1. LDAP セキュリティーレルムの変更の設定
login-config.xml
ファイルの <application-policy>
要素に設定されました。JBoss EAP 6 では、LDAP セキュリティーレルムはサーバー設定ファイルの <security-domain>
要素に設定されます。スタンドアロンサーバーの場合、これは standalone/configuration/standalone.xml
ファイルになります。管理対象ドメインでサーバーを実行している場合は、domain/configuration/domain.xml
ファイルになります。
login-config.xml
ファイルの LDAP セキュリティーレルムの設定例です。
<application-policy name="mcp_ldap_domain"> <authentication> <login-module code="org.jboss.security.auth.spi.LdapExtLoginModule" flag="required"> <module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option> <module-option name="java.naming.security.authentication">simple</module-option> .... </login-module> </authentication> </application-policy>
<subsystem xmlns="urn:jboss:domain:security:1.2"> <security-domains> <security-domain name="mcp_ldap_domain" cache-type="default"> <authentication> <login-module code="org.jboss.security.auth.spi.LdapLoginModule" flag="required"> <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/> <module-option name="java.naming.security.authentication" value="simple"/> ... </login-module> </authentication> </security-domain> </security-domains> </subsystem>
<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>モジュールオプションは、以下のように "value=" の要素属性として指定する必要があります。
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
3.2.9. HornetQ の変更
3.2.9.1. HornetQ および NFS
- Red Hat Enterprise Linux NFS クライアントのキャッシュは無効にする必要があります。
libaio
がインストールされている必要があります。
3.2.9.2. 既存の JMS メッセージを JBoss EAP 6 に移行するような JMS ブリッジの設定
3.2.9.3. JMS ブリッジの作成
概要
JMS ブリッジはソースの JMS キューまたはトピックからメッセージを消費し、通常は異なるサーバーにあるターゲット JMS キューまたはトピックへ送信します。JMS 1.1 に準拠する JMS サーバーの間でメッセージをブリッジするために使用できます。送信元および宛先の JMS リソースは、JNDI を使用してルックアップされ、JNDI ルックアップのクライアントクラスはモジュールでバンドルされる必要があります。モジュール名は JMS ブリッジ設定で宣言されます。
手順3.22 JMS ブリッジの作成
- ソース JBoss EAP 5.x サーバーでのブリッジの設定リリース間のクラスで競合を回避するには、以下の手順にしたがって JBoss EAP 5.x で JMS ブリッジを設定する必要があります。SAR ディレクトリーおよびブリッジの名前は任意であり、必要に応じて変更できます。
- SAR を含む JBoss EAP 5 デプロイメントディレクトリーにサブディレクトリーを作成します(例:
EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
)。 EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
にMETA-INF
という名前のサブディレクトリーを作成します。EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF/
ディレクトリーにjboss-service.xml
ファイルを作成します。以下の例のような情報が含まれるはずです。<server> <loader-repository> com.example:archive=unique-archive-name <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> <!-- JBoss EAP 6 JMS Provider --> <mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider"> <attribute name="ProviderName">EnterpriseApplicationPlatform6JMSProvider</attribute> <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute> <attribute name="FactoryRef">jms/RemoteConnectionFactory</attribute> <attribute name="QueueFactoryRef">jms/RemoteConnectionFactory</attribute> <attribute name="TopicFactoryRef">jms/RemoteConnectionFactory</attribute> <attribute name="Properties"> java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.provider.url=remote://EnterpriseApplicationPlatform6host:4447 java.naming.security.principal=jbossuser java.naming.security.credentials=jbosspass </attribute> </mbean> <mbean code="org.jboss.jms.server.bridge.BridgeService" name="jboss.jms:service=Bridge,name=MyBridgeName" xmbean-dd="xmdesc/Bridge-xmbean.xml"> <depends optional-attribute-name="SourceProviderLoader">jboss.messaging:service=JMSProviderLoader,name=JMSProvider</depends> <depends optional-attribute-name="TargetProviderLoader">jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider</depends> <attribute name="SourceDestinationLookup">/queue/A</attribute> <attribute name="TargetDestinationLookup">jms/queue/test</attribute> <attribute name="QualityOfServiceMode">1</attribute> <attribute name="MaxBatchSize">1</attribute> <attribute name="MaxBatchTime">-1</attribute> <attribute name="FailureRetryInterval">60000</attribute> <attribute name="MaxRetries">-1</attribute> <attribute name="AddMessageIDInHeader">false</attribute> <attribute name="TargetUsername">jbossuser</attribute> <attribute name="TargetPassword">jbosspass</attribute> </mbean> </server>
注記SAR に分離されたクラスローダーが含まれるように、load-repository
要素が存在します。また、JNDI ルックアップとブリッジターゲットの両方に、パスワードが jbosspass のユーザー jbossuser のセキュリティークレデンシャルが含まれていることに注意してください。これは、JBoss EAP 6 はデフォルトでセキュアであるためです。パスワード「jbosspass」のユーザー「jbosspass」が、EAP_HOME/bin/add_user.sh
スクリプトを使用してguest
ロールで、ApplicationRealm
に作成されました。- 以下の JAR を
EAP_HOME/modules/system/layers/base/
ディレクトリーからEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
ディレクトリーにコピーします。各 VERSION_NUMBER は、JBoss EAP 6 ディストリビューションの実際のバージョン番号に置き換えます。org/hornetq/main/hornetq-core-VERSION_NUMBER.jar
org/hornetq/main/hornetq-jms-VERSION_NUMBER.jar
org/jboss/ejb-client/main/jboss-ejb-client-VERSION_NUMBER.jar
org/jboss/logging/main/jboss-logging-VERSION_NUMBER.jar
org/jboss/logmanager/main/jboss-logmanager-VERSION_NUMBER.jar
org/jboss/marshalling/main/jboss-marshalling-VERSION_NUMBER.jar
org/jboss/marshalling/river/main/jboss-marshalling-river-VERSION_NUMBER.jar
org/jboss/remote-naming/main/jboss-remote-naming-VERSION_NUMBER.jar
org/jboss/remoting3/main/jboss-remoting-VERSION_NUMBER.jar
org/jboss/sasl/main/jboss-sasl-VERSION_NUMBER.jar
org/jboss/netty/main/netty-VERSION_NUMBER.jar
org/jboss/remoting3/remote-jmx/main/remoting-jmx-VERSION_NUMBER.jar
org/jboss/xnio/main/xnio-api-VERSION_NUMBER.jar
org/jboss/xnio/nio/main.xnio-nio-VERSION_NUMBER.jar
注記javax API クラスは JBossEAP 5.x のクラスと競合するため、EAP_HOME/bin/client/jboss-client.jar
は単純にコピーしないでください。
- 宛先 JBoss EAP 6 サーバー上のブリッジの設定JBoss EAP 6.1 以降では、JMS ブリッジを使用して JMS 1.1 準拠のサーバーからメッセージをブリッジできます。ソースおよびターゲットの JMS リソースは JNDI を使用してルックアップされるため、ソースメッセージングプロバイダーまたはメッセージブローカーの JNDI ルックアップクラスを JBoss モジュールにバンドルする必要があります。次の手順では、架空の MyCustomMQ メッセージブローカーを例として使用します。
- メッセージプロバイダーの JBoss モジュールを作成します。
- 新しいモジュールの
EAP_HOME/modules/system/layers/base/
の下にディレクトリー構造を作成します。main/
サブディレクトリーには、クライアント JAR およびmodule.xml
ファイルが含まれます。MyCustomMQ メッセージングプロバイダー用に作成されたディレクトリー構造の例:EAP_HOME/modules/system/layers/base/org/mycustommq/main/
main/
サブディレクトリーで、メッセージングプロバイダーのモジュール定義が含まれるmodule.xml
ファイルを作成します。MyCustomMQ メッセージングプロバイダー用に作成されたmodule.xml
の例を以下に示します。<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="org.mycustommq"> <properties> <property name="jboss.api" value="private"/> </properties> <resources> <!-- Insert resources required to connect to the source or target --> <resource-root path="mycustommq-1.2.3.jar" /> <resource-root path="mylogapi-0.0.1.jar" /> </resources> <dependencies> <!-- Add the dependencies required by JMS Bridge code --> <module name="javax.api" /> <module name="javax.jms.api" /> <module name="javax.transaction.api"/> <!-- Add a dependency on the org.hornetq module since we send --> <!-- messages tothe HornetQ server embedded in the local EAP instance --> <module name="org.hornetq" /> </dependencies> </module>
- ソースリソースの JNDI ルックアップに必要なメッセージングプロバイダー JAR をモジュールの
main/
サブディレクトリーにコピーします。MyCustomMQ モジュールのディレクトリー構造は以下のようになります。modules/ `-- system `-- layers `-- base `-- org `-- mycustommq `-- main |-- mycustommq-1.2.3.jar |-- mylogapi-0.0.1.jar |-- module.xml
- JBoss EAP 6 サーバーの
messaging
サブシステムで JMS ブリッジを設定します。- 開始する前に、サーバーを停止し、現在のサーバー設定ファイルをバックアップします。スタンドアロンサーバーを実行している場合は、これは
EAP_HOME/standalone/configuration/standalone-full-ha.xml
ファイルです。管理対象ドメインを実行している場合は、EAP_HOME/domain/configuration/domain.xml
ファイルとEAP_HOME/domain/configuration/host.xml
ファイルの両方をバックアップします。 jms-bridge
要素をサーバー設定ファイルのmessaging
サブシステムに追加します。source
要素およびtarget
要素は、JNDI ルックアップに使用される JMS リソースの名前を提供します。ユーザー
とパスワード
の認証情報が指定されている場合は、JMS 接続の作成時に引数として渡されます。MyCustomMQ メッセージングプロバイダーに設定されたjms-bridge
要素の例を以下に示します。<subsystem xmlns="urn:jboss:domain:messaging:1.3"> ... <jms-bridge name="myBridge" module="org.mycustommq"> <source> <connection-factory name="ConnectionFactory"/> <destination name="sourceQ"/> <user>user1</user> <password>pwd1</password> <context> <property key="java.naming.factory.initial" value="org.mycustommq.jndi.MyCustomMQInitialContextFactory"/> <property key="java.naming.provider.url" value="tcp://127.0.0.1:9292"/> </context> </source> <target> <connection-factory name="java:/ConnectionFactory"/> <destination name="/jms/targetQ"/> </target> <quality-of-service>DUPLICATES_OK</quality-of-service> <failure-retry-interval>500</failure-retry-interval> <max-retries>1</max-retries> <max-batch-size>500</max-batch-size> <max-batch-time>500</max-batch-time> <add-messageID-in-header>true</add-messageID-in-header> </jms-bridge> </subsystem>
上記の例では、JNDI プロパティーはソース
のコンテキスト
要素で定義されています。上記のtarget
の例のように、context
要素を省略すると、JMS リソースはローカルインスタンスでルックアップされます。
3.2.9.4. HornetQ を JMS プロバイダーとして使用するためのアプリケーションの移行
前提条件
- クライアントとサーバーをシャットダウンしておく。
- JBoss Messaging データのバックアップコピーを作成しておく。メッセージデータは、
JBM_
で始まるテーブルのデータベースに保存されます。
手順3.23 プロバイダーを HornetQ に変更します。
- 設定を転送します。既存の JBoss Messaging 設定を JBoss EAP 6 設定に転送します。以下の設定は、JBoss Messaging サーバー上のデプロイメント記述子にあります。
- 接続ファクトリーサービスの設定この設定では、JBoss Messaging サーバーでデプロイされた JMS 接続ファクトリーを記述します。JBoss Messaging は、アプリケーションサーバーのデプロイメントディレクトリーにある
connection-factories-service.xml
という名前のファイルに接続ファクトリーを設定します。 - 宛先設定この設定では、JBoss Messaging サーバーでデプロイされた JMS キューとトピックについて記述します。デフォルトでは、JBoss Messaging は、アプリケーションサーバーのデプロイメントディレクトリーにある
destinations-service.xml
という名前のファイルに宛先を設定します。 - メッセージブリッジサービスの設定この設定には、JBoss Messaging サーバーでデプロイされたブリッジサービスが含まれます。デフォルトではブリッジはデプロイされないため、デプロイメントファイルの名前は JBoss Messaging のインストールによって異なります。
- アプリケーションコードを変更します。アプリケーションコードで標準の JMS を使用する場合は、コードの変更は必要ありません。ただし、 「移植可能な EJB JNDI 名」 セクションで説明されているように、新しい標準化された JNDI 名前空間を使用するため、アプリケーションを変更する必要があります。アプリケーションが JBoss Messaging 固有の機能を使用する場合は、HornetQ で利用可能な同等の機能を使用するように、コードを変更する必要があります。以下は、
InitialContext
を作成し、JBoss EAP 6 でキューを検索する JMS クライアントの例です。Hashtable<String, String> env = new Hashtable<String, String>(); String providerUrl = "remote:" + host + ":" + port; env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); env.put("java.naming.factory.initial", "org.jboss.naming.remote.client.InitialContextFactory"); env.put("java.naming.provider.url", providerUrl); env.put(Context.SECURITY_PRINCIPAL, user); env.put(Context.SECURITY_CREDENTIALS, pass); InitialContext context = new InitialContext(env); Queue myTestQueue = (Queue) context.lookup("jms/queue/myTestQueue");
アプリケーションがクラスターに接続する場合は、クラスタリングセマンティクスで HornetQ のドキュメントを慎重に確認する必要があります。クラスタリングは JMS 仕様の範囲外で、HornetQ と JBoss Messaging はクラスタリング機能の実装ごとに大きく異なるアプローチをとっていました。HornetQ でメッセージングを設定する方法は、以下を参照してください。 「HornetQ でのメッセージングの設定」 - 既存のメッセージを移行します。JMS ブリッジを使用して、JBoss Messaging データベースのメッセージを HornetQ ジャーナルに移動します。JMS ブリッジの設定手順は、 「既存の JMS メッセージを JBoss EAP 6 に移行するような JMS ブリッジの設定」 を参照してください。
3.2.9.5. HornetQ でのメッセージングの設定
standalone.xml
または domain.xml
設定ファイルを手動で編集しなくても、これらの管理ツールのいずれかで永続的な変更を行うことができます。ただし、デフォルトの設定ファイルのメッセージングコンポーネントを理解すると便利です。ここでは、管理ツールを使用したドキュメントの例では、参照用の設定ファイルスニペットが提供されます。
3.2.9.6. JMS 宛先の移行
jbossmq-destinations-service.xml
または destination-service. xml
ファイルの <mbeans>
要素に設定されていました。JBoss EAP 6 では JBoss Messaging が HornetQ に置き換えられたため、JMS 宛先はサーバー設定ファイルの messaging
サブシステムに設定されるようになりました。
例3.3 JBoss EAP 4.2 宛先設定の例
jbossmq-destinations-service.xml
ファイルに設定された JBoss MQ 宛先の例になります。JNDIName
属性が指定されていない場合、値はデフォルトで例に示されている名前に設定されます。
<mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=DLQ"> <!-- The following JNDIName attribute shows the default JNDI binding name --> <attribute name="JNDIName">queue/DLQ</attribute> <depends optional-attribute-name="DestinationManager"> jboss.mq:service=DestinationManager </depends> </mbean> <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=ExpiryQueue"> <!-- The following JNDIName attribute shows the default JNDI binding name --> <attribute name="JNDIName">queue/ExpiryQueue</attribute> <depends optional-attribute-name="DestinationManager"> jboss.mq:service=DestinationManager </depends> </mbean>
例3.4 JBoss EAP 5 宛先設定の例
-service.xml ファイルに設定された JBoss Messaging 宛先の例になります。
JNDIName
attribute
が指定されていない場合、値はデフォルトで例に示されている名前に設定されます。
<mbean code="org.jboss.jms.server.destination.QueueService" name="jboss.messaging.destination:service=Queue,name=DLQ" xmbean-dd="xmdesc/Queue-xmbean.xml"> <!-- The following JNDIName attribute shows the default JNDI binding name --> <attribute name="JNDIName">queue/DLQ</attribute> <depends optional-attribute-name="ServerPeer"> jboss.messaging:service=ServerPeer </depends> <depends> jboss.messaging:service=PostOffice </depends> </mbean> <mbean code="org.jboss.jms.server.destination.QueueService" name="jboss.messaging.destination:service=Queue,name=ExpiryQueue" xmbean-dd="xmdesc/Queue-xmbean.xml"> <!-- The following JNDIName attribute shows the default JNDI binding name --> <attribute name="JNDIName">queue/ExpiryQueue</attribute> <depends optional-attribute-name="ServerPeer"> jboss.messaging:service=ServerPeer </depends> <depends> jboss.messaging:service=PostOffice </depends> </mbean>
例3.5 JBoss EAP 6 宛先設定の例
messaging
サブシステムで設定された JMS 宛先の例になります。JBoss EAP 6 では、entry
要素はキューを JNDI にバインドするために使用される名前を設定します。
<subsystem xmlns="urn:jboss:domain:messaging:1.4"> <hornetq-server> ... <jms-destinations> <jms-queue name="ExpiryQueue"> <entry name="java:/jms/queue/ExpiryQueue"/> </jms-queue> <jms-queue name="DLQ"> <entry name="java:/jms/queue/DLQ"/> </jms-queue> </jms-destinations> </hornetq-server> </subsystem>
3.2.10. クラスタリングの変更
3.2.10.1. クラスタリング向けにアプリケーションに変更を加える。
クラスタリングが有効な状態で JBoss EAP 6 を起動
JBoss EAP 5.x でクラスタリングを有効にするには、all
プロファイルまたはその派生を使用してサーバーインスタンスを起動する必要があります。$ EAP5_HOME/bin/run.sh -c all
JBoss EAP 6 では、クラスタリングを有効にする方法は、サーバーがスタンドアロンか、管理対象ドメインで実行されているかによって異なります。管理対象ドメインで稼働しているサーバーのクラスター化の有効化
ドメインコントローラーを使用して起動されたサーバーのクラスター化を有効にするには、domain.xml
を更新し、ha
プロファイルとha-sockets
ソケットバインディンググループを使用するようにサーバーグループを指定します。以下に例を示します。<server-groups> <server-group name="main-server-group" profile="ha"> <jvm name="default"> <heap size="64m" max-size="512m"/> </jvm> <socket-binding-group ref="ha-sockets"/> </server-group> </server-group>
スタンドアロンサーバーのクラスター化の有効化
スタンドアロンサーバーでクラスター化を有効にするには、以下のように適切な設定ファイルを使用してサーバーを起動します。$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME
バインドアドレスを指定します。
JBoss EAP 5.x では、通常、以下のように-b
コマンドライン引数を使用してクラスタリングに使用されるバインドアドレスを指定します。$ EAP5_HOME/bin/run.sh -c all -b 192.168.0.2
JBoss EAP 6 は、standalone.xml
ファイル、domain.xml
ファイル、およびhost.xml
ファイルの<interfaces>
要素に含まれる IP アドレスとインターフェースにソケットをバインドします。JBoss EAP に同梱される標準設定には、2 つのインターフェース設定が含まれています。<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:127.0.0.1}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:127.0.0.1}"/> </interface> </interfaces>
これらのインターフェース設定では、システムプロパティーjboss.bind.address.management
およびjboss.bind.address
の値を使用します。これらのシステムプロパティーが設定されていない場合は、デフォルトの127.0.0.1
が各値に使用されます。また、サーバーの起動時にバインドアドレスをコマンドライン引数として指定したり、JBoss EAP 6 サーバー設定ファイル内で明示的に定義したりできます。- JBoss EAP スタンドアロンサーバーの起動時にコマンドラインで bind 引数を指定します。以下は、スタンドアロンサーバーのコマンドラインでバインドアドレスを指定する方法の例になります。
EAP_HOME/bin/standalone.sh -Djboss.bind.address=127.0.0.1
注記-b
のショートカットである-Djboss.bind.address=127.0.0.1
引数を使用することもできます。EAP_HOME/bin/standalone.sh -b=127.0.0.1
JBoss EAP 5 構文の形式は引き続きサポートされます。EAP_HOME/bin/standalone.sh -b 127.0.0.1
-b
引数は、パブリック
インターフェースのみを変更することに注意してください。管理
インターフェースには影響しません。 - サーバー設定ファイルにバインドアドレスを指定します。管理対象ドメインで実行されているサーバーの場合は、
domain/configuration/host.xml
ファイルにバインドアドレスを指定します。スタンドアロンサーバーの場合は、standalone-ha.xml
ファイルにバインドアドレスを指定します。以下の例では、public
インターフェースはha-sockets
ソケットバインディンググループ内のすべてのソケットのデフォルトインターフェースとして指定されます。<interfaces> <interface name="management"> <inet-address value="192.168.0.2"/> </interface> <interface name="public"> <inet-address value="192.168.0.2"/> </interface> </interfaces>
<socket-binding-groups> <socket-binding-group name="ha-sockets" default-interface="public"> <!-- ... --> </socket-binding-group> </socket-binding-groups>
注記設定ファイルのシステムプロパティーではなく、ハードコーディングされた値としてバインドアドレスを指定した場合、コマンドラインの引数で上書きすることはできません。
mod_jk および mod_proxy をサポートする
jvmRoute
の設定JBoss EAP 5 では、Web サーバーjvmRoute
はserver.xml
ファイルのプロパティーを使用して設定されます。JBoss EAP 6 では、以下のようにinstance-id
属性を使用してサーバー設定ファイルの web サブシステムにjvmRoute
属性が設定されます。<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="{JVM_ROUTE_SERVER}">
上記の {JVM_ROUTE_SERVER} は jvmRoute サーバー ID に置き換える必要があります。instance-id
は、管理コンソールを使用して設定することもできます。マルチキャストアドレスおよびポートの指定
JBoss EAP 5.x では、以下のようにコマンドライン引数-u
および-m
を使用して、クラスター内通信に使用されるマルチキャストアドレスおよびポートを指定できます。$ EAP5_HOME/bin/run.sh -c all -u 228.11.11.11 -m 45688
JBoss EAP 6 では、クラスター内通信に使用されるマルチキャストアドレスとポートは、以下のように関連する JGroups プロトコルスタックによって参照されるソケットバインディングによって定義されます。<subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp"> <stack name="udp"> <transport type="UDP" socket-binding="jgroups-udp"/> <!-- ... --> </stack> </subsystem>
<socket-binding-groups> <socket-binding-group name="ha-sockets" default-interface="public"> <!-- ... --> <socket-binding name="jgroups-udp" port="55200" multicast-address="228.11.11.11" multicast-port="45688"/> <!-- ... --> </socket-binding-group> </socket-binding-groups>
コマンドラインでマルチキャストアドレスとポートを指定する場合は、マルチキャストアドレスとポートをシステムプロパティーとして定義し、サーバーの起動時にコマンドラインでこれらのプロパティーを使用できます。以下の例では、jboss.mcast.addr
はマルチキャストアドレスの変数名で、jboss.mcast.port
はポートの変数名です。<socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.mcast.addr:230.0.0.4}" multicast-port="${jboss.mcast.port:45688}"/>
次に、以下のコマンドライン引数を使用してサーバーを起動できます。$ EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688
別のプロトコルスタックを使用する
JBoss EAP 5.x では、jboss.default.jgroups.stack
システムプロパティーを使用して、すべてのクラスタリングサービスに使用されるデフォルトのプロトコルスタックを操作できます。$ EAP5_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcp
JBoss EAP 6 では、デフォルトのプロトコルスタックはdomain.xml
またはstandalone-ha.xml
内の JGroups サブシステムによって定義されます。<subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp"> <stack name="udp"> <!-- ... --> </stack> </subsystem>
バウンドレプリケーションの置き換え
JBoss EAP 5.x では JBoss Cache Buddy Replication を使用して、クラスターのすべてのインスタンスへのデータのレプリケーションが抑制されました。JBoss EAP 6 では、Buddy Replication は Infinispan の分散キャッシュ(DIST
モードとも呼ばれる)に置き換えられました。Distribution(分散)は強力なクラスタリングモードで、より多くのサーバーがクラスターに追加されるため、Infinispan は直線的にスケーリングできます。以下は、DIST キャッシュモードを使用するようにサーバーを設定する方法の例になります。- コマンドラインを開き、HA または Full Profile のいずれかでサーバーを起動します。以下に例を示します。
EAP_HOME/bin/standalone.sh -c standalone-ha.xml
- 別のコマンドラインを開き、管理 CLI に接続します。
- Linux の場合は、コマンドラインで以下を入力します。
$ EAP_HOME/bin/jboss-cli.sh --connect
- Windows の場合は、コマンドラインで以下を入力します。
C:\>EAP_HOME\bin\jboss-cli.bat --connect
次の応答が表示されるはずです。Connected to standalone controller at localhost:9999
- 以下のコマンドを実行してキャッシュを設定し、新しい設定をリロードするようにサーバーに指示を出します。
/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist) /subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=3) reload
各コマンドの後に以下の応答が表示されるはずです。"outcome" => "success"
これらのコマンドは、以下のようにstandalone-ha.xml
ファイルのinfinispan
サブシステムのdist
<distributed-cache>
要素を変更します。<cache-container>
<cache-container name="web" aliases="standard-session-cache" default-cache="dist" module="org.jboss.as.clustering.web.infinispan"> <transport lock-timeout="60000"/> <replicated-cache name="repl" mode="ASYNC" batching="true"> <file-store/> </replicated-cache> <replicated-cache name="sso" mode="SYNC" batching="true"/> <distributed-cache name="dist" owners="3" l1-lifespan="0" mode="ASYNC" batching="true"> <file-store/> </distributed-cache> </cache-container>
詳細は、カスタマーポータル https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4 の JBoss EAP 6 の 『『開発ガイド』』 の「 『Web アプリケーションでのクラスタリング』 」の章を参照してください。
3.2.10.2. HA シングルトンの実装
概要
以下の手順は、SingletonService デコレーターでラップされ、クラスター全体のシングルトンサービスとして使用されるサービスをデプロイする方法を示しています。サービスはスケジュールされたタイマーを有効にします。これはクラスター内で 1 回のみ起動します。
手順3.24 HA シングルトンサービスの実装
- HA シングルトンサービスアプリケーションを記述します。以下は、シングルトンサービスとしてデプロイされる
SingletonService
デコレーターでラップされるサービスの簡単な例です。完全な例は、Red Hat JBoss Enterprise Application Platform 6 に同梱される
cluster-ha-singleton
クイックスタートにあります。このクイックスタートには、アプリケーションをビルドおよびデプロイするためのすべての手順が含まれます。- サービスを作成します。サービスの例を以下に示します。
package org.jboss.as.quickstarts.cluster.hasingleton.service.ejb; import java.util.Date; import java.util.concurrent.atomic.AtomicBoolean; import javax.naming.InitialContext; import javax.naming.NamingException; import org.jboss.logging.Logger; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StartException; import org.jboss.msc.service.StopContext; /** * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a> */ public class HATimerService implements Service<String> { private static final Logger LOGGER = Logger.getLogger(HATimerService.class); public static final ServiceName SINGLETON_SERVICE_NAME = ServiceName.JBOSS.append("quickstart", "ha", "singleton", "timer"); /** * A flag whether the service is started. */ private final AtomicBoolean started = new AtomicBoolean(false); /** * @return the name of the server node */ public String getValue() throws IllegalStateException, IllegalArgumentException { LOGGER.infof("%s is %s at %s", HATimerService.class.getSimpleName(), (started.get() ? "started" : "not started"), System.getProperty("jboss.node.name")); return ""; } public void start(StartContext arg0) throws StartException { if (!started.compareAndSet(false, true)) { throw new StartException("The service is still started!"); } LOGGER.info("Start HASingleton timer service '" + this.getClass().getName() + "'"); final String node = System.getProperty("jboss.node.name"); try { InitialContext ic = new InitialContext(); ((Scheduler) ic.lookup("global/jboss-cluster-ha-singleton-service/SchedulerBean!org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.Scheduler")).initialize("HASingleton timer @" + node + " " + new Date()); } catch (NamingException e) { throw new StartException("Could not initialize timer", e); } } public void stop(StopContext arg0) { if (!started.compareAndSet(true, false)) { LOGGER.warn("The service '" + this.getClass().getName() + "' is not active!"); } else { LOGGER.info("Stop HASingleton timer service '" + this.getClass().getName() + "'"); try { InitialContext ic = new InitialContext(); ((Scheduler) ic.lookup("global/jboss-cluster-ha-singleton-service/SchedulerBean!org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.Scheduler")).stop(); } catch (NamingException e) { LOGGER.error("Could not stop timer", e); } } } }
サービス
をクラスター化されたシングルトンとしてインストールする activator を作成します。以下のリストは、HATimerService
をクラスター化されたシングルトンサービスとしてインストールする Service Activator の例です。package org.jboss.as.quickstarts.cluster.hasingleton.service.ejb; import org.jboss.as.clustering.singleton.SingletonService; import org.jboss.logging.Logger; import org.jboss.msc.service.DelegatingServiceContainer; import org.jboss.msc.service.ServiceActivator; import org.jboss.msc.service.ServiceActivatorContext; import org.jboss.msc.service.ServiceController; /** * Service activator that installs the HATimerService as a clustered singleton service * during deployment. * * @author Paul Ferraro */ public class HATimerServiceActivator implements ServiceActivator { private final Logger log = Logger.getLogger(this.getClass()); @Override public void activate(ServiceActivatorContext context) { log.info("HATimerService will be installed!"); HATimerService service = new HATimerService(); SingletonService<String> singleton = new SingletonService<String>(service, HATimerService.SINGLETON_SERVICE_NAME); /* * To pass a chain of election policies to the singleton, for example, * to tell JGroups to prefer running the singleton on a node with a * particular name, uncomment the following line: */ // singleton.setElectionPolicy(new PreferredSingletonElectionPolicy(new SimpleSingletonElectionPolicy(), new NamePreference("node1/singleton"))); singleton.build(new DelegatingServiceContainer(context.getServiceTarget(), context.getServiceRegistry())) .setInitialMode(ServiceController.Mode.ACTIVE) .install() ; } }
注記上記の例は、JBoss EAP プライベート API の一部であるorg.jboss.as.clustering.singleton.SingletonService
クラスを使用します。パブリック API は JBoss EAP 7 リリースで利用でき、プライベートクラスは非推奨になりましたが、これらのクラスは JBoss EAP 6.x リリースサイクルの間維持および利用可能になります。- ServiceActivator ファイルの作成アプリケーションの
resources/META-INF/services/
ディレクトリーにorg.jboss.msc.service.ServiceActivator
という名前のファイルを作成します。直前の手順で作成した ServiceActivator クラスの完全修飾名が含まれる行を追加します。org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.HATimerServiceActivator
- クラスター全体のシングルトンタイマーとして使用するタイマーを実装するシングルトン Bean を作成します。このシングルトン Bean はリモートインターフェースを持たないため、アプリケーションの別の EJB からローカルインターフェースを参照しないでください。これにより、クライアントまたは他のコンポーネントによるルックアップが阻止され、SingletonService がシングルトンを完全に制御できるようになります。
- Scheduler インターフェースの作成
package org.jboss.as.quickstarts.cluster.hasingleton.service.ejb; /** * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a> */ public interface Scheduler { void initialize(String info); void stop(); }
- クラスター全体のシングルトンタイマーを実装するシングルトン Bean を作成します。
package org.jboss.as.quickstarts.cluster.hasingleton.service.ejb; import javax.annotation.Resource; import javax.ejb.ScheduleExpression; import javax.ejb.Singleton; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerConfig; import javax.ejb.TimerService; import org.jboss.logging.Logger; /** * A simple example to demonstrate a implementation of a cluster-wide singleton timer. * * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a> */ @Singleton public class SchedulerBean implements Scheduler { private static Logger LOGGER = Logger.getLogger(SchedulerBean.class); @Resource private TimerService timerService; @Timeout public void scheduler(Timer timer) { LOGGER.info("HASingletonTimer: Info=" + timer.getInfo()); } @Override public void initialize(String info) { ScheduleExpression sexpr = new ScheduleExpression(); // set schedule to every 10 seconds for demonstration sexpr.hour("*").minute("*").second("0/10"); // persistent must be false because the timer is started by the HASingleton service timerService.createCalendarTimer(sexpr, new TimerConfig(info, false)); } @Override public void stop() { LOGGER.info("Stop all existing HASingleton timers"); for (Timer timer : timerService.getTimers()) { LOGGER.trace("Stop HASingleton timer: " + timer.getInfo()); timer.cancel(); } } }
- クラスタリングを有効にして各 JBoss EAP 6 インスタンスを起動します。スタンドアロンサーバーでクラスター化を有効にするには、各インスタンスの一意のノード名とポートオフセットを使用して、
HA
プロファイルで各サーバーを起動する必要があります。- Linux の場合は、以下のコマンド構文を使用してサーバーを起動します。
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
例3.6 Linux で複数のスタンドアロンサーバーを起動する
$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node1 $ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
- Microsoft Windows の場合は、以下のコマンド構文を使用してサーバーを起動します。
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
例3.7 Microsoft Windows で複数のスタンドアロンサーバーを起動する
C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node1 C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
注記コマンドライン引数を使用しない場合は、各サーバーインスタンスのstandalone-ha.xml
ファイルを設定して、別のインターフェースにバインドすることができます。 - サーバーのアプリケーションのデプロイ以下の Maven コマンドは、デフォルトポートで実行しているスタンドアロンサーバーにアプリケーションをデプロイします。
mvn clean install jboss-as:deploy
追加のサーバーにデプロイするには、サーバー名を渡します。別のホストにある場合は、ホスト名とポート番号をコマンドラインに渡します。mvn clean package jboss-as:deploy -Djboss-as.hostname=localhost -Djboss-as.port=10099
Maven の設定やデプロイメントの詳細については、JBoss EAP 6 に同梱されるcluster-ha-singleton
クイックスタートを参照してください。
3.2.11. サービススタイルのデプロイメントの変更
3.2.11.1. サービススタイルのデプロイメントを使用するアプリケーションの更新
概要
MBean は、以前のバージョンの Red Hat JBoss Enterprise Application Platform のコアアーキテクチャーの一部でした。JBoss 固有の jboss-service.xml
および jboss-beans.xml
サービススタイル記述子を使用する JBoss Service Archive(SAR)デプロイメントは、JBoss Beans に基づいて MBean を作成するためにアプリケーションサーバーによって使用されるものです。内部アーキテクチャーは JBoss EAP 6 で変更になり、MBean JMX アーキテクチャーを基にしなくなります。MBean はコアアーキテクチャーの一部ではなくなりました。管理 API のラッパーになりました。
jboss-service.xml
ファイルで定義された他の MBean のみです。
サービススタイルのデプロイメントを @Singleton に置き換えます。
以前のバージョンの JBoss EAP で使用されていた JBoss Service Archive(SAR)およびサービススタイル記述子は Java EE 6 仕様の一部ではないため、JBoss EAP 6 で使用することは推奨されません。アプリケーションを Java EE 6 仕様に変更することが推奨されます。MBean シングルトンの場合は、JBoss EAP プロプライエタリーの *-beans.xml
ファイルおよび *-service.xml
ファイルの代わりに移植可能な Java EE 6 @Singleton
を使用するようにコードを変更する必要があります。MBean サービスの作成およびデプロイに関する詳細は、カスタマーポータル https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4 の 『JBoss EAP 6 の 『『開発ガイド』』 の「JBoss MBean』 サービス」の章を参照してください。
サービススタイルの記述子の変更
標準の Java EE 6 EJB @Singleton
を使用するためにコードを変更しない場合、JBoss EAP 5 と JBoss EAP 6 の間で jboss-beans.xml
ファイルおよび jboss-service.xml
ファイルが変更されたことに注意してください。
-
jboss-beans.xml
ファイルの XML 宣言は JBoss EAP 5 と JBoss EAP 6 との間で変更になりました。 - 以下は、JBoss EAP 5 の
jboss-beans.xml
ファイルの例になります。<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" xmlns="urn:jboss:bean-deployer:2.0"> <bean name="TestServantBean" class="org.jboss.test.iiop.jbpapp6462.servant.TestServantBean"/> </deployment>
以下は、JBoss EAP 6 のjboss-beans.xml
ファイルの例になります。<deployment xmlns="urn:jboss:pojo:7.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:pojo:7.0 jboss-mc_7_0.xsd"> ... <bean name="Bean"> <alias>Alias-Bean</alias> <constructor factory-class="org.jboss.as.test.integration.pojo.support.TFactory" factory-method="createBean"> <parameter><value>test</value></parameter> </constructor> <property name="injectee"><inject bean="Injectee"/></property> <start> <parameter><value>start</value></parameter> </start> <stop> <parameter><value>stop</value></parameter> </stop> <install method="install" state="CREATE"> <parameter><value>install</value></parameter> </install> <install bean="Alias-Injectee" method="sayHello"> <parameter><value>from-other-bean</value></parameter> </install> </bean> </deployment>
- JBoss EAP 5 と JBoss EAP 6 の間で
jboss-service.xml
ファイルの DTD が変更になりました。 - 以下は、JBoss EAP 5 の
jboss-service.xml
ファイルの例になります。<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE server PUBLIC "-//JBoss//DTD MBean Service 5.0//EN" "http://www.jboss.org/j2ee/dtd/jboss-service_5_0.dtd"> <server> ... </server>
以下は、JBoss EAP 6 のjboss-service.xml
ファイルの例になります。<server xmlns="urn:jboss:service:7.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:service:7.0 jboss-service_7_0.xsd"> <mbean name="jboss.test:service=testdeployments" code="org.jboss.as.test.integration.mgmt.access.deployment.sar.Simple"/> </server>
3.2.12. リモート呼び出しの変更
3.2.12.1. リモート呼び出しを JBoss EAP 6 に作成する JBoss EAP 5 のデプロイされたアプリケーションの移行
概要
JBoss EAP 5 では、EJB リモートインターフェースは JNDI でバインドされ、デフォルトではローカルインターフェースの EJB_NAME/local
でバインドされ、リモートインターフェースの EJB_NAME/remote
がバインドされました。その後、クライアントアプリケーションは、EJB_NAME/remote
を使用して Bean を検索しました。
ejb:
BEAN_REFERENCE を使用するよう既存のコードを変更できます。
ejb:
BEAN_REFERENCE 構文は以下のようになります。
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>ステートフル Bean の場合、
ejb:
BEAN_REFERENCE 構文は以下のようになります。
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful
<app-name>
- デプロイされた EJB のアプリケーション名。通常、これは .ear 接尾辞のない ear 名ですが、名前は application.xml ファイルで上書きできます。アプリケーションが .ear としてデプロイされていない場合、この値は空の文字列になります。この例では EAR としてデプロイされていないことを仮定します。<module-name>
- サーバーにデプロイされた EJB のモジュール名。これは通常、.jar サフィックスのない EJB デプロイメントの jar 名ですが、ejb-jar.xml を使用して上書きできます。この例では、EJB が jboss-ejb-remote-app.jar にデプロイされたことを仮定するため、モジュール名は jboss-ejb-remote-app になります。<distinct-name>
- EJB の任意の一意の名前。この例では、別の名前を使用しないため、空の文字列を使用します。<bean-name>
- デフォルトでは、Bean 実装クラスのシンプルなクラス名です。<fully-qualified-classname-of-the-remote-interface>
- リモートビューの完全修飾クラス名。
クライアントコードの更新
以下のクライアントコードの例では、以下のステートレス EJB を JBoss EAP 6 サーバーにデプロイしていることを前提としています。@Remote
アノテーションを使用して Bean のリモートビューを公開することに注意してください。
例3.8 ステートレスセッション Bean コードの例
@Stateless @Remote(RemoteCalculator.class) public class CalculatorBean implements RemoteCalculator { @Override public int add(int a, int b) { return a + b; } @Override public int subtract(int a, int b) { return a - b; } }
InitialContext
を作成し、EJB を検索しました。
例3.9 JBoss EAP 5 クライアントの例
InitialContext ctx = new InitialContext(); RemoteCalculator calculator = (RemoteCalculator) ctx.lookup("CalculatorBean/remote"); int a = 204; int b = 340; int sum = calculator.add(a, b);
Hashtable
を作成し、Bean 参照のプロパティーを設定します。以下は、クライアントルックアップおよび呼び出しの例です。
例3.10 JBoss EAP 6 のステートレスクライアントの例
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties); final String appName = ""; final String moduleName = "jboss-ejb-remote-app"; final String distinctName = ""; final String beanName = CalculatorBean.class.getSimpleName(); final String viewClassName = RemoteCalculator.class.getName(); final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName); int a = 204; int b = 340; int sum = statelessRemoteCalculator.add(a, b);
例3.11 JBoss EAP 6 のステートフルクライアントの例
final RemoteCalculator statefulRemoteCalculator = (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")
3.2.12.2. JNDI を使用したリモートによるセッション Bean の呼び出し
ejb-remote
クイックスタートには、この機能を実証する作業用の Maven プロジェクトが含まれています。クイックスタートには、デプロイするセッション Bean とリモートクライアントの両方用のプロジェクトが含まれます。以下のコードサンプルは、リモートクライアントプロジェクトから取得されます。
前提条件
- 使用できる Maven プロジェクトがすでに作成されている必要があります。
- JBoss EAP 6 Maven リポジトリーの設定はすでに追加されています。
- 呼び出すセッション Bean はすでにデプロイされています。
- デプロイされたセッション Bean はリモートビジネスインターフェースを実装します。
- セッション Bean のリモートビジネスインターフェースは、Maven 依存関係として利用できます。リモートビジネスインターフェースが JAR ファイルとしてのみ利用できる場合は、JAR を Maven リポジトリーにアーティファクトとして追加することが推奨されます。方向については、install:install-file ゴールの Maven ドキュメントを参照してください。 http://maven.apache.org/plugins/maven-install-plugin/usage.html
- セッション Bean をホストするサーバーのホスト名および JNDI ポートを知っている必要があります。
手順3.25 セッション Bean のリモート呼び出しに対する Maven プロジェクト設定の追加
- 必要なプロジェクト依存関係の追加プロジェクトの
pom.xml
を更新して、必要な依存関係が含まれるようにする必要があります。 jboss-ejb-client.properties
ファイルの追加JBoss EJB クライアント API は、JNDI サービスの接続情報が含まれるjboss-ejb-client.properties
という名前のプロジェクトのルートでファイルを検索することを想定します。以下の内容を含む、このファイルをプロジェクトのsrc/main/resources/
ディレクトリーに追加します。# In the following line, set SSL_ENABLED to true for SSL remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default # Uncomment the following line to set SSL_STARTTLS to true for SSL # remote.connection.default.connect.options.org.xnio.Options.SSL_STARTTLS=true remote.connection.default.host=localhost remote.connection.default.port = 4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false # Add any of the following SASL options if required # remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false # remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false # remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
サーバーに合わせてホスト名とポートを変更します。4447
はデフォルトのポート番号です。セキュアな接続の場合は、SSL_ENABLED
行をtrue
に設定し、SSL_STARTTLS
行のコメントを解除します。コンテナーの Remoting インターフェースは、同じポートを使用したセキュアな接続およびセキュアでない接続をサポートします。- リモートビジネスインターフェースの依存関係の追加セッション Bean のリモートビジネスインターフェースの
pom.xml
に Maven 依存関係を追加します。<dependency> <groupId>org.jboss.as.quickstarts</groupId> <artifactId>jboss-ejb-remote-server-side</artifactId> <type>ejb-client</type> <version>${project.version}</version> </dependency>
手順3.26 JNDI と Bean の Invoke メソッドを使用した Bean プロキシーの取得
- チェックされた例外の処理以下のコード(
InitialContext()
およびlookup()
)で使用される 2 つのメソッドには、javax.naming.NamingException
型のチェック済み例外があります。これらのメソッド呼び出しは、NamingException
をキャッチする try/catch ブロック、またはNamingException
のスローに宣言されているメソッドに囲む必要があります。ejb-remote
クイックスタートは 2 番目の手法を使用します。 - JNDI コンテキストの作成JNDI Context オブジェクトは、サーバーからリソースを要求するメカニズムを提供します。以下のコードを使用して JNDI コンテキストを作成します。
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);
JNDI サービスの接続プロパティーはjboss-ejb-client.properties
ファイルから読み込まれます。 - JNDI コンテキストの lookup()メソッドを使用して Bean プロキシーを取得します。Bean プロキシーの
lookup()
メソッドを呼び出し、必要なセッション Bean の JNDI 名を渡します。これにより、呼び出すメソッドが含まれるリモートビジネスインターフェースのタイプにキャストする必要のあるオブジェクトが返されます。final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());
セッション Bean の JNDI 名は、特別な構文を使用して定義されます。詳細は、「EJB JNDI 命名リファレンス」 を参照してください。 - メソッドを呼び出すプロキシー Bean オブジェクトがあると、リモートビジネスインターフェースに含まれるメソッドを呼び出すことができます。
int a = 204; int b = 340; System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server"); int sum = statelessRemoteCalculator.add(a, b); System.out.println("Remote calculator returned sum = " + sum);
プロキシー Bean はメソッド呼び出しリクエストをサーバーのセッション Bean に渡します。結果はプロキシー Bean に返され、呼び出し元に返されます。プロキシー Bean とリモートセッション Bean 間の通信は、呼び出し元に対して透過的です。
3.2.12.3. EJB JNDI 命名リファレンス
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
<appName>
- セッション Bean の JAR ファイルがエンタープライズアーカイブ(EAR)内にデプロイされた場合、これはその EAR の名前になります。デフォルトでは、EAR の名前は
.ear
接尾辞を含まないファイル名です。アプリケーション名はapplication.xml
ファイルで上書きすることもできます。セッション Bean が EAR にデプロイされていない場合は、これを空白のままにしておきます。 <moduleName>
- モジュール名は、セッション Bean がデプロイされる JAR ファイルの名前です。デフォルトでは、JAR ファイルの名前は、
.jar
接尾辞を含まないファイル名です。モジュール名は JAR のejb-jar.xml
ファイルで上書きすることもできます。 <distinctName>
- JBoss EAP 6 では、各デプロイメントで任意の一意の名前を指定できます。デプロイメントに一意の名前がない場合は、これを空白のままにします。
<beanName>
- Bean 名は、呼び出されるセッション Bean のクラス名です。
<viewClassName>
- view クラス名は、リモートインターフェースの完全修飾クラス名です。これには、インターフェースのパッケージ名が含まれます。
?stateful
- JNDI 名がステートフルセッション Bean を参照する場合は、
?stateful
サフィックスが必要です。他の Bean タイプには含まれません。
3.2.12.4. EJB 非同期メソッド呼び出しの移行
概要
EJB 3.1 仕様では、非同期メソッド呼び出しを行う機能が導入されました。この機能の導入前に、一部のアプリケーションサーバーはプロプライエタリーの非同期機能を提供していました。JBoss EAP 4.x は org.jboss.ejb3.asynchronous
パッケージでクラスを提供し、JBoss EAP 5.x はこの目的のために org.jboss.ejb3.common.proxy.plugins.async.AsyncUtils
クラスを提供していました。これらのクラスは JBoss EAP 6 ではサポートされず、置き換える必要があります。以下の例は、JBoss EAP 6 で非同期メソッド呼び出しを行う方法を示しています。
手順3.27 非同期セッション Bean とクライアントの作成
- 非同期セッション Bean メソッドを作成します。以下の例では、
sayHelloAsync()
メソッドは@Asynchronous
アノテーションを使用して非同期としてマークされます。型String
で、必要なFuture
クラス実装を返します。import javax.ejb.Remote; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.interceptor.Interceptors; import java.util.concurrent.Future; import javax.ejb.AsyncResult; import javax.ejb.Asynchronous; @Stateless(name="Hello") @Remote(Hello.class) public class HelloBean implements Hello { @Asynchronous public Future<String> sayHelloAsync() { return new AsyncResult<String>("Hello"); } }
- クライアントコードを作成します。利用可能な
Future.get()
メソッドの 1 つを使用して EJB を検索し、非同期メソッドを呼び出します。以下の例では、待機時間を timeout 引数および unit 引数で指定された値に制限します。Future<String> future = ejbObject.sayHelloAsync(); String response = future.get(timeout, unit);
3.2.13. 「EJB Changes」
3.2.13.1. ステートフル EJB キャッシュ設定の移行
jboss.xml
ファイルの container-cache-conf
要素を使用して設定されます。以下の例は、JBoss EAP 5 におけるステートフルキャッシュ設定を示しています。
<container-cache-conf> <cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy> <cache-policy-conf> <min-capacity>50</min-capacity> <max-capacity>200</max-capacity> <remover-period>1800</remover-period> <max-bean-life>1320</max-bean-life> <overager-period>300</overager-period> <max-bean-age>1260</max-bean-age> </cache-policy-conf> </container-cache-conf>
ejb3
サブシステムに設定されます。詳細な手順は、「ステートフルセッション Bean キャッシュの設定」 を参照してください。この手順では、JBoss EAP 5 で指定された stateful-timeout
に置き換わる <max-bean-age>
の設定方法も説明します。
3.2.13.2. ステートフルセッション Bean キャッシュの設定
ejb3
サブシステムに設定されます。以下の手順では、ステートフル EJB キャッシュおよびステートフルタイムアウトを設定する方法を説明します。
手順3.28 ステートフル EJB キャッシュの設定
- サーバー設定ファイルの
ejb3
サブシステムで<caches>
要素を見つけます。<cache>
要素を追加します。以下の例では、「my=cache」という名前のキャッシュを作成します。<cache name="my-cache" passivation-store-ref="my-cache-file" aliases="my-custom-cache"/>
- サーバー設定ファイルの
ejb3
サブシステムで<passivation-stores>
要素を見つけます。前のステップで定義したキャッシュ用に<file-passivation-store>
を作成します。<file-passivation-store name="my-cache-file" idle-timeout="1260" idle-timeout-unit="SECONDS" max-size="200"/>
ejb3
サブシステムの設定が以下の例のようになるはずです。<subsystem xmlns="urn:jboss:domain:ejb3:1.4"> ... <caches> <cache name="simple" aliases="NoPassivationCache"/> <cache name="passivating" passivation-store-ref="file" aliases="SimpleStatefulCache"/> <cache name="clustered" passivation-store-ref="infinispan" aliases="StatefulTreeCache"/> <cache name="my-cache" passivation-store-ref="my-cache-file" aliases="my-custom-cache"/> </caches> <passivation-stores> <file-passivation-store name="file" idle-timeout="120" idle-timeout-unit="SECONDS" max-size="500"/> <cluster-passivation-store name="infinispan" cache-container="ejb"/> <file-passivation-store name="my-cache-file" idle-timeout="1260" idle-timeout-unit="SECONDS" max-size="200"/> </passivation-stores> ... </subsystem>
パッシベーションキャッシュ "my-cache" は「my-cache-file」パッシベーションストアに設定されたようにステートフルセッション Bean をファイルシステムに渡します。これには、idle-timeout
、idle-timeout-unit
、およびmax-size
オプションが含まれます。- EJB JAR の
META
ファイルを作成します。以下の例は、前のステップで定義されたキャッシュを使用するように EJB を設定します。-INF/
ディレクトリーに jboss-ejb3.xml<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="urn:ejb-cache:1.0" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1" impl-version="2.0"> <assembly-descriptor> <c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache> </assembly-descriptor> </jboss:ejb-jar>
- タイムアウト値を設定する方法は、EJB 2 または EJB 3 を実装するかどうかによって異なります。
- EJB 3 ではアノテーションが導入されるため、以下のように EJB コードで
javax.ejb.StatefulTimeout
アノテーションを指定できます。@StatefulTimeout(value = 1320, unit=java.util.concurrent.TimeUnit.SECONDS) @Stateful @Remote(MyStatefulEJBRemote.class) public class MyStatefulEJB implements MyStatefulEJBRemote { ... }
@StatefulTimeout
の値は以下のいずれかに設定できます。- 値が
0
の場合は、Bean がすぐに削除できます。 0
より大きい値は、unit
パラメーターで指定された単位のタイムアウト値を示します。デフォルトのタイムアウト単位はMINUTES
です。パッシベーションキャッシュ設定を使用し、idle-timeout
の値がStatefulTimeout
値よりも小さい場合、指定されたidle-timeout
期間に対してアイドル状態になると、JBoss EAP は Bean をパッシベートします。その後、Bean はStatefulTimeout
の期間後に削除することができます。- -1 を値と
し
て指定すると、タイムアウトにより bean が削除されません。パッシベーションキャッシュ設定を使用し、Bean がidle-timeout
でアイドル状態である場合、JBoss EAP は Bean インスタンスをpassivation-store
に渡します。 -1
未満の値は有効ではありません。
- EJB 2 と EJB 3 の両方に対して、
ejb-jar.xml
ファイルでステートフルタイムアウトを設定できます。<?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1"> <enterprise-beans> <session> <ejb-name>HelloBean</ejb-name> <session-type>Stateful</session-type> <stateful-timeout> <timeout>1320</timeout> <unit>Seconds</unit> </stateful-timeout> </session> </enterprise-beans> </ejb-jar>
- EJB 2 と EJB 3 の両方に対して、
jboss-ejb3.xml ファイルでステートフルタイムアウトを
設定できます。<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="urn:ejb-cache:1.0" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1" impl-version="2.0"> <enterprise-beans> <session> <ejb-name>HelloBean</ejb-name> <session-type>Stateful</session-type> <stateful-timeout> <timeout>1320</timeout> <unit>Seconds</unit> </stateful-timeout> </session> </enterprise-beans> <assembly-descriptor> <c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache> </assembly-descriptor> </jboss:ejb-jar>
追加情報
- ステートフルセッション Bean のパッシベーションを無効にするには、以下のいずれかを行います。
- EJB 3 アノテーションを使用してステートフルセッション Bean を実装した場合、アノテーションのステートフルセッション Bean のパッシベーションを無効にできます。
@org.jboss.ejb3.annotation.Cache("NoPassivationCache")
- ステートフルセッション Bean が
jboss-ejb3.xml
ファイルで設定されている場合、<c:cache-ref>
要素の値をNoPassivationCache
と同等である「simple」に設定します。<c:cache-ref>simple</c:cache-ref>
- JBoss EAP 6 では EJB キャッシュポリシー「LRUStatefulContextCachePolicy」が変更になったため、JBoss EAP 6 では 1 対 1 の設定マッピングを行うことができません。
- JBoss EAP 6 では、以下のキャッシュプロパティーを設定できます。
- Bean のライフサイクル時間は、EJB 3.1 の @StatefulTimeout を使用して設定されます。
<file-passivation-store>
要素のidle-timeout
属性を使用して、サーバー設定ファイルのejb3
サブシステムのディスクに Bean のパッシベーションを設定します。<file-passivation-store>
要素のmax-size
属性を使用して、サーバー設定ファイルのejb3
サブシステムでパッシベーションストアの最大サイズを設定します。
- JBoss EAP 6 では、以下のキャッシュプロパティーを設定することはできません。
- メモリーキャッシュの最小および最大数。
- パッシベーションストアの最小番号。
- キャッシュ操作の頻度を制御する
*-period
設定。
3.2.13.3. ステートレスセッション Bean プールサイズの設定
概要
JBoss EAP 5 では、ステートレス EJB プールのデフォルトは EAP_HOME/server/PROFILE/deploy/ejb3-interceptors-aop.xml
ファイルで設定されていました。以下の例は、JBoss EAP 5 のプール設定を示しています。
<domain name="Stateless Bean" extends="Intercepted Bean" inheritBindings="true"> ... <annotation expr="class(*) AND !class(@org.jboss.ejb3.annotation.Pool)"> @org.jboss.ejb3.annotation.Pool (value="ThreadlocalPool", maxSize=30, timeout=10000) </annotation> </domain>このトピックでは、JBoss EAP 6 で EJB セッション bean のステートレスプールを設定する方法について説明します。
JBoss EAP 6 でのデフォルトのステートレスセッション Bean プールサイズの設定
JBoss EAP 6 では、ステートレスセッション Bean プールはサーバー設定ファイルの ejb3
サブ要素の <bean-instance-pools>
セクションで設定されます。ステートレスセッション Bean のデフォルトプールは "slsb-strict-max-pool" です。<bean-instance-pools>
で追加の設定を定義できます。以下の例は、JBoss EAP 6 で「my-stateless-bean-pool」という名前の新しい設定を定義します。
<subsystem xmlns="urn:jboss:domain:ejb3:1.3"> <session-bean> <stateless> <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/> </stateless> <stateful default-access-timeout="5000" cache-ref="simple"/> <singleton default-access-timeout="5000"/> </session-bean> <pools> <bean-instance-pools> <strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> <strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> <strict-max-pool name="my-stateless-bean-pool" max-pool-size="50" instance-acquisition-timeout="20" instance-acquisition-timeout-unit="SECONDS"/> </bean-instance-pools> </pools> ... </subsystem>
JBoss EAP 6 で Bean プールを使用するよう EJB を設定
以下の方法の 1 つを使用して、EJB をプールと関連付けることができます。
- アノテーションを使って EJB をプールに関連付けます。ここで、値はサーバー設定ファイルで定義されたプールの名前です。以下の例は、EJB を JBoss EAP 6 の「my-stateless-bean-pool」に関連付けます。
@Stateless @org.jboss.ejb3.annotation.Pool(value="my-stateless-bean-pool") public class MyBean....
- EJB JAR の
META-INF/
ディレクトリーにjboss-ejb3.xml
ファイルを設定して、EJB をプールに関連付けます。以下の例は、JBoss EAP 6 の jboss-ejb3.xml ファイルを使用して EJB をプールに関連付けます。<jboss xmlns="http://java.sun.com/xml/ns/javaee" xmlns:p="urn:ejb-pool:1.0"> .... <assembly-descriptor> <p:pool> <ejb-name>MyBean</ejb-name> <p:bean-instance-pool-ref>my-stateless-bean-pool</p:bean-instance-pool-ref> </p:pool> </assembly-descriptor> </jboss>
JBoss EAP 6 でのステートレスセッション Bean プールの無効化
EJB インスタンスのメモリーが問題ではなく、EJB インスタンスが PostConstruct
メソッドでコストのかかる初期化が行われていない場合は、デフォルトでプールを無効にすると便利です。プールが使用されていない場合、EJB でメソッドを呼び出すスレッドは単に EJB のインスタンスを作成し、その中にメソッドを呼び出し、EJB インスタンスを破棄します。
ejb3
サブシステムのステートレス EJB <bean-instance-pool-ref>
要素を削除します。
<subsystem xmlns="urn:jboss:domain:ejb3:1.3"> <session-bean> <stateless> <!-- Remove the following line --> <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/> </stateless> ...
3.2.13.4. jboss.xml ファイルの置き換え
概要
.xml デプロイメント記述子ファイルに置き換えられます。このファイルは、jboss.xml
デプロイメント記述子ファイルは jboss-ejb3ejb-jar.xml
デプロイメント記述子で定義された Java Enterprise Edition(EE)が提供する機能を上書きし、追加するために使用されます。新しいファイルは jboss.xml
と互換性がなく、デプロイメントで jboss.xml
は無視されるようになりました。
jboss.xml
ファイルを jboss-ejb3.xml
デプロイメント記述子ファイルに置き換える必要があります。アプリケーションが EJB 3.x を使用する場合は、jboss-ejb3.xml
ファイルを使用するか、EJB3 アノテーションを使用して完全に削除することもできます。
jboss.xml ファイルを jboss-ejb3.xml ファイルに置き換えます。
以前のリリースの JBoss EAP では、ejb
> を定義した場合、-jar.xml
ファイルで <resource-refjboss.xml
ファイルに JNDI 名に対応するリソース定義が必要でした。XDoclet は、これらのデプロイメント記述子ファイルの両方を自動的に生成します。JBoss EAP 6 では、JNDI マッピング情報が jboss-ejb3.xml
ファイルに定義されるようになりました。データソースが Java ソースコードに定義されていることを以下のように仮定します。
DataSource ds1 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource1"); DataSource ds2 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource2");
ejb-jar.xml
は以下のリソース参照を定義します。
<resource-ref > <res-ref-name>jdbc/Resource1</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <resource-ref > <res-ref-name>java:comp/env/jdbc/Resource2</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
jboss-ejb3.jxml
ファイルは、以下の XML 構文を使用して JNDI 名を参照にマップします。
<resource-ref> <res-ref-name>jdbc/Resource1</res-ref-name> <jndi-name>java:jboss/datasources/ExampleDS</jndi-name> </resource-ref> <resource-ref> <res-ref-name>java:comp/env/jdbc/Resource2</res-ref-name> <jndi-name>java:jboss/datasources/ExampleDS</jndi-name> </resource-ref>
不足している jboss.xml 設定属性の処理
JBoss EAP 5.x の jboss.xml
ファイルで使用できた一部の設定オプションは JBoss EAP 6 に実装されませんでした。以下のリストは、jboss.xml
ファイルで一般的に使用される属性の一部と、JBoss EAP 6 でそれらを実行する代替方法があるかどうかを示します。
method-attribute
要素は、個別のエンティティーおよびセッション Bean メソッドを設定するために使用されます。read-only
およびidempotent
設定オプションは JBoss EAP 6 に移植されませんでした。transaction-timeout
オプションがjboss-ejb3.xml
ファイルに設定されるようになりました。
missing-method-permission-exclude-mode
属性は、セキュアな Bean に明示的なセキュリティーメタデータを実装しなくてもメソッドの動作を変更しました。JBoss EAP 6 では、@RolesAllowed
アノテーションがないことは現在、以下と同様の方法で処理されます。@PermitAll
jboss-ejb3.xml
ファイル設定のその他の例は、『MDB の jboss-ejb3.xml のリソースアダプターの指定』、コンテナー『インターセプターの設定』、および JBoss EAP 『開発ガイド』 の「 『jboss-ejb3.xml デプロイメント記述子参照』 」のトピックを参照してください。『』
3.2.14. 「EJB 2.x and Earlier Changes」
3.2.14.1. EJB 1.x および EJB 2.x の非推奨の機能
- EJB 2.1 以前の CMP エンティティー Bean
- EJB 2.1 エンティティー Bean のクライアントビュー
- CMP エンティティー Bean クエリー用の EJB QL
- JAX-RPC ベースの Web サービスエンドポイントとクライアントビュー
3.2.14.2. EJB 1.x および EJB 2.x を使用するアプリケーションに必要な変更
3.2.14.2.1. EJB 2.x の実行に必要な設定変更
完全プロファイルでのサーバーの起動
EJB 2.x Container Managed Persistence(CMP)Bean には Java Enterprise Edition 6 Full Profile が必要です。このプロファイルには、CMP EJB の実行に必要な設定要素が含まれます。
org.jboss.as.cmp
拡張モジュールが含まれます。
<extensions> ... <extension module="org.jboss.as.cmp"/> ... </extensions>
cmp
サブシステムも含まれています。
<profiles> ... <subsystem xmlns="urn:jboss:domain:cmp:1.1"/> ... </profiles>.
-c standalone-full.xml
引数または -c standalone-full-ha.xml
引数を渡します。
コンテナー設定の長期サポートなし
これまでのバージョンの JBoss EAP では、CMP エンティティーおよびその他の Bean に異なるコンテナーを設定し、jboss.xml
アプリケーションデプロイメント記述子ファイル内に参照を設定して使用することができました。たとえば、SLSB からセッション Bean への一般的な設定は異なります。
- デフォルトでは、pessimistic ロックがアクティブになっています。これにより、デッドロックが生じる可能性があります。
- JBoss EAP 5.x の CMP レイヤーに含まれていたデッドロック検出コードは JBoss EAP 6 ではなくなりました。
commit-options
、インターセプタースタックをカスタマイズすることもできます。JBoss EAP 6 では、これはできなくなりました。commit-option
C
の Instance Per Transaction
ポリシーと類似する実装は 1 つだけです。CMP2.x と互換性のある JDBC ベースの永続マネージャーを使用する cmp2.x jdbc2 pm
エンティティー bean コンテナー設定を使用するアプリケーションを移行する場合、パフォーマンスに影響します。このコンテナーは、パフォーマンスに対して最適化されています。アプリケーションを移行する前に、これらのエンティティーを EJB 3 に移行することが推奨されます。
サーバー側のインターセプターの設定
JBoss EAP 6 は、@Interceptors
および @AroundInvoke
アノテーションを使用して標準の Java EE インターセプター
をサポートします。ただし、セキュリティーやトランザクション以外の操作は許可されません。
InitialContext
の使用TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry) new InitialContext().lookup("java:jboss/TransactionSynchronizationRegistry"); tsr.registerInterposedSynchronization(new MyTxCallback());
- インジェクションの使用
@Resource(mappedName = "java:comp/TransactionSynchronizationRegistry") TransactionSynchronizationRegistry tsr; ... tsr.registerInterposedSynchronization(new MyTxCallback());
javax.transaction.Synchronization
インターフェースを実装する必要があります。beforeCompletion{}
メソッドを使用して、トランザクションがコミットまたはロールバックされる前にチェックを実行します。このメソッドから RuntimeException
が発生すると、トランザクションはロールバックされ、クライアントには gitops olledbackException が通知さ
れます。XA-Transaction の場合、すべてのリソースは XA 契約に従ってロールバックされます。また、afterCompletion(int txStatus)
メソッドを使用してトランザクションの状態に依存するようにビジネスロジックを有効にすることもできます。このメソッドから RuntimeException
が発生すると、トランザクションは、コミットまたはロールバックのいずれかの以前の状態のままになり、クライアントには通知されません。サーバーログファイル内では、トランザクションマネージャーのみが警告を表示します。
クライアント側インターセプターのサーバー側設定
これまでのバージョンの JBoss EAP では、サーバー設定にクライアントインターセプターを設定し、クライアント API のクラスだけを提供できました。
エンティティー Bean プール設定
JBoss EAP 6 では、エンティティー bean プール設定は推奨されません。これは < strict-max-pool> 要素の設定に限定されるため、プール
が小さすぎて結果セットのすべてのエンティティーを読み込む場合に、デッドロックやその他の問題が発生する可能性があります。エンティティー bean には初期化中に大きなライフサイクルメソッドがないため、インスタンスの作成と周りのコンテナーの周りはプールされたエンティティー Bean インスタンスを使用する場合よりも遅くなります。
jboss.xml デプロイメント記述子ファイルの置き換え
.xml デプロイメント記述子ファイルに置き換えられます。このファイルは、jboss.xml
デプロイメント記述子ファイルは jboss-ejb3ejb-jar.xml
デプロイメント記述子で定義された Java Enterprise Edition(EE)が提供する機能を上書きし、追加するために使用されます。新しい jboss-ejb3.xml ファイルは
ファイルと互換性がありません。このファイルは、デプロイメントで無視されるようになりました。詳細は、 「jboss.xml ファイルの置き換え」 を参照してください。
jboss.xml
データソースタイプマッピングの設定
これまでのバージョンの JBoss EAP では、データソースの type-mapping を *-ds.xml
データソースデプロイメント設定ファイル内に設定できました。
jbosscmp-jdbc.xml
デプロイメント記述子ファイルで行う必要があります。
<defaults> <datasource-mapping>mySQL</datasource-mapping> <create-table>true</create-table> .... </defaults>
standardjbosscmp-jdbc.xml
ファイルで行われていました。このファイルは利用できなくなり、jbosscmp-jdbc.xml
デプロイメント記述子ファイルでマッピングを実行できるようになりました。
3.2.14.2.2. EJB 2.x に必要なコンテナー管理による永続性およびコンテナー管理の変更
コンテナー管理(CMR)イテレーターおよびコレクションの変更
以前のリリースの JBoss EAP では、CMR コレクションを繰り返し処理し、関係を削除または追加するために、一部のコンテナー( cmp2.x jdbc2 pm
コンテナーなど)が発生しました。コンテナー設定はサポート対象外であるため、JBoss EAP 6 ではこれをできなくなりました。アプリケーションコードで同じ機能を実現する方法は、カスタマーポータルの「Support Knowledgebase Solutions」セクションの「 EJB2.1 Finder for CMP entities for CMP entity with CMP entities with relations(CMR)returns duplicates in EAP6 」を参照してください。
コンテナー管理(CMR)ファクサーの重複エントリー
これまでのバージョンの JBoss EAP では、異なる永続ストラテジーを使用する異なる CMP コンテナーを選択できました。JBoss EAP 5 .x の cmp2.x jdbc2 pm
コンテナーは、最適化された SQL-92
を使用してファクサーに最適化された LEFT OUTER JOIN 構文を生成しました。JBoss EAP 6.x は CMP および CMR の標準コンテナーのみをサポートするため、実装にはこれらの最適化は含まれません。リファインダーには、結果セットにカテテス語の製品を回避するために、SELECT
ステートメントにキーワード DISTINCT
を含める必要があります。詳細は、カスタマーポータルの「Support Knowledgebase Solutions」セクションの「 EJB2.1 Finder for CMP entities with CMP entities with relations(CMR)returns duplicates in EAP6 」を参照してください。
CMP エンティティー Bean のデフォルト変更の削除
カスケード削除のデフォルト値が false
に変更になりました。これにより、JBoss EAP 6 で削除される可能性があります。エンティティー関係が cascade-delete
とマークされている場合は、jbosscmp-jdbc.xml
ファイルで batch-cascade-delete
を true
に明示的に設定する必要があります。詳細は、カスタマーポータルの「Support Knowledgebase Solutions」の「 cascade delete fail for EJB2 CMP entity after migration to EAP6 」を参照してください。
カスタムフィールドの CMP カスタムマッパー
JBoss EAP 5.x アプリケーションで JDBCParameterSetter
、JDBCResultSetReader
、および Mapper
などのカスタマーマッパークラスを使用している場合は、アプリケーションを JBoss EAP 6 にデプロイすると java.lang.ClassNotFoundException
が表示されることがあります。これは、インターフェースのパッケージ名が org.jboss.ejb.plugins.cmp.jdbc.Mapper
から org.jboss.as.cmp.jdbc.Mapper
に変更されているためです。詳細は、カスタマーポータルの「サポートナレッジベースソリューション」の「 How to use Field mapping for an EJB2 CMP application in an EJB2 CMP application in an EJB2 CMP application」を参照してください。
entity-commands を使用したプライマリーキーの生成
JBoss EAP 5 アプリケーションで entity-commands
を使用してプライマリーキー( Sequence
や Auto-increment
など)を生成すると、アプリケーションを JBoss EAP 6 に移行すると、JDBCOracleSequenceCreateCommand
クラスの ClassNotFoundException
が表示されることがあります。これは、クラスパッケージが org.jboss.ejb.plugins.cmp.jdbc
から org.jboss.as.cmp.jdbc.keygen
に変更されているためです。JBoss EAP 6 アプリケーションでこのクラスを使用する場合は、EAP_HOME/modules/system/layers/base/org/jboss/as/cmp
モジュールに依存関係も追加する必要があります。
3.2.14.2.3. EJB 2.x の実行に必要なアプリケーションの変更
新しい JNDI ネームスペースルールを使用するようコードを変更します。
EJB 3.0 と同様に、EJB 2.x と完全な JNDI プレフィックスを使用する必要があります。新しい JNDI ネームスペースルールおよびコード例の詳細は、 「アプリケーション JNDI 名前空間名の更新」 を参照してください。
jboss-web.xml ファイル記述子の変更
新しい JNDI 完全修飾ルックアップ形式を使用するように、各 <jndi-name>
の <ejb-ref>
を変更します。
XDoclet を使用して内部ローカルインターフェースの JNDI 名をマッピングする
EJB 2 では、Locator
パターンを使用して Bean を検索することは非常に一般的でした。アプリケーションコードを変更するのではなく、アプリケーションでこのパターンを使用した場合は、XDoclet を使用して新しい JNDI 名のマップを生成できます。
@ejb.bean name="UserAttribute" display-name="UserAttribute" local-jndi-name="ejb21/UserAttributeEntity" view-type="local" type="CMP" cmp-version="2.x" primkey-field="id"上記の例の JNDI 名
ejb21/UserAttributeEntity
は JBoss EAP 6 では有効ではなくなりました。サーバー設定の naming
サブシステムと XDoclet のパッチを使用して、この名前を有効な JNDI 名にマップできます。
手順3.29 XDoclet 生成コードの変更および Naming サブシステムの使用
ejb-module.jar
にある XDocletlookup.xdt
テンプレートを展開し、lookup()
のlookupHome
を以下のように変更します。private static Object lookupHome(java.util.Hashtable environment, String jndiName, Class narrowTo) throws javax.naming.NamingException { // Obtain initial context javax.naming.InitialContext initialContext = new javax.naming.InitialContext(environment); try { // Replace the existing lookup // Object objRef = initialContext.lookup(jndiName); // This is the new mapped lookup Object objRef; try { // try JBoss EAP mapping objRef = initialContext.lookup("global/"+jndiName); } catch(java.lang.Exception e) { objRef = initialContext.lookup(jndiName); } // only narrow if necessary if (java.rmi.Remote.class.isAssignableFrom(narrowTo)) return javax.rmi.PortableRemoteObject.narrow(objRef, narrowTo); else return objRef; } finally { initialContext.close(); } }
- Ant を実行し、
ejbdoclet
タスクに変更したlookup.xdt
を使用するようにテンプレート属性を設定します。 - サーバー設定ファイルの
naming
サブシステムを変更し、古い JNDI 名を新しい有効な JNDI 名にマッピングします。<subsystem xmlns="urn:jboss:domain:naming:1.2"> <bindings> <lookup name="java:global/ejb21/UserAttributeEntity" lookup="java:global/ejb2CMP/ejb/UserAttribute!de.wfink.ejb21.cmp.cmr.UserAttributeLocalHome"/> </bindings> <remote-naming/> </subsystem>
3.2.14.2.4. EJB 2.x に関する既知の問題
ejb-jar.xml
記述子ファイルのデプロイメントには既知の問題があります。サーバーはデプロイメント時に解析エラーをスローし、サーバーログに以下の出力が表示されます。
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC000001: Failed to start service jboss.deployment.unit."EJB_JAR_NAME.jar".PARSE: org.jboss.msc.service.StartException in service jboss.deployment.unit."EJB_JAR_NAMEjar".PARSE: JBAS018733: Failed to process phase PARSE of deployment "EJB_JAR_NAME.jar"この問題は JBoss EAP 6.4 で修正されました。詳細は、Bugzilla 1057835 を参照してください。
3.2.14.2.5. EJB 2.x ファイルの廃止
- jboss.xml
jboss.xml
アプリケーションデプロイメント記述子ファイルはサポートされず、デプロイされたアーカイブに含まれる場合は無視されます。このファイルは、jboss-ejb3.xml
デプロイメント記述子ファイルに置き換えられました。- standardjbosscmp-jdbc.xml
standardjbosscmp-jdbc.xml
サーバー設定ファイルに対応しなくなりました。この設定情報はorg.jboss.as.cmp
モジュールに含まれ、カスタマイズできなくなりました。- standardjboss.xml
standardjboss.xml
サーバー設定ファイルはサポートされなくなりました。この設定情報は、管理対象ドメインで実行している場合、スタンドアロンサーバーまたはdomain.xml
ファイルを実行する際にstandalone.xml
ファイルに含まれるようになりました。
3.2.15. JBoss AOP の変更
3.2.15.1. JBoss AOP を使用するアプリケーションの更新
アプリケーションのリファクタリング
ejb3-interceptors-aop.xml ファイルに以前に作成された
標準の EJB3 設定がサーバー設定ファイルに設定されるようになりました。スタンドアロンサーバーの場合、これはstandalone/configuration/standalone-full.xml
ファイルになります。管理対象ドメインでサーバーを実行している場合は、domain/configuration/domain.xml
ファイルになります。- 標準の Java EE
Interceptor
を使用するように、サーバー側 AOP インターセプターを変更する必要があります。コンテナーインターセプターと、アプリケーションでクライアント側のインターセプターを使用する方法は、カスタマーポータル https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4 の JBoss EAP 6 の 『『開発ガイド』』 の「コンテナー 『インターセプター』 」の章を参照してください。
JBoss AOP ライブラリーの使用
- コードをリファクタリングできない場合は、JBoss AOP ライブラリーのコピーを取得して、アプリケーションでバンドルできます。AOP ライブラリーは JBoss EAP 6 で動作しますが、デプロイされていません。サーバーの起動時に以下のコマンドライン引数を使用して手動でデプロイできます。-Djboss.aop.path=PATH_TO_AOP_CONFIG注記JBoss AOP ライブラリーは JBoss EAP 6 で動作しますが、この設定はサポートされていません。
3.2.16. jacorb の変更
3.2.16.1. jacorb 設定の変更
EAP_HOME/server/production/conf/jacorb.properties
ファイルに指定されたプロパティーを使用して JacORB 設定が実行されました。以下は、そのファイルに設定された JacORB プロパティーの例になります。
jacorb.connection.client.pending_reply_timeout=600000 jacorb.connection.client.idle_timeout=120000 jacorb.connection.server.timeout=300000 jacorb.native_char_codeset=UTF8 jacorb.native_wchar_codeset=UTF16
3.2.17. JBoss Web コンポーネントの変更
3.2.17.1. HTTP/HTTPS/AJP コネクター属性のマップ
表3.10 マップコネクターの属性
以前のリリースの属性名 | JBoss EAP 6 で同等のもの | Details |
---|---|---|
maxThreads | max-connections | この属性は、JBossWeb レベルのスレッドプールのサイズになります。これは Web サブシステムのコネクターに設定されます。デフォルトは CPU コアごとに 512 です。
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" max-connections="200" /> |
minSpareThreads
maxSpareThreads
| 該当なし | スレッドの回収にはほとんどないため、minSpareThreads または maxSpareThreads と同等のものはありません。デフォルトのワーカースレッドプールの代わりにコネクターにエクゼキューターを使用する場合、最も近いものは core-threads サイズおよび keepalive-time 属性になります。 |
proxyName
proxyPort
|
proxy-name
proxy-port
| この属性は Web サブシステムの コネクター に設定されます。
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" proxy-name="proxy.com" proxy-port="80"/> |
redirectPort
|
redirect-port
|
この属性は
Web サブシステムの コネクター に設定されます。
connector name="http" protocol="HTTP/1.1" scheme="https" secure="true" socket-binding="http" redirect-port="8443" proxy-name="loadbalancer.hostname.com" proxy-port="443" |
enableLookups
|
enable-lookups
|
この属性は
Web サブシステムの コネクター に設定されます。
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enable-lookups="true"/>" |
MaxHttpHeaderSize
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。デフォルト値は 8 KB です。
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.MAX_HEADER_SIZE" value="8192"/> </system-properties> |
maxKeepAliveRequests
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.MAX_KEEP_ALIVE_REQUESTS" value="1"/> </system-properties> |
connectionTimeout
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。以下の設定では、AJP connectionTimeout を 600000 ミリ秒(10 分)に設定し、HTTP connectionTimeout を 120000 ミリ秒(2 分)に設定します。
<system-properties> <!-- connectionTimeout for AJP connector. Default value is "-1" (no timeout). --> <property name="org.apache.coyote.ajp.DEFAULT_CONNECTION_TIMEOUT" value="600000"/> <!-- connectionTimeout for HTTP connector. Default value is "60000". --> <property name="org.apache.coyote.http11.DEFAULT_CONNECTION_TIMEOUT" value="120000"/> </system-properties> |
圧縮
| システムプロパティー | この属性は圧縮を有効にします。コンテンツタイプを指定できます。デフォルトは text/html,text/xml,text/plain です。圧縮されるコンテンツの最小サイズを指定することもできます。デフォルトは 2048 バイトです。圧縮はシステムプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION" value="on"/> <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIN_SIZE" value="4096"/> <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIME_TYPES" value="text/javascript,text/css,text/html"/> </system-properties> |
URIencoding
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/> </system-properties> |
useBodyEncodingForURI
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/> </system-properties> |
server
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.SERVER" value="NewServerHeader"/> </system-properties> |
allowTrace
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.catalina.connector.ALLOW_TRACE " value="true"/> </system-properties> |
xpoweredby
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.catalina.connector.X_POWERED_BY " value="true"/> </system-properties> |
keepAliveTimeout
| 該当なし |
JBoss EAP 6.4 以前では、JBoss EAP 6 には同等のパラメーターがありませんでした。内部的には、これはデフォルトで
connectionTimeout の値に設定されます。
JBoss EAP 6.4 では、新しいシステムプロパティー
org.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT が導入され、keepAliveTimeout を制御します。-Dorg.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT 引数は、-Dorg.apache.coyote.http11.DEFAULT_DISABLE_UPLOAD_TIMEOUT=true 引数と共に使用する場合に影響を与えます。
|
disableUploadTimeout
connectionUploadTimeout
| 該当なし |
現在 JBoss EAP 6 には同等のパラメーターはありません。
disableUploadTimeout はデフォルトで true で、connectionUploadTimeout は内部的に connectionTimeout の値を使用します。
|
packetSize
| システムプロパティー | この属性はシステムプロパティーを使用して設定されます。以下の設定では、AJP packetSize を 20000 に設定します。
<system-properties> <property name="org.apache.coyote.ajp.MAX_PACKET_SIZE" value="20000"/> </system-properties> |
maxPostSize
maxSavePostSize
|
max-post-size
max-save-post-size
| 値が 0 の場合は無制限を意味します。このパラメーターは、Content-Type が application/x-www-form-urlencoded の場合にのみデータサイズを制限することができることに注意してください。詳細は、カスタマーポータルの「 How to limit data size of HTTP POST method from a client to JBoss」を参照してください。 |
tomcatAuthentication
| システムプロパティー |
JBoss EAP 6 のバージョンに応じて、この属性はシステムプロパティー
org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION または org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION を使用して設定されます。すべてのバージョンのサーバーにパッチまたはアップグレードが必要になります。
JBoss EAP 6.0.1 では、tomcatAuthentication は以下のプロパティーを使用して設定されます。
<system-properties> <property name="org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION" value="false"/> </system-properties>
JBoss EAP 6.1 以降では、tomcatAuthentication は以下のように設定されます。
<system-properties> <property name="org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION" value="false"/> </system-properties>
詳細は、カスタマーポータルの「 How to configure tomcatAuthentication in JBoss EAP 6」を参照してください。
|
3.2.17.2. 1-Way SSL の設定
keystore.jks
ファイルは EAP_HOME/server/PROFILE/conf/
ディレクトリーに置かれました。その後、以下のように EAP_HOME/server/PROFILE/deploy/jbossweb.sar/server.xml
ファイルで HTTP コネクターを設定します。
<Connector protocol="HTTP/1.1" SSLEnabled="true" port="8443" address="${jboss.bind.address}" scheme="https" secure="true" clientAuth="false" keystoreFile="${jboss.server.home.dir}/conf/keystore.jks" keystorePass="password" SSLProtocol = "TLS" />
keystore.jks
ファイルは EAP_HOME/standalone/configuration/
または EAP_HOME/domain/configuration/
ディレクトリーに配置されます。その後、以下のように HTTP コネクターはサーバー設定ファイルの web
サブシステムで設定されます。
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https"> <ssl name="ssl" key-alias="jboss" password="password" certificate-key-file="${jboss.server.config.dir}/keystore.jks" protocol="TLSv1" verify-client="false"/> </connector>
Web
サブシステムで設定されますが、コネクタープロトコルは "org.apache.coyote.http11.Http11AprProtocol" に設定されます。
3.2.17.3. バルブ設定の移行
EAP_HOME/server/PROFILE/lib
ディレクトリーに追加し、以下のファイルのいずれかを設定して Tomcat バルブを設定できます。
- JBoss EAP 4.x では、バルブは
EAP_HOME/server/PROFILEdeploy/jboss-web.deployer/server.xml
またはEAP_HOME/server/PROFILEdeploy/jboss-web.deployer/context.xml
ファイルのいずれかで設定されました。 - JBoss EAP 5.x では、バルブは
EAP_HOME/server/PROFILEdeploy/jbossweb.sar/server.xml
ファイルに設定されました。
web
サブシステムでモジュールを設定します。バルブの設定方法に関する詳細は、カスタマーポータルの JBoss EAP『 『Administration and Configuration Guide』 』の「titled 『Global Valves』 」の章を参照してください。 https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4
3.2.17.4. CertificatePrincipal クラスの設定
jbossweb-tomcat.sar/server.xml
ファイルの certificatePrincipal
の Realm
属性を設定して CertificatePrincipal
クラスが JBossWeb コンテナーで設定されている。
<Realm className="org.jboss.web.tomcat.security.JBossWebRealm" certificatePrincipal="org.jboss.security.auth.certs.SubjectDNMapping" allRolesMode="authOnly"/>
3.2.18. Seam 2.2 アプリケーションの移行
3.2.18.1. Seam 2.2 アーカイブの JBoss EAP 6 への移行
概要
Seam 2.2 アプリケーションを移行する場合は、データソースを設定し、モジュール依存関係を指定する必要があります。また、アプリケーションに JBoss EAP 6 には同梱されないアーカイブの依存関係があるかどうかを確認し、依存する JAR をアプリケーションの lib/
ディレクトリーにコピーします。
手順3.30 Seam 2.2 アーカイブの移行
- データソース設定を更新します。Seam 2.2 の例では、
java:/ExampleDS
という名前のデフォルトの JDBC データソースを使用します。このデフォルトのデータソースは JBoss EAP 6 でjava:jboss/datasources/ExampleDS
に変更されています。アプリケーションがサンプルデータベースを使用する場合は、以下のいずれかを実行できます。データソースの設定方法は 「DataSource設定の更新」 を参照してください。- JBoss EAP 6 に同梱されるサンプルデータベースを使用する場合は、
META-INF/persistence.xml
ファイルを変更して、既存のjta-data-source
要素をデータベースのデータソースの JNDI 名に置き換えます。<!-- <jta-data-source>java:/ExampleDS</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
- 既存のデータベースを保持する場合は、データソース定義を
EAP_HOME/standalone/configuration/standalone.xml
ファイルに追加できます。重要サーバーの再起動後に変更が維持されるようにするには、サーバーを停止してからサーバー設定ファイルを編集する必要があります。以下の定義は、JBoss EAP 6 で定義されたデフォルトの HSQL データソースのコピーです。<datasource name="ExampleDS" jndi-name="java:/ExampleDS" enabled="true" jta="true" use-java-context="true" use-ccm="true"> <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url> <driver>h2</driver> <security> <user-name>sa</user-name> <password>sa</password> </security> </datasource>
- 管理 CLI コマンドラインインターフェースを使用してデータソース定義を追加することもできます。以下は、データソースの追加に使用する構文の例です。行の最後にある「\"」は、以下の行のコマンドの継続を示しています。
例3.12 データソース定義を追加する構文の例
$ EAP_HOME/bin/jboss-cli --connect [standalone@localhost:9999 /] data-source add --name=ExampleDS --jndi-name=java:/ExampleDS \ --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 --driver-name=h2 \ --user-name=sa --password=sa
- 必要な依存関係を追加します。Seam 2.2 アプリケーションは JSF 1.2 を使用しているため、JSF 1.2 モジュールの依存関係を追加して JSF 2.0 モジュールを除外する必要があります。これを実行するには、以下のデータが含まれる EAR の
META-INF/
ディレクトリーにjboss-deployment-structure.xml
ファイルを作成する必要があります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
アプリケーションがサードパーティーのロギングフレームワークを使用する場合は、「ロギング依存関係の変更」 に記載されているように、これらの依存関係を追加する必要があります。 - アプリケーションが Hibernate 3.x を使用する場合は、最初に Hibernate 4 ライブラリーを使用してアプリケーションを実行します。アプリケーションが Seam Managed Persistence Context、Hibernate 検索、検証、またはその他の機能を使用していない場合は、Hibernate 4 ライブラリーで実行することができます。ただし、Hibernate クラスを参照する
ClassNotFoundExceptions
またはClassCastExceptions
が表示された場合や、以下のようなエラーが表示される場合には、次の手順の手順に従い、アプリケーションを Hibernate 3.3 ライブラリーを使用するように変更する必要がある場合があります。Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.jboss.seam.persistence.HibernateSessionProxy.getSession(Lorg/hibernate/EntityMode;)Lorg/hibernate/Session;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/seam/persistence/HibernateSessionProxy, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface org/hibernate/Session have different Class objects for the type org/hibernate/Session used in the signature
- 外部フレームワークまたは他の場所から依存アーカイブをコピーします。アプリケーションが Hibernate 3.x を使用し、アプリケーションで Hibernate 4 が正常に使用できない場合は、Hibernate 3.x JAR を
/lib
ディレクトリーにコピーし、以下のようにMETA-INF/jboss-deployment-structure.xml
の deployments セクションの Hibernate モジュールを除外する必要があります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <exclusions> <module name="org.hibernate"/> </exclusions> <deployment> </jboss-deployment-structure>
アプリケーションと Hibernate 3.x をバンドルする場合には、追加の手順を実施する必要があります。詳細は、 「Hibernate および JPA を使用するアプリケーションの変更の設定」 を参照してください。 - Seam 2.2 JNDI エラーをデバッグして解決します。Seam 2.2 アプリケーションを移行すると、以下のようなログに
javax.naming.NameNotFoundException
エラーが表示される可能性があります。javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
コード全体で JNDI ルックアップを変更したくない場合は、アプリケーションのcomponents.xml
ファイルを以下のように変更できます。- 既存の core-init 要素を置き換えます。まず、以下のように既存の core-init 要素を置き換える必要があります。
<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init debug="true" distributable="false"/>
- サーバーログで JNDI バインディング INFO メッセージを検索します。次に、アプリケーションのデプロイ時にサーバーログに出力される JNDI バインディング INFO メッセージを見つけます。JNDI バインディングメッセージは以下のようになります。
INFO org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor (MSC service thread 1-1) JNDI bindings for session bean named AuthenticatorAction in deployment unit subdeployment "jboss-seam-booking.jar" of deployment "jboss-seam-booking.ear" are as follows. java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator java:app/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator java:module/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction java:app/jboss-seam-booking.jar/AuthenticatorAction java:module/AuthenticatorAction
- コンポーネント要素を追加します。ログの JNDI バインディング INFO メッセージごとに、一致する
component
要素をcomponents.xml
ファイルに追加します。<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
移行の問題のデバッグおよび解決方法に関する詳細は、 「移行の問題のデバッグおよび解決」 を参照してください。Seam 2 アーカイブの既知の問題の一覧は、 「Seam 2.2 アーカイブの移行の問題」 を参照してください。
結果
Seam 2.2 アーカイブは JBoss EAP 6 で正常にデプロイされ、実行されます。
3.2.18.2. Seam 2.2 アーカイブの移行の問題
- Seam 2.2 Drools と Java 7 は互換性がない
- Seam 2.2 Drools と Java 7 は互換性がなく、org.drools.RuntimeDroolsException: 値 '1.7' は有効な言語レベルのエラーで失敗します。
- Seam 2.2.5 署名
cglib.jar
により、Spring の例が動作しない - JBoss EAP 5 の Seam 2.2.5 に同梱されている署名済み
cglib.jar
を使用して Spring の例を実行すると、以下の原因で失敗します。java.lang.SecurityException: class "org.jboss.seam.example.spring.UserService$$EnhancerByCGLIB$$7d6c3d12"'s signer information does not match signer information of other classes in the same package
この問題の回避策として、以下のようにcglib.jar
の署名を解除します。zip -d $SEAM_DIR/lib/cglib.jar META-INF/JBOSSCOD\* - Seambay の例が
NotLoggedInException
で失敗する - この問題の原因は、SOAPRequestHandler でメッセージを処理すると SOAP メッセージヘッダーが null であるため、会話 ID は設定されていません。この問題を回避するには、で説明されているように
org.jboss.seam.webservice.SOAPRequestHandler.handleOutbound
を上書きし https://issues.jboss.org/browse/JBPAPP-8376 ます。 - Seambay の例が
UnsupportedOperationException
: no transaction で失敗する - このバグは、JBoss EAP 6 の UserTransaction の JNDI 名の変更によって生じます。この問題を回避するには、の説明どおりに
org.jboss.seam.transaction.Transaction.getUserTransaction
を上書きし https://issues.jboss.org/browse/JBPAPP-8322 ます。 - タスクの例は、
org.jboss.resteasy.spi.UnhandledException
: Unable to unmarshall request body をスローします。 - このバグは、JBoss EAP 5.1.2)に含まれる seam-resteasy-2.2.5 と JBoss EAP 6 に含まれる RESTEasy 2.3.1.GA 間の非互換性によって生じます。この問題の回避策と https://issues.jboss.org/browse/JBPAPP-8315 して、
jboss-deployment-structure.xml
を使用して、メインのデプロイメントから resteasy-jaxrs、resteasy-jettison-provider、resteasy-jaxb-provider、resteasy-jaxrs、resteasy-jettison-provider、resteasy-jaxb-provider、resteasy-jaxb-provider、resteasy-yaml-provider をjboss-seam-tasks.war
から除外することです。次に、EAR に Seam 2.2 とバンドルされた RESTEasy ライブラリーを含める必要があります。 - AJAX 要求中の
org.jboss.seam.core.SynchronizationInterceptor
とステートフルコンポーネントインスタンスの EJB ロック間のデッドロック - "Caused by javax.servlet.ServletException with message: "javax.el.ELException: /main.xhtml @36,71 value="#{hotelSearch.pageSize}": org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component: hotelSearch" or similar error message is could not acquire lock on @Synchronized component: hotelSearch" or similar error メッセージが表示されます。この問題は、Seam 2 がステートフルセッション Bean(SFSB)ロック外の独自のロックと、異なるスコープである点です。つまり、スレッドが同じトランザクションで EJB に 2 回アクセスされた場合、最初の呼び出しの後に SFSB ロックがありますが、seam ロックは存在することを意味します。2 つ目のスレッドは、seam ロックの取得が可能です。次に、EJB ロックに到達して待機することができます。最初のスレッドが 2 つ目の呼び出しを試みると、seam 2 インターセプターとデッドロックでブロックされます。Java EE 5 では、EJB は同時アクセスで即座に例外を発生させました。この動作は Java EE 6 で変更になりました。この問題を回避するには、@AccessTimeout(0)を EJB に追加します。これにより、このような状況が発生すると
、すぐに Concurrent
Warehouse をスローします。 - dvdstore の例 create order が
javax.ejb.gitopsolledbackException
で失敗する - dvdstore の例では、以下のエラーが表示されます。
JBAS011437: Found extended persistence context in SFSB invocation call stack but that cannot be used because the transaction already has a transactional context associated with it. This can be avoided by changing application code, either eliminate the extended persistence context or the transactional context. See JPA spec 2.0 section 7.6.3.1.
この問題は JPA 仕様の変更が原因です。この問題の修正は、永続コンテキストをCheckoutAction
およびShowOrdersAction
クラスでトランザクション
に変更し、cancelOrder
メソッドおよびdetailOrder
メソッドでエンティティーマネージャーのマージ操作を使用することです。 - JBoss EAP 6 では JBoss Cache Seam キャッシュプロバイダーを使用できない
- JBoss EAP 6 では JBoss キャッシュはサポートされません。これにより、JBoss Cache Seam Cache プロバイダーは、アプリケーションサーバーの Seam アプリケーションで失敗します。
java.lang.NoClassDefFoundError: org/jboss/util/xml/JBossEntityResolver
. - JBoss EAP 6 における JPA エンティティーの問題に対する Hibernate 3.3.x 自動スキャン
- この問題の修正は、persistence.xml ファイルのすべてのエンティティークラスを手動で一覧表示することです。以下に例を示します。
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="example_pu"> <description>Hibernate 3 Persistence Unit.</description> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> <properties> <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" /> </properties> <class>com.acme.Foo</class> <class>com.acme.Bar</class> </persistence-unit> </persistence>
- EJB 以外のスレッドから EJB Seam コンポーネントを呼び出すと、javax.naming.NameNotFoundException が発生します。
- この問題は、新しいモジュラークラスローディングシステムを実装し、新たに標準化された JNDI 名前空間規則を導入するために JBoss EAP 6 の変更が原因です。
java:app
namespace は、1 つのアプリケーションのすべてのコンポーネントによって共有される名前について指定されます。Quartz 非同期スレッドなどのEE 以外のスレッドは、アプリケーションサーバーインスタンスにデプロイされたアプリケーションによって共有されるjava:global
名前空間を使用する必要があります。Quartz 非同期メソッドから EJB Seam コンポーネントを呼び出しようとするとjavax.naming.NameNotFoundException
を受信した場合、以下のようにcomponents.xml
ファイルを変更してグローバル JNDI 名を使用する必要があります。<component class="org.jboss.seam.example.quartz.MyBean" jndi-name="java:global/seam-quartz/quartz-ejb/myBean"/>
JNDI の変更に関する詳細は、「アプリケーション JNDI 名前空間名の更新」 のトピックを参照してください。この特定の問題に関する詳細は、Red Hat カスタマーポータルの 『Red Hat JBoss Web Framework Kit』 の 2.2 『. 『0 リリースノート』 の quartz 非同期メソッドから EJB Seam コンポーネントを呼び出しようとすると、BZ#948215 - Seam2.3 javax.naming.NameNotFoundException trying』 を参照してください。
3.2.19. Spring アプリケーションの移行
3.2.19.1. Spring アプリケーションの移行
3.2.20. 影響を受ける移行のその他の変更
3.2.20.1. 移行の影響を受ける可能性がある他の変更点についてよく知る
3.2.20.2. Maven プラグイン名の変更
jboss-maven-plugin
が更新されず、JBoss EAP 6 では機能しません。これで、org.jboss.as.plugins:jboss-as-maven-plugin
を使用して正しいディレクトリーにデプロイする必要があります。
3.2.20.3. クライアントアプリケーションの変更
jboss-client.jar
で、EAP_HOME/bin/client/
ディレクトリーにあります。EAP_HOME/client/jbossall-client.jar
に置き換わるもので、リモートクライアントから JBoss EAP 6 に接続するために必要なすべての依存関係が含まれます。
第4章 ツールおよびヒント
4.1. 移行に役立つリソース
4.1.1. 移行に役立つリソース
- ツール
- 設定変更の一部を自動化するツールがいくつかあります。詳細は、 「移行に役立つツールに慣れる」 を参照してください。
- デバッグのヒント
- アプリケーションの移行時に表示される可能性のある問題およびエラーの最も一般的な原因と解決策の一覧は、 「移行の問題のデバッグおよび解決」 を参照してください。
- 移行の例
- JBoss EAP 6 に移行したアプリケーションの例は、 「サンプルアプリケーションの移行の確認」 を参照してください。
4.1.2. 移行に役立つツールに慣れる
概要
移行作業に役立つツールがいくつかあります。以下は、これらのツールの一覧と、そのツールの動作を示しています。
- Tattletale
- モジュラークラスローディングの変更に伴い、アプリケーションの依存関係を見つけ、修正する必要があります。Tattletale は、依存するモジュール名を特定し、アプリケーションの設定 XML を生成するのに役立ちます。
- IronJacamar Migration Tool
- JBoss EAP 6 では、データソースとリソースアダプターは個別のファイルで設定されなくなりました。サーバー設定ファイルで定義され、新しいスキーマを使用するようになりました。IronJacamar Migration Tool は、以前の設定を JBoss EAP 6 によって想定される形式に変換できます。
4.1.3. Tattletale を使用したアプリケーション依存関係の検索
概要
JBoss EAP 6 のモジュラークラスローディングの変更により、アプリケーションの移行時に JBoss ログに ClassNotFoundException
または ClassCastException
トレースが表示されることがあります。これらのエラーを解決するには、例外によって指定されたクラスが含まれる JAR を見つける必要があります。
jboss-deployment-structure.xml
ファイルを組み込むため、依存するモジュール名を自動的に特定および生成することができます。
手順4.1 Tattletale をインストールして実行し、アプリケーションの依存関係を検索します。
4.1.4. Tattletale のダウンロードおよびインストール
手順4.2 Tattletale のダウンロードおよびインストール
- Tattletale バージョン 1.2.0.Beta2 以降を から http://sourceforge.net/projects/jboss/files/JBoss%20Tattletale ダウンロードします。
- 任意のディレクトリーに展開します。
- 以下を実行して
TATTLETALE_HOME/jboss-tattletale.properties
ファイルを変更します。ee6
およびas7
をprofiles
プロパティーに追加します。profiles=java5, java6, ee6, as7
scan
およびreports
プロパティーのコメントを解除します。
4.1.5. Tattletale レポートの作成およびレビュー
- 以下のコマンドを実行して Tattletale レポートを作成します。 java -jar
TATTLETALE_HOME/tattletale.jar
APPLICATION_ARCHIVE
OUTPUT_DIRECTORY
例: java -jar tattletale-1.2.0.Beta2/tattletale.jar ~/applications/jboss-seam-booking.ear ~/output-results/ - ブラウザーで
OUTPUT_DIRECTORY/index.html
ファイルを開き、「Reports」セクションの「JBoss AS 7」をクリックします。- 左側の列には、アプリケーションが使用するアーカイブが一覧表示されます。ARCHIVE_NAME リンクをクリックして、その場所、マニフェスト情報、含まれるクラスなどのアーカイブの詳細を表示します。
- 右側の列の
jboss-deployment-structure.xml
リンクは、左側の列で名前が付けられたアーカイブのモジュール依存関係を指定する方法を示しています。このリンクをクリックして、このアーカイブのデプロイメント依存関係モジュール情報を定義する方法を確認します。
4.1.6. IronJacamar Tool を使用したデータソースおよびリソースアダプター設定の移行
概要
以前のバージョンのアプリケーションサーバーでは、*-ds.xml
の接尾辞が付いたファイルを使用してデータソースとリソースアダプターが設定され、デプロイされていました。IronJacamar 1.1 ディストリビューションには、これらの設定ファイルを JBoss EAP 6 が期待する形式に変換するために使用できる移行ツールが含まれています。ツールは以前のリリースのソース設定ファイルを解析し、XML 設定を作成し、新しい形式で出力ファイルに書き込みます。この XML は、JBoss EAP 6 サーバー設定ファイルの正しいサブシステムの下にコピーおよび貼り付けることができます。このツールは、古い属性と要素を新しい形式に変換するベスト作業を行いますが、生成されたファイルに追加の変更が必要になる場合があります。
手順4.3 IronJacamar Migration ツールのインストールおよび実行
4.1.7. IronJacamar Migration Tool のダウンロードおよびインストール
- IronJacamar の最新のディストリビューションを からダウンロードします。 http://www.ironjacamar.org/download.html
- ダウンロードしたファイルを任意のディレクトリーに展開します。
- IronJacamar ディストリビューションでコンバータースクリプトを見つけます。
- Linux スクリプトは、
IRONJACAMAR_HOME/doc/as/converter.sh
にあります。 - Windows バッチファイルは
IRONJACAMAR_HOME/doc/as/converter.bat
にあります。
4.1.8. IronJacamar Migration Tool を使用したデータソース設定ファイルへの変換
手順4.4 データソース設定ファイルの変換
- コマンドラインを開き、
IRONJACAMAR_HOME/doc/as/
ディレクトリーに移動します。 - 以下のコマンドを入力してコンバータースクリプトを実行します。
- For Linux: ./converter.sh -ds
SOURCE_FILE
TARGET_FILE
- Microsoft Windows の場合: ./converter.bat -ds
SOURCE_FILE
TARGET_FILE
SOURCE_FILE
は以前のリリースのデータソース -ds.xml ファイルです。TARGET_FILE
には新しい設定が含まれます。たとえば、現在のディレクトリーにあるjboss-seam-booking-ds.xml
データソース設定ファイルを変換するには、以下を入力します。- For Linux: ./converter.sh -ds
jboss-seam-booking-ds.xml
new-datasource-config.xml
- Microsoft Windows の場合: ./converter.bat -ds
jboss-seam-booking-ds.xml
new-datasource-config.xml
データソース変換のパラメーターは-ds
であることに注意してください。 - ターゲットファイルから
<datasource>
要素をコピーし、それを<subsystem xmlns="urn:jboss:domain:datasources:1.1">
<datasources>
要素の下のサーバー設定ファイルに貼り付けます。重要サーバーの再起動後に変更が維持されるようにするには、サーバーを停止してからサーバー設定ファイルを編集する必要があります。- 管理対象ドメインで実行している場合は、XML を
EAP_HOME/domain/configuration/domain.xml
ファイルにコピーします。 - スタンドアロンサーバーとして実行している場合は、XML を
EAP_HOME/standalone/configuration/standalone.xml
ファイルにコピーします。
- 新しい設定ファイルで生成された XML を変更します。以下は、JBoss EAP 5.x に同梱される Seam 2.2 Booking サンプルの
jboss-seam-booking-ds.xml
データソース設定ファイルの例です。<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>bookingDatasource</jndi-name> <connection-url>jdbc:hsqldb:.</connection-url> <driver-class>org.hsqldb.jdbcDriver</driver-class> <user-name>sa</user-name> <password></password> </local-tx-datasource> </datasources>
以下は、Converter スクリプトを実行して生成された設定ファイルです。生成されたファイルには<driver-class>
要素が含まれます。JBoss EAP 6 でドライバークラスを定義するのに推奨される方法は、<driver>
要素を使用することです。以下は、JBoss EAP 6 設定ファイルの結果として生成される XML で、<driver-class>
要素をコメントアウトし、対応する<driver>
要素を追加します。<subsystem xmlns="urn:jboss:domain:datasources:1.1"> <datasources> <datasource enabled="true" jndi-name="java:jboss/datasources/bookingDatasource" jta="true" pool-name="bookingDatasource" use-ccm="true" use-java-context="true"> <connection-url>jdbc:hsqldb:.</connection-url> <!-- Comment out the following driver-class element since it is not the preferred way to define this. <driver-class>org.hsqldb.jdbcDriver</driver-class> --> <!-- Specify the driver, which is defined later in the datasource --> <driver>h2<driver> <transaction-isolation>TRANSACTION_NONE</transaction-isolation> <pool> <prefill>false</prefill> <use-strict-min>false</use-strict-min> <flush-strategy>FailingConnectionOnly</flush-strategy> </pool> <security> <user-name>sa</user-name> <password/> </security> <validation> <validate-on-match>false</validate-on-match> <background-validation>false</background-validation> <use-fast-fail>false</use-fast-fail> </validation> <timeout/> <statement> <track-statements>false</track-statements> </statement> </datasource> <drivers> <!-- The following driver element was not in the XML target file. It was created manually. --> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> </driver> </drivers> </datasources> </subsystem>
4.1.9. IronJacamar Migration Tool を使用したリソースアダプター設定ファイルへの変換
- コマンドラインを開き、
IRONJACAMAR_HOME/docs/as/
ディレクトリーに移動します。 - 以下のコマンドを入力してコンバータースクリプトを実行します。
- For Linux: ./converter.sh -ra
SOURCE_FILE
TARGET_FILE
- Microsoft Windows の場合: ./converter.bat -ra
SOURCE_FILE
TARGET_FILE
SOURCE_FILE
は以前のリリースのリソースアダプター -ds.xml ファイルです。TARGET_FILE
には新しい設定が含まれます。たとえば、現在のディレクトリーにあるmttestadapter-ds.xml
リソースアダプター設定ファイルを変換するには、以下を入力します。- For Linux: ./converter.sh -ra
mttestadapter-ds.xml
new-adapter-config.xml
- Microsoft Windows の場合: ./converter.bat -ra
mttestadapter-ds.xml
new-adapter-config.xml
リソースアダプター変換のパラメーターは-ra
であることに注意してください。 - ターゲットファイルから
<resource-adapters>
要素全体をコピーし、サーバー設定ファイルに<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
要素の下に貼り付けます。重要サーバーの再起動後に変更が維持されるようにするには、サーバーを停止してからサーバー設定ファイルを編集する必要があります。- 管理対象ドメインで実行している場合は、XML を
EAP_HOME/domain/configuration/domain.xml
ファイルにコピーします。 - スタンドアロンサーバーとして実行している場合は、XML を
EAP_HOME/standalone/configuration/standalone.xml
ファイルにコピーします。
- 新しい設定ファイルで生成された XML を変更します。以下は、JBoss EAP 5.x TestSuite からの
mttestadapter-ds.xml
リソースアダプター設定ファイルの例です。<?xml version="1.0" encoding="UTF-8"?> <!-- ==================================================================== --> <!-- ConnectionManager setup for jboss test adapter --> <!-- Build jmx-api (build/build.sh all) and view for config documentation --> <!-- ==================================================================== --> <connection-factories> <tx-connection-factory> <jndi-name>JBossTestCF</jndi-name> <xa-transaction/> <rar-name>jbosstestadapter.rar</rar-name> <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition> <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property> <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property> <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property> <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property> <config-property name="sleepInStart" type="long">200</config-property> <config-property name="sleepInStop" type="long">200</config-property> </tx-connection-factory> <tx-connection-factory> <jndi-name>JBossTestCF2</jndi-name> <xa-transaction/> <rar-name>jbosstestadapter.rar</rar-name> <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition> <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property> <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property> <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property> <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property> <config-property name="sleepInStart" type="long">200</config-property> <config-property name="sleepInStop" type="long">200</config-property> </tx-connection-factory> <tx-connection-factory> <jndi-name>JBossTestCFByTx</jndi-name> <xa-transaction/> <track-connection-by-tx>true</track-connection-by-tx> <rar-name>jbosstestadapter.rar</rar-name> <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition> <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property> <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property> <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property> <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property> <config-property name="sleepInStart" type="long">200</config-property> <config-property name="sleepInStop" type="long">200</config-property> </tx-connection-factory> </connection-factories>
以下は、Converter スクリプトを実行して生成された設定ファイルです。生成された XML の class-name 属性値 "FIXME_MCF_CLASS_NAME" を、管理接続ファクトリーの正しいクラス名に置き換えます(この場合は "org.jboss.test.jca.adapter.TestManagedConnectionFactory")。以下は、JBoss EAP 6 設定ファイルの生成される XML で<class-name>
要素の値を変更します。<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"> <resource-adapters> <resource-adapter> <archive>jbosstestadapter.rar</archive> <transaction-support>XATransaction</transaction-support> <connection-definitions> <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true" jndi-name="java:jboss/JBossTestCF" pool-name="JBossTestCF" use-ccm="true" use-java-context="true"> --> <connection-definition class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" enabled="true" jndi-name="java:jboss/JBossTestCF" pool-name="JBossTestCF" use-ccm="true" use-java-context="true"> <config-property name="IntegerProperty">2</config-property> <config-property name="sleepInStart">200</config-property> <config-property name="sleepInStop">200</config-property> <config-property name="BooleanProperty">false</config-property> <config-property name="UrlProperty">http://www.jboss.org</config-property> <config-property name="DoubleProperty">5.5</config-property> <pool> <prefill>false</prefill> <use-strict-min>false</use-strict-min> <flush-strategy>FailingConnectionOnly</flush-strategy> </pool> <security> <application/> </security> <timeout/> <validation> <background-validation>false</background-validation> <use-fast-fail>false</use-fast-fail> </validation> </connection-definition> </connection-definitions> </resource-adapter> <resource-adapter> <archive>jbosstestadapter.rar</archive> <transaction-support>XATransaction</transaction-support> <connection-definitions> <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true" jndi-name="java:jboss/JBossTestCF2" pool-name="JBossTestCF2" use-ccm="true" use-java-context="true"> --> <connection-definition class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" enabled="true" jndi-name="java:jboss/JBossTestCF2" pool-name="JBossTestCF2" use-ccm="true" use-java-context="true"> <config-property name="IntegerProperty">2</config-property> <config-property name="sleepInStart">200</config-property> <config-property name="sleepInStop">200</config-property> <config-property name="BooleanProperty">false</config-property> <config-property name="UrlProperty">http://www.jboss.org</config-property> <config-property name="DoubleProperty">5.5</config-property> <pool> <prefill>false</prefill> <use-strict-min>false</use-strict-min> <flush-strategy>FailingConnectionOnly</flush-strategy> </pool> <security> <application/> </security> <timeout/> <validation> <background-validation>false</background-validation> <use-fast-fail>false</use-fast-fail> </validation> </connection-definition> </connection-definitions> </resource-adapter> <resource-adapter> <archive>jbosstestadapter.rar</archive> <transaction-support>XATransaction</transaction-support> <connection-definitions> <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true" jndi-name="java:jboss/JBossTestCFByTx" pool-name="JBossTestCFByTx" use-ccm="true" use-java-context="true"> --> <connection-definition class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" enabled="true" jndi-name="java:jboss/JBossTestCFByTx" pool-name="JBossTestCFByTx" use-ccm="true" use-java-context="true"> <config-property name="IntegerProperty">2</config-property> <config-property name="sleepInStart">200</config-property> <config-property name="sleepInStop">200</config-property> <config-property name="BooleanProperty">false</config-property> <config-property name="UrlProperty">http://www.jboss.org</config-property> <config-property name="DoubleProperty">5.5</config-property> <pool> <prefill>false</prefill> <use-strict-min>false</use-strict-min> <flush-strategy>FailingConnectionOnly</flush-strategy> </pool> <security> <application/> </security> <timeout/> <validation> <background-validation>false</background-validation> <use-fast-fail>false</use-fast-fail> </validation> </connection-definition> </connection-definitions> </resource-adapter> </resource-adapters> </subsystem>
4.2. デバッグ移行の問題
4.2.1. 移行の問題のデバッグおよび解決
4.2.2. debug および Resolve ClassNotFoundExceptions および NoClassDefFoundErrors
概要
ClassNotFoundExceptions は通常、解決できない依存関係が原因で発生します。つまり、他のモジュールの依存関係を明示的に定義するか、外部ソースから JAR をコピーする必要があります。
- まず、不足している依存関係を確認してください。詳細は、以下を参照してください。 「JBoss モジュール依存関係の検索」
- 不足しているクラスのモジュールがない場合は、以前のインストールで JAR を見つけます。詳細はを参照してください。 「以前のインストールで JAR を検索します。」
4.2.3. JBoss モジュール依存関係の検索
EAP_HOME/modules/system/layers/base/
ディレクトリーを参照して ClassNotFoundException
によって指定されたクラスが含まれるモジュールを見つけてみてください。クラスのモジュールが見つかった場合は、依存関係をマニフェストエントリーに追加する必要があります。
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.TopicIndex.war:main" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:188)以下を実行して、このクラスが含まれる JBoss モジュールを見つけます。
手順4.5 依存関係の検索
- まず、クラスに明らかなモジュールが存在するかどうかを判断します。
EAP_HOME/modules/system/layers/base/
ディレクトリーに移動し、ClassNotFoundException
で名前が付けられたモジュールパス一致するクラスを探します。モジュールパスorg/apache/commons/logging/
を見つけます。EAP_HOME/modules/system/layers/base/org/apache/commons/logging/main/module.xml
ファイルを開き、モジュール名を見つけます。この場合、これは "org.apache.commons.logging" になります。MANIFEST.MF
ファイルの Dependencies にモジュール名を追加します。Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
- クラスに明らかなモジュールパスがない場合は、別の場所で依存関係を見つける必要がある場合があります。
- Tattletale レポートで
ClassNotFoundException
によって名前が付けられたクラスを検索します。 EAP_HOME/modules
ディレクトリーに JAR が含まれるモジュールを見つけ、前の手順でモジュール名を見つけます。
4.2.4. 以前のインストールで JAR を検索します。
lib/
ディレクトリーで JAR を見つけます。
ClassNotFoundException
トレースがログに表示される場合は以下のようになります。
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator at java.lang.Class.getDeclaredMethods0(Native Method)以下のコマンドを実行して、このクラスが含まれる JAR を検索します。
- ターミナルを開き、
EAP5_HOME/
ディレクトリーに移動します。 - コマンドを実行します。grep 'org.hibernate.validator.ClassValidator' `find . \-name '*.jar'`
- 複数の結果が表示される場合があります。この場合、以下の結果が必要です。
Binary file ./jboss-eap-5.1/seam/lib/hibernate-validator.jar matches
- この JAR をアプリケーションの
lib/
ディレクトリーにコピーします。多数の JAR が必要な場合は、クラスのモジュールの定義が簡単になります。詳細は、JBoss EAP 6『 『開発ガイド』の「 『スタートガイド』 」の』 章の「 『モジュール』 」を参照して https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4 ください。 - アプリケーションを再ビルドし、再デプロイします。
4.2.5. Debug and Resolve ClassCastExceptions
- アプリケーションを検索し、
ClassCastException
によって名前が付けられたクラスが含まれるすべての JAR を検索します。クラスにモジュールが定義されている場合は、重複した JAR を見つけ、アプリケーションの WAR または EAR から削除します。 - クラスが含まれる JBoss モジュールを見つけ、
MANIFEST.MF
ファイルまたはjboss-deployment-structure.xml
ファイルで依存関係を明示的に定義します。詳細は、JBoss EAP 6 『の 『『開発ガイド』』 の「 『クラスローディングと』 サブデプロイメント』 」を参照して https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4 ください。 - 上記の手順を使用して解決できない場合は、クラスローダー情報をログに出力して問題の原因を判断できます。たとえば、以下の
ClassCastException
がログに表示されます。java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
- コードで、
ClassCastException
によって名前が付けられたクラスのクラスローダー情報をログに出力します。以下に例を示します。logger.info("Class loader for CustomClass1: " + com.example1.CustomClass1.getClass().getClassLoader().toString()); logger.info("Class loader for CustomClass2: " + com.example2.CustomClass2.getClass().getClassLoader().toString());
- ログの情報は、クラスをロードするモジュールを示し、アプリケーションに基づいて競合する JAR を削除または移動する必要があります。
4.2.6. デバッグおよび解決された DuplicateServiceExceptions
- JAR ファイルの名前を WAR 以外の名前に変更すると、生成された Web コンテキストと WAR コンテキストが一意となります。
jboss-web.xml
ファイルに<context-root>
要素を提供します。jboss-webservices.xml
ファイルに<context-root>
要素を提供します。application.xml
ファイルで WAR の<context-root>
要素をカスタマイズします。
4.2.7. JBoss Seam Debug Page エラーのデバッグと解決
図4.1 JBoss Seam Debug ページ
[D]
- ページの
Component
セクションを展開し、org.jboss.seam.caughtException
コンポーネントを見つけます。 - 原因およびスタックトレースは、不足している依存関係を参照するはずです。
図4.2 コンポーネントの
org.jboss.seam.caughtException
情報
[D] - 「debug および Resolve ClassNotFoundExceptions および NoClassDefFoundErrors」 で説明されている技術を使用して、モジュール依存関係を解決します。上記の例では、最もシンプルなソリューションは
org.slf4j
をMANIFEST.MF
に追加することです。Manifest-Version: 1.0 Dependencies: org.slf4j
または、モジュールの依存関係をjboss-deployment-structure.xml
ファイルに追加します。<jboss-deployment-structure> <deployment> <dependencies> <module name="org.slf4j" /> </dependencies> </deployment> </jboss-deployment-structure>
4.3. サンプルアプリケーションの移行の確認
4.3.1. サンプルアプリケーションの移行の確認
概要
以下は、JBoss EAP 6 に移行した JBoss EAP 5.x サンプルアプリケーションのリストです。特定のアプリケーションで変更された内容の詳細を表示するには、以下のリンクをクリックします。
4.3.2. Seam 2.2 JPA の例を JBoss EAP 6 に移行する
概要
以下のタスク一覧は、jb 2.2 JPA サンプルアプリケーションを JBoss EAP 6 に正常に移行するために必要な変更を要約しています。このサンプルアプリケーションは、EAP5. x_HOME /jboss-eap-5.x/seam/examples/jpa/ の下にある最新の JBoss EAP
5 ディストリビューションにあります。
手順4.6 Seam 2.2 JPA の例の移行
jboss-web.xml
ファイルを削除します。jboss-seam-jpa.war/WEB-INF/
ディレクトリーからjboss-web.xml
ファイルを削除します。jboss-web.xml
で定義されたクラスローディングがデフォルトの動作になりました。- 以下のように
jboss-seam-jpa.jar/META-INF/persistence.xml
ファイルを変更します。jboss-seam-jpa.war/WEB-INF/classes/META-INF/persistence.xml
ファイルのhibernate.cache.provider_class
プロパティーを削除またはコメントアウトします。<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
- provider モジュールプロパティーを
jboss-seam-booking.jar/META-INF/persistence.xml
ファイルに追加します。<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
jta-data-source
プロパティーを変更して、デフォルトの JDBC データソースの JNDI 名を使用します。<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
- Seam 2.2 の依存関係を追加します。以下の JAR を Seam 2.2 ディストリビューションライブラリー
SEAM_HOME/lib/
からjboss-seam-jpa.war/WEB-INF/lib/
ディレクトリーにコピーします。- antlr.jar
- slf4j-api.jar
- slf4j-log4j12.jar
- hibernate-entitymanager.jar
- hibernate-core.jar
- hibernate-annotations.jar
- hibernate-commons-annotations.jar
- hibernate-validator.jar
- jboss-deployment-structure ファイルを作成し、残りの依存関係を追加します。
jboss-seam-jpa.war/WEB-INF/
フォルダーに以下のデータが含まれるjboss-deployment-structure.xml
ファイルを作成します。<jboss-deployment-structure> <deployment> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> <module name="org.hibernate" slot="main"/> </exclusions> <dependencies> <module name="org.apache.log4j" /> <module name="org.dom4j" /> <module name="org.apache.commons.logging" /> <module name="org.apache.commons.collections" /> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </deployment> </jboss-deployment-structure>
結果
Seam 2.2 JPA サンプルアプリケーションは JBoss EAP 6 で正常にデプロイされ、実行されます。
4.3.3. Seam 2.2 書籍の JBoss EAP 6 への移行
概要
Seam 2.2 Book、EAR の移行は Seam 2.2 JPA WAR の例よりも複雑です。Seam 2.2 JPA WAR サンプル移行に関するドキュメントは、「Seam 2.2 JPA の例を JBoss EAP 6 に移行する」 を参照してください。アプリケーションを移行するには、以下を行う必要があります。
- デフォルトの JSF 2 の代わりに JSF 1.2 を初期化します。
- JBoss EAP 6 に同梱される旧バージョンを使用するのではなく、古いバージョンの Hibernate JAR をバンドルします。
- JNDI バインディングを変更して、新しい Java EE 6 の JNDI ポータブル構文を使用するようにします。
手順4.7 Seam 2.2 Booking の例の移行
jboss-deployment-structure.xml
ファイルを作成します。jboss-seam-booking.ear/META-INF/
にjboss-deployment-structure.xml
という名前の新規ファイルを作成し、以下の内容を追加します。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.log4j" export="true"/> <module name="org.dom4j" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.apache.commons.collections" export="true"/> </dependencies> <exclusions> <module name="org.hibernate" slot="main"/> </exclusions> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
- 以下のように
jboss-seam-booking.jar/META-INF/persistence.xml
ファイルを変更します。- キャッシュプロバイダークラスの hibernate プロパティーを削除またはコメントアウトします。
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
- provider モジュールプロパティーを
jboss-seam-booking.jar/META-INF/persistence.xml
ファイルに追加します。<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
jta-data-source
プロパティーを変更して、デフォルトの JDBC データソースの JNDI 名を使用します。<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
- Seam 2.2 ディストリビューションから JAR をコピーします。Seam 2.2 ディストリビューション
EAP5.x_HOME /jboss-eap5.x/seam/lib/ から
ディレクトリーに以下の JAR をコピーします。jboss-seam-booking.ear/lib
antlr.jar slf4j-api.jar slf4j-log4j12.jar hibernate-core.jar hibernate-entitymanager.jar hibernate-validator.jar hibernate-annotations.jar hibernate-commons-annotations.jar
- JNDI ルックアップ名を変更します。
jboss-seam-booking.war/WEB-INF/components.xml
ファイルで JNDI ルックアップ文字列を変更します。新しい JNDI ポータブルルールにより、JBoss EAP 6 は JNDI ポータブル構文ルールを使用して EJB をバインドし、JBoss EAP 5 で使用されていた単一の jndiPattern を使用できないようになりました。これは、アプリケーション EJB JNDI ルックアップ文字列を JBoss EAP 6 に変更する必要があるものです。java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching java:app/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching java:module/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction java:app/jboss-seam-booking/HotelSearchingAction java:module/HotelSearchingAction
Seam 2.2 フレームワークの JNDI ルックアップ文字列は、以下のように EJB を変更する必要があります。java:global/jboss-seam-booking/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations java:app/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations java:module/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations java:global/jboss-seam-booking/jboss-seam/EjbSynchronizations java:app/jboss-seam/EjbSynchronizations java:module/EjbSynchronizations
以下の方法の 1 つを使用できます。- コンポーネント要素を追加します。すべての EJB の
jndi-name
をWEB-INF/components.xml
に追加できます。<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/> <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking/AuthenticatorAction" /> <component class="org.jboss.seam.example.booking.BookingListAction" jndi-name="java:app/jboss-seam-booking/BookingListAction" /> <component class="org.jboss.seam.example.booking.RegisterAction" jndi-name="java:app/jboss-seam-booking/RegisterAction" /> <component class="org.jboss.seam.example.booking.HotelSearchingAction" jndi-name="java:app/jboss-seam-booking/HotelSearchingAction" /> <component class="org.jboss.seam.example.booking.HotelBookingAction" jndi-name="java:app/jboss-seam-booking/HotelBookingAction" /> <component class="org.jboss.seam.example.booking.ChangePasswordAction" jndi-name="java:app/jboss-seam-booking/ChangePasswordAction" />
- コードを変更するには、JNDI パスを指定して
@JNDIName(value="")
アノテーションを追加します。変更されたステートレスセッション Bean コードの例を以下に示します。このプロセスの詳細な説明は、jb 2.2 リファレンスドキュメント を参照してください。@Stateless @Name("authenticator") @JndiName(value="java:app/jboss-seam-booking/AuthenticatorAction") public class AuthenticatorAction implements Authenticator { ... }
結果
Seam 2.2 Booking アプリケーションは JBoss EAP 6 で正常にデプロイされ、実行されます。
4.3.4. Seam 2.2 Booking アーカイブを JBoss EAP 6 に移行します: Step-By-Step Instructions
EAP6_HOME/standalone/deployments
ディレクトリーにデプロイされます。これにより、問題が発生した場合にアーカイブに含まれる XML ファイルを簡単に変更し、解決することができます。
手順4.8 アプリケーションの移行
4.3.5. JBoss EAP 5.X バージョンの Seam 2.2 Booking アプリケーションのビルドとデプロイ
手順4.9 EAR のビルドおよびデプロイ
- EAR をビルドします。
$ cd /EAP5_HOME/jboss-eap5.x/seam/examples/booking $ ANT_HOME/ant explode
jboss-eap5.x を、移行する JBoss EAP のバージョンに置き換えます。 - EAR を EAP6_HOME deployments ディレクトリーにコピーします。
$ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.ear EAP6_HOME/standalone/deployments/ $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.war EAP6_HOME/standalone/deployments/jboss-seam.ear $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.jar EAP6_HOME/standalone/deployments/jboss-seam.ear
- JBoss EAP 6 サーバーを起動し、ログを確認します。以下が表示されます。
INFO [org.jboss.as.deployment] (DeploymentScanner-threads - 1) Found jboss-seam-booking.ear in deployment directory. To trigger deployment create a file called jboss-seam-booking.ear.dodeploy
jboss-seam-booking.ear.dodeploy
という名前で空のファイルを作成し、EAP6_HOME/standalone/deployments
ディレクトリーにコピーします。このアプリケーションの移行中にこのファイルを deployments ディレクトリーに複数回コピーする必要があります。これにより、簡単に見つけられる場所に維持する必要があります。ログに以下のメッセージが記録され、デプロイ中であることを示すメッセージが表示されます。INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Starting deployment of "jboss-seam-booking.ear" INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) Starting deployment of "jboss-seam-booking.jar" INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) Starting deployment of "jboss-seam.jar" INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) Starting deployment of "jboss-seam-booking.war"
この時点で、最初のデプロイメントエラーが発生します。次の手順では、各問題を実施し、デバッグして解決する方法を確認します。デプロイメントの問題のデバッグおよび解決方法については、こちらをクリックします。 「アーカイブデプロイメントエラーと例外のデバッグおよび解決」前のトピックに戻るには、ここをクリックしてください。 「Seam 2.2 Booking アーカイブを JBoss EAP 6 に移行します: Step-By-Step Instructions」
4.3.6. アーカイブデプロイメントエラーと例外のデバッグおよび解決
手順4.10 デプロイメントエラーと例外のデバッグおよび解決
- Issue - java.lang.ClassNotFoundException: javax.faces.FacesExceptionアプリケーションをデプロイする場合、ログには以下のエラーが含まれます。
ERROR \[org.jboss.msc.service.fail\] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE: Failed to process phase POST_MODULE of subdeployment "jboss-seam-booking.war" of deployment "jboss-seam-booking.ear" (.. additional logs removed ...) Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException from \[Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader\] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
意味:
ClassNotFoundException は依存関係がないことを示します。この場合、
javax.faces.FacesException
クラスが見つからないため、依存関係を明示的に追加する必要があります。解決方法:
足りないクラスに一致するパスを検索して
、EAP6_HOME/modules/system/layers/base/
ディレクトリーでそのクラスのモジュール名を見つけます。この場合、以下に一致する 2 つのモジュールがあります。javax/faces/api/main javax/faces/api/1.2
両方のモジュールは同じモジュール名javax.faces.api
を持ちますが、メインディレクトリーの 1 つが JSF 2.0 用で、1.2 ディレクトリーにあるものは JSF 1.2 用です。利用可能なモジュールが 1 つしかない場合は、MANIFEST.MF
ファイルを作成し、モジュール依存関係を追加するだけです。ただし、この場合は、main で 2.0 バージョンではなく JSF 1.2 バージョンを使用したい場合は、1 つを指定してもう 1 つのバージョンを除外する必要があります。これには、以下のデータが含まれる EAR のMETA-INF/
ディレクトリーにjboss-deployment-structure.xml
ファイルを作成します。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
deployment
セクションで、JSF 1.2 モジュールのjavax.faces.api
の依存関係を追加します。また、WAR のサブデプロイメントセクションに JSF 1.2 モジュールの依存関係を追加し、JSF 2.0 のモジュールを除外します。EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除し、空の
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。jboss-seam-booking.
ear.dodeploy - Issue - java.lang.ClassNotFoundException: org.apache.commons.logging.Logアプリケーションをデプロイする場合、ログには以下のエラーが含まれます。
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL: Failed to process phase INSTALL of deployment "jboss-seam-booking.ear" (.. additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.jboss-seam-booking.ear.jboss-seam-booking.war:main" from Service Module Loader]
意味:
ClassNotFoundException
は依存関係がないことを示します。この場合、org.apache.commons.logging.Log
クラスが見つからないため、依存関係を明示的に追加する必要があります。解決方法:
足りないクラスに一致するパスを検索して
、EAP6_HOME/modules/system/layers/base/
ディレクトリーでそのクラスのモジュール名を見つけます。この場合、org/apache/commons/logging/
パスに一致する 1 つのモジュールがあります。モジュール名は "org.apache.commons.logging" です。jboss-deployment-structure.xml
ファイルを変更して、モジュール依存関係をファイルの deployment セクションに追加します。<module name="org.apache.commons.logging" export="true"/>
jboss-deployment-structure.xml
は以下のようになります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除し、空の
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。jboss-seam-booking.
ear.dodeploy - issue - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionアプリケーションをデプロイする場合、ログには以下のエラーが含まれます。
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
意味:
ClassNotFoundException
は依存関係がないことを示します。この場合、org.dom4j.DocumentException
クラスが見つかりません。解決方法:
org/dom4j/DocumentException
を参照して、EAP6_HOME/modules/system/layers/base/
ディレクトリーでモジュール名を見つけます。モジュール名は "org.dom4j" です。jboss-deployment-structure.xml
ファイルを変更して、モジュール依存関係をファイルの deployment セクションに追加します。<module name="org.dom4j" export="true"/>
jboss-deployment-structure.xml
ファイルは以下のようになります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除し、空の
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。jboss-seam-booking.
ear.dodeploy - Issue - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueアプリケーションをデプロイする場合、ログには以下のエラーが含まれます。
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
意味:
ClassNotFoundException
は依存関係がないことを示します。この場合、org.hibernate.validator.InvalidValue
クラスが見つかりません。解決方法:
モジュール "org.hibernate.validator" がありますが、JAR には
org.hibernate.validator.InvalidValue
クラスが含まれないため、モジュール依存関係を追加してもこの問題は解決されません。この場合、クラスが含まれる JAR は JBoss EAP 5.X デプロイメントの一部でした。EAP5_HOME/seam/lib/
ディレクトリーに不足しているクラスが含まれる JAR を検索します。これを実行するには、コンソールを開き、以下のコマンドを入力します。$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
結果は以下のようになります。$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matches
この場合は、hibernate-validator.jar
をjboss-seam-booking.ear/lib/
ディレクトリーにコピーします。$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除し、空の
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。jboss-seam-booking.
ear.dodeploy - 問題 - java.lang.InstantiationException: org.jboss.seam.jsf.でApplicationFactoryアプリケーションをデプロイする場合、ログには以下のエラーが含まれます。
INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-7) Unsanitized stacktrace from failed start...: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly. at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:296) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4] (... additional logs removed ...) Caused by: javax.faces.FacesException: org.jboss.seam.jsf.SeamApplicationFactory at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:606) [jsf-api-1.2_13.jar:1.2_13-b01-FCS] (... additional logs removed ...) at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:294) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4] ... 11 more Caused by: java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory at java.lang.Class.newInstance0(Class.java:340) [:1.6.0_25] at java.lang.Class.newInstance(Class.java:308) [:1.6.0_25] at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:604) [jsf-api-1.2_13.jar:1.2_13-b01-FCS] ... 16 more
意味:
com.sun.faces.config.ConfigurationException
およびjava.lang.InstantiationException
は、依存関係の問題を示します。この場合、原因は明確ではありません。解決方法:
com.sun.faces
クラスが含まれるモジュールを見つける必要があります。com.sun.faces
モジュールがありませんが、com.sun.jsf-impl
モジュールが 2 つあります。1.2 ディレクトリーのjsf-impl-1.2_13.jar
を簡単にチェックすると、com.sun.faces
クラスが含まれていることが分かります。javax.faces.FacesException
ClassNotFoundException
では、メインの JSF 2.0 バージョンではなく JSF 1.2 バージョンを使用する必要があるため、1 つを指定して別のバージョンを除外する必要があります。jboss-deployment-structure.xml
を変更して、モジュールの依存関係をファイルの deployment セクションに追加します。また、WAR サブデプロイメントに追加し、JSF 2.0 モジュールを除外する必要があります。ファイルは以下のようになります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除し、空の
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。jboss-seam-booking.
ear.dodeploy - Issue - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackアプリケーションをデプロイする場合、ログには以下のエラーが含まれます。
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader] (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
意味:
ClassNotFoundException
は依存関係がないことを示します。この場合、org.apache.commons.collections.ArrayStack
クラスが見つかりません。解決方法:
org/apache/commons
/ ディレクトリーでモジュール名を見つけます。モジュール名は "org.apache.commons.collections" です。/collections
パスを確認して、EAP6_HOME/modules/system/layers/basejboss-deployment-structure.xml
を変更し、モジュール依存関係をファイルの deployment セクションに追加します。<module name="org.apache.commons.collections" export="true"/>
jboss-deployment-structure.xml
ファイルは以下のようになります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> <module name="org.apache.commons.collections" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除し、空の
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。jboss-seam-booking.
ear.dodeploy - 問題: 利用できない依存関係/利用できない依存関係のあるサービスアプリケーションをデプロイする場合、ログには以下のエラーが含まれます。
ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]"," (... additional logs removed ...) "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
意味:
"Services with missing/unavailable dependencies" エラーが出たら、「missing」後の括弧内のテキストを確認してください。この場合は、以下を確認できます。
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
"/em" はエンティティーマネージャーおよびデータソースの問題を示します。解決方法:
JBoss EAP 6 ではデータソース設定が変更になり、
EAP6_HOME/standalone/configuration/standalone.xml
ファイルで定義する必要があります。JBoss EAP 6 にはstandalone.xml
ファイルにすでに定義されているデータベースのサンプルが含まれるため、persistence.xml
ファイルを変更して、このアプリケーションでこのサンプルデータベースを使用します。standalone.xml
ファイルを見ると、サンプルデータベースのjndi-name
がjava:jboss/datasources/ExampleDS
であることを確認できます。jboss-seam-booking.jar/META-INF/persistence.xml
ファイルを変更して、既存のjta-data-source
要素をコメント化し、以下のように置き換えます。<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除し、空の
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。jboss-seam-booking.
ear.dodeploy - この時点で、アプリケーションはエラーなしでデプロイされますが、ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスし、「Account Login」を試みると、「The page doesn't redirecting properly」というランタイムエラーが表示されます。次の手順では、ランタイムエラーをデバッグし、解決する方法を説明します。ランタイムの問題をデバッグおよび解決する方法については、こちらをクリックします。 「アーカイブランタイムエラーと例外をデバッグおよび解決」前のトピックに戻るには、ここをクリックしてください。 「Seam 2.2 Booking アーカイブを JBoss EAP 6 に移行します: Step-By-Step Instructions」
4.3.7. アーカイブランタイムエラーと例外をデバッグおよび解決
手順4.11 ランタイムエラーと例外のデバッグおよび解決
- Issue - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスすると、「The page doesn't redirecting correctly」が表示され、ログに以下のエラーが表示されます。
SEVERE [org.jboss.seam.jsf.SeamPhaseListener] (http--127.0.0.1-8080-1) swallowing exception: java.lang.IllegalStateException: Could not start transaction at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:598) [jboss-seam.jar:] (... log messages removed ...) Caused by: org.jboss.seam.InstantiationException: Could not instantiate Seam component: org.jboss.seam.transaction.synchronizations at org.jboss.seam.Component.newInstance(Component.java:2170) [jboss-seam.jar:] (... log messages removed ...) Caused by: javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context '' at org.jboss.as.naming.util.NamingUtils.nameNotFoundException(NamingUtils.java:109) (... log messages removed ...)
意味:
NameNotFoundException
は JNDI 命名の問題を示します。JBoss EAP 6 では JNDI の命名規則が変更されたため、ルックアップ名を変更して新しいルールに従う必要があります。解決方法:
これをデバッグするには、サーバーログトレースで以前使用された JNDI バインディングを確認します。以下のサーバーログを確認してください。
15:01:16,138 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named RegisterAction in deployment unit subdeployment "jboss-seam-booking.jar" of deployment "jboss-seam-booking.ear" are as follows: java:global/jboss-seam-booking/jboss-seam-booking.jar/RegisterAction!org.jboss.seam.example.booking.Register java:app/jboss-seam-booking.jar/RegisterAction!org.jboss.seam.example.booking.Register java:module/RegisterAction!org.jboss.seam.example.booking.Register java:global/jboss-seam-booking/jboss-seam-booking.jar/RegisterAction java:app/jboss-seam-booking.jar/RegisterAction java:module/RegisterAction [JNDI bindings continue ...]
ログには合計 8 INFO の JNDI バインディングがリストされています。各セッション Bean には、RegisterAction、BookingListAction、HotelBookingAction、AuthenticatorAction、ChangePasswordAction、HotelSearchingAction、EjbSynchronizations、および TimerServiceDispatcher があります。新しい JNDI バインディングを使用するには、WAR のlib/components.xml
ファイルを変更する必要があります。ログで、EJB JNDI バインディングがすべて「java:app/jboss-seam-booking.jar」で始まることに注意してください。以下のようにcore:init
要素を置き換えます。<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
次に、EjbSynchronizations および TimerServiceDispatcher JNDI バインディングを追加する必要があります。以下のコンポーネント要素をファイルに追加します。<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
components.xml ファイルは以下のようになります。<?xml version="1.0" encoding="UTF-8"?> <components xmlns="http://jboss.com/products/seam/components" xmlns:core="http://jboss.com/products/seam/core" xmlns:security="http://jboss.com/products/seam/security" xmlns:transaction="http://jboss.com/products/seam/transaction" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.2.xsd http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd"> <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/> <core:manager conversation-timeout="120000" concurrent-request-timeout="500" conversation-id-parameter="cid"/> <transaction:ejb-transaction/> <security:identity authenticate-method="#{authenticator.authenticate}"/> <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/> </components>
standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除し、空のjboss-seam-booking.ear.dodeploy
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。 - 問題: アプリケーションはエラーを出さずにデプロイおよび実行を行います。ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスし、ログインしようとすると、「Login failed」というメッセージが表示されて失敗します。トランザクションに失敗しました。" サーバーログに例外トレースが表示されるはずです。
13:36:04,631 WARN [org.jboss.modules] (http-/127.0.0.1:8080-1) Failed to define class org.jboss.seam.persistence.HibernateSessionProxy in Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader: java.lang.LinkageError: Failed to link org/jboss/seam/persistence/HibernateSessionProxy (Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader) .... Caused by: java.lang.LinkageError: Failed to link org/jboss/seam/persistence/HibernateSessionProxy (Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader) ... Caused by: java.lang.NoClassDefFoundError: org/hibernate/engine/SessionImplementor at java.lang.ClassLoader.defineClass1(Native Method) [rt.jar:1.7.0_45] ... Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.SessionImplementor from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader] ...
意味:
ClassNotFoundException は Hibernate ライブラリーがないことを示します。この場合、
hibernate-core.jar
になります。解決方法:
hibernate-core.jar
JAR をEAP5_HOME/seam/lib/
ディレクトリーからjboss-seam-booking.ear/lib
ディレクトリーにコピーします。standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除し、空のjboss-seam-booking.ear.dodeploy
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。 - 問題: アプリケーションはエラーを出さずにデプロイおよび実行を行います。ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスすると、正常にログインできます。ただし、ホテルを予約しようとすると、例外トレースが表示されます。これをデバッグするには、まず true エラーをマスクするために
jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jar
を削除する必要があります。この時点で、以下のエラーが表示されます。java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
意味:
NoClassDefFoundError は Hibernate ライブラリーがないことを示します。
解決方法:
hibernate-annotations.jar
およびhibernate-commons-annotations.jar
JAR をEAP5_HOME/seam/lib/
ディレクトリーからjboss-seam-booking.ear/lib
ディレクトリーにコピーします。standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除し、空のjboss-seam-booking.ear.dodeploy
ファイルを同じディレクトリーに作成してアプリケーションを再デプロイします。 - ランタイムエラーとアプリケーションのエラーは解決されるべきこの時点で、アプリケーションはエラーなしでデプロイおよび実行を行います。前のトピックに戻るには、ここをクリックしてください。 「Seam 2.2 Booking アーカイブを JBoss EAP 6 に移行します: Step-By-Step Instructions」
4.3.8. Seam 2.2 Booking アプリケーションの移行時の変更の概要の確認
- EAR の
META-INF/
ディレクトリーにjboss-deployment-structure.xml
ファイルが作成されている。<dependencies>
を解決するために、<exclusions>
およびClassNotFoundExceptions
を追加している。このファイルには、以下のデータが含まれます。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> <module name="org.apache.commons.collections" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
- 以下の JAR を
EAP5_HOME/jboss-eap-5.X/seam/lib/
ディレクトリー(移行元の EAP 5 のバージョンに置き換えます)からjboss-seam-booking.ear/lib/
ディレクトリーにコピーされ、ClassNotFoundExceptions
を解決します。- hibernate-core.jar
- hibernate-validator.jar
jboss-seam-booking.jar/META-INF/persistence.xml
ファイルを以下のように変更している。- JBoss EAP 6 に同梱される Example データベースを使用するよう
jta-data-source
要素を変更し、以下を行います。<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
- hibernate.cache.provider_class プロパティーをコメントアウトしている。
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
- 新しい JNDI バインディングを使用するよう WAR の
lib/components.xml
ファイルを修正している。- 以下のように
core:init
既存の要素を置き換えている。<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
- 「EjbSynchronizations」および「TimerServiceDispatcher」の JNDI バインディングのコンポーネント要素を追加しました。
<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
付録A 改訂履歴
改訂履歴 | |||
---|---|---|---|
改訂 6.4.0-42 | Thursday November 16 2017 | Red Hat Customer Content Services | |
|