開発ガイド
Red Hat JBoss Enterprise Application Platform 6 向け
概要
第1章 アプリケーション開発の開始 リンクのコピーリンクがクリップボードにコピーされました!
1.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
1.1.1. Red Hat JBoss Enterprise Application Platform 6 リンクのコピーリンクがクリップボードにコピーされました!
1.2. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
1.2.1. Java Enterprise Edition 6 について リンクのコピーリンクがクリップボードにコピーされました!
1.2.1.1. EE 6 プロファイルの概要 リンクのコピーリンクがクリップボードにコピーされました!
1.2.1.2. Java Enterprise Edition 6 Web プロファイル リンクのコピーリンクがクリップボードにコピーされました!
Java EE 6 Web プロファイルの要件
- Java Platform, Enterprise Edition 6
Java Web Technologies
- Servlet 3.0 (JSR 315)
- JSP 2.2 and Expression Language (EL) 1.2
- JavaServer Faces (JSF) 2.1 (JSR 314)
- Java Standard Tag Library (JSTL) for JSP 1.2
- Debugging Support for Other Languages 1.0 (JSR 45)
エンタープライズアプリケーションテクノロジー
- コンテキストおよび依存関係の挿入 (CDI) (JSR 299)
- Dependency Injection for Java (JSR 330)
- Enterprise JavaBeans 3.1 Lite (JSR 318)
- Java Persistence API 2.0 (JSR 317)
- Common Annotations for the Java Platform 1.1 (JSR 250)
- Java Transaction API (JTA) 1.1 (JSR 907)
- Bean Validation (JSR 303)
1.2.1.3. Java Enterprise Edition 6 のフルプロファイル リンクのコピーリンクがクリップボードにコピーされました!
EE 6 フルプロファイルに含まれるアイテム
- EJB 3.1(Lite ではない) (JSR 318)
- Java EE コネクターアーキテクチャー 1.6 (JSR 322)
- Java Message Service (JMS) API 1.1 (JSR 914)
- JavaMail 1.4 (JSR 919)
Web サービステクノロジー
- Jax-RS RESTful Web サービス 1.1 (JSR 311)
- Implementing Enterprise Web Services 1.3 (JSR 109)
- JAX-WS Java API for XML-Based Web Services 2.2 (JSR 224)
- Java Architecture for XML Binding (JAXB) 2.2 (JSR 222)
- Web Services Metadata for the Java Platform (JSR 181)
- Java APIs for XML-based RPC 1.1 (JSR 101)
- Java APIs for XML Messaging 1.3 (JSR 67)
- Java API for XML Registries (JAXR) 1.0 (JSR 93)
管理およびセキュリティーテクノロジー
- Java Authentication Service Provider Interface for Containers 1.0 (JSR 196)
- コンテナー 1.3 の Java 認証契約 (JSR 115)
- Java EE アプリケーションデプロイメント 1.2 (JSR 88)
- J2EE Management 1.1 (JSR 77)
1.2.2. JBoss EAP 6 で使用されるモジュールと新しい Modular Class Loading System について リンクのコピーリンクがクリップボードにコピーされました!
1.2.2.1. モジュール リンクのコピーリンクがクリップボードにコピーされました!
- 静的モジュール
- 静的モジュールは、アプリケーションサーバーの
EAP_HOME/modules/ディレクトリーで事前定義されます。各サブディレクトリーは 1 つのモジュールを表し、設定ファイル (module.xml) と必要な JAR ファイルを含むmain/サブディレクトリーを定義します。モジュールの名前は、module.xmlファイルで定義されています。アプリケーションサーバーが提供するすべての API は、Java EE API や JBoss Logging などの他の API を含む静的モジュールとして提供されます。例1.1 module.xml ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow モジュール名、com.mysql、main/サブディレクトリー名を除いて、モジュールのディレクトリー構造と一致する必要があります。JBoss EAP ディストリビューションで提供されるモジュールは、EAP_HOME/modulesディレクトリー内のsystemディレクトリーにあります。このため、サードパーティーによって提供されるモジュールから分離されます。JBoss EAP 6.1 以降の上にレイヤー化された Red Hat が提供するレイヤード製品も、systemディレクトリー内にモジュールをインストールします。カスタム静的モジュールの作成は、同じサードパーティーライブラリーを使用する同じサーバー上に多くのアプリケーションがデプロイされる場合に役立ちます。これらのライブラリーを各アプリケーションとバンドルする代わりに、JBoss 管理者はこれらのライブラリーが含まれるモジュールを作成およびインストールできます。アプリケーションは、カスタム静的モジュールで明示的な依存関係を宣言できます。モジュールレイアウトごとに 1 つのディレクトリーを使用して、カスタムモジュールがEAP_HOME/modulesディレクトリーにインストールされるようにする必要があります。こうすると、同梱されたバージョンではなく、systemディレクトリーに存在するカスタムバージョンのモジュールがロードされるようになります。これにより、ユーザー提供のモジュールがシステムモジュールよりも優先されます。JBOSS_MODULEPATH環境変数を使用して JBoss EAP がモジュールを検索する場所を変更する場合は、指定された場所の 1 つでsystemサブディレクトリー構造を探します。システム構造体は、JBOSS_MODULEPATHで指定された場所のどこかに存在する必要があります。 - 動的モジュール
- 動的モジュールは、各 JAR または WAR デプロイメント (または、EAR 内のサブデプロイメント) に対してアプリケーションサーバーによって作成およびロードされます。動的モジュールの名前は、デプロイされたアーカイブの名前に由来します。デプロイメントはモジュールとしてロードされるため、依存関係を設定し、他のデプロイメントで依存関係として使用することが可能です。
1.3. 開発環境のセットアップ リンクのコピーリンクがクリップボードにコピーされました!
1.3.1. Red Hat JBoss Developer Studio をダウンロードしてインストールします リンクのコピーリンクがクリップボードにコピーされました!
1.3.1.1. Setup Red Hat JBoss Developer Studio リンクのコピーリンクがクリップボードにコピーされました!
1.3.1.2. Red Hat JBoss Developer Studio のダウンロード リンクのコピーリンクがクリップボードにコピーされました!
- https://access.redhat.com/ にアクセスします。
- ページの上部にあるメニューから を選択します。
- リストから
Red Hat Developer Studioを見つけて、クリックします。 - 適切なバージョンを選択し、 をクリックします。
1.3.1.3. Install Red Hat JBoss Developer Studio リンクのコピーリンクがクリップボードにコピーされました!
手順1.1 Install Red Hat JBoss Developer Studio
- Open a terminal.
- ダウンロードした
.jarファイルを含むディレクトリーに移動します。 - 次のコマンドを実行して、GUI インストーラーを起動します。
java -jar jbdevstudio-build_version.jar
java -jar jbdevstudio-build_version.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow - をクリックして、インストールプロセスを開始します。
- I accept the terms of this license agreement を選択し、 をクリックします。
- インストールパスを調整し、 をクリックします。注記インストールパスフォルダーが存在しない場合は、プロンプトが表示されます。 をクリックしてフォルダーを作成します。
- JVM を選択するか、デフォルトの JVM を選択したままにして、 をクリックします。
- 使用可能なアプリケーションプラットフォームを追加し、 をクリックします。
- インストールの詳細を確認し、 をクリックします。
- インストールプロセスが完了したら、 をクリックします。
- Red Hat JBoss Developer Studio のデスクトップショートカットを設定し、 をクリックします。
- をクリックします。
1.3.1.4. Red Hat JBoss Developer Studio の起動 リンクのコピーリンクがクリップボードにコピーされました!
手順1.2 Red Hat JBoss Developer Studio を起動するコマンド
- Open a terminal.
- インストールディレクトリーに移動します。
- 次のコマンドを実行して、Red Hat JBoss Developer Studio を起動します。
./jbdevstudio
[localhost]$ ./jbdevstudioCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3.1.5. Define New Server を使用して JBossEAP サーバーを追加します リンクのコピーリンクがクリップボードにコピーされました!
手順1.3 サーバーを追加します
- Servers タブを開きます。Servers タブがない場合は、次のようにパネルに追加します。
- → → をクリックします。
- Server フォルダーから Servers を選択し、 をクリックします。
- 以下をクリックします、No servers are available。このリンクをクリックして、新しいサーバーを作成します。または、必要に応じて、空白のサーバーパネル内を右クリックし、 → を選択します。
図1.1 新しいサーバーを追加する - No servers available
- JBoss Enterprise Middleware を展開し、 を選択します。JBoss Enterprise Application Platform 6.4 などのサーバー名を入力し、 をクリックして JBoss ランタイムを作成し、サーバーを定義します。次回新しいサーバーを定義するとき、このダイアログには、新しいランタイム定義を含む Server runtime environment の選択が表示されます。
図1.2 新しいサーバーを定義する
- サーバーの起動と停止を管理するサーバーアダプターを作成します。デフォルトのままにして、 をクリックします。
図1.3 新しいサーバーアダプターを作成する
- JBoss EAP 6.4 Runtime などの名前を入力します。Home Directory で、 をクリックして、JBoss EAP のインストール場所に移動します。 をクリックします。
図1.4 新しいサーバーランタイム環境を追加する
注記一部のクイックスタートでは、別のプロファイルまたは追加の引数を使用してサーバーを実行する必要があります。fullプロファイルを必要とするクイックスタートをデプロイするには、新しいサーバーを定義し、Configuration file にstandalone-full.xmlを指定する Server Runtime Environment を追加する必要があります。新しいサーバーにはわかりやすい名前を付けてください。 - 新しいサーバー用に既存のプロジェクトを設定します。この時点ではプロジェクトがないため、 をクリックします。
図1.5 新しい JBoss サーバーのリソースを変更します
1.4. 最初のアプリケーションを実行する リンクのコピーリンクがクリップボードにコピーされました!
1.4.1. クイックスタートコード例をダウンロードする リンクのコピーリンクがクリップボードにコピーされました!
1.4.1.1. クイックスタートにアクセスする リンクのコピーリンクがクリップボードにコピーされました!
概要
JBoss EAP 6 には、ユーザーが Java EE 6 テクノロジーを使用してアプリケーションを書き始めるのに役立つように設計された一連のクイックスタートの例が付属しています。
前提条件
- Maven 3.0.0 以降。Maven のインストールの詳細は、http://maven.apache.org/download.htmlを参照してください。
- JBoss EAP 6 Maven リポジトリーはオンラインで利用できるため、ローカルにダウンロードしてインストールする必要はありません。オンラインリポジトリーを使用する場合は、次の手順にスキップできます。ローカルリポジトリーをインストールする場合は、以下を参照してください。「JBoss EAP 6 Maven リポジトリーのローカルインストール」。
手順1.4 クイックスタートのダウンロード
- Web ブラウザーを開き、次の URL にアクセスします。https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform。
- リストからクイックスタートを見つけます。
- ボタンをクリックして、例を含む Zip アーカイブをダウンロードします。
- 選択したディレクトリーでアーカイブを解凍します。
結果
JBoss EAP クイックスタートがダウンロードされて解凍されました。各クイックスタートの展開手順については、クイックスタートアーカイブの最上位ディレクトリーにある README.md ファイルを参照してください。
1.4.2. クイックスタートを実行する リンクのコピーリンクがクリップボードにコピーされました!
1.4.2.1. Red Hat JBoss Developer Studio でクイックスタートを実行します リンクのコピーリンクがクリップボードにコピーされました!
手順1.5 クイックスタートを Red Hat JBoss Developer Studio にインポートします
- まだ行っていない場合は、 「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」。
- Red Hat JBoss Developer Studio を起動します。
- メニューから → を選択します。
- 選択リストで、 → を選択し、 をクリックします。
図1.7 既存の Maven プロジェクトのインポート
- テストする予定のクイックスタートのディレクトリー (たとえば、
helloworldクイックスタート) を参照し、 をクリックします。Projects リストボックスに、選択したクイックスタートプロジェクトのpom.xmlファイルが示されます。図1.8 Maven プロジェクトの選択
- をクリックします。
手順1.6 helloworld クイックスタートをビルドしてデプロイする
helloworld クイックスタートは最もシンプルなクイックスタートの 1 つであり、JBoss サーバーが正しく設定され実行されていることを確認するための良い方法です。
- Servers タブが表示されない場合、またはサーバーをまだ定義していない場合は、次の手順に従ってください。「Define New Server を使用して JBossEAP サーバーを追加します」。
fullプロファイルまたは追加のスタートアップ引数を必要とするクイックスタートをデプロイする場合は、クイックスタートの手順に記載されているように、必ずサーバーランタイム環境を作成してください。 - Project Explorer タブで
jboss-helloworldプロジェクトを右クリックし、 を選択します。選択肢のリストが提供されます。 を選択します。図1.9 Run As - Run on Server
- サーバーリストから JBoss EAP 6.1+ Runtime Server を選択し、 をクリックします。
図1.10 Run on Server
- 次の画面には、サーバーで設定されているリソースが表示されます。
jboss-helloworldクイックスタートが設定されています。 をクリックしてクイックスタートをデプロイします。図1.11 サーバーで設定されたリソースの変更
- 結果を表示します。
Serverタブで、JBoss EAP 6.x ランタイムサーバーのステータスが[Started, Republish]に変わります。- サーバーの Console タブには、JBoss EAP 6.x サーバーの起動と helloworld クイックスタートのデプロイメントの詳細を示すメッセージが表示されます。
- URL (http://localhost:8080/jboss-helloworld/HelloWorld) とテキスト Hello World! を示す helloworld タブが表示されます。
- Console の次のメッセージは、
jboss-helloworld.warファイルのデプロイを確認します。登録された Web コンテキストはJBAS018210: Register web context: /jboss-helloworld JBAS018559: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")
JBAS018210: Register web context: /jboss-helloworld JBAS018559: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")Copy to Clipboard Copied! Toggle word wrap Toggle overflow http://localhost:8080に追加され、デプロイされたアプリケーションへのアクセスに使用される URL を提供します。
- JBoss サーバーに正常にデプロイされた
helloworldクイックスタートを確認するには、Web ブラウザーを開き、次の URL でアプリケーションにアクセスします。http://localhost:8080/jboss-helloworld
手順1.7 bean-validation クイックスタート Arquillian テストの実行
bean-validation クイックスタートは、Arquillian テストを提供するクイックスタートの例です。
- 上記の手順に従って、
bean-validationクイックスタートを Red Hat JBoss Developer Studio にインポートします。 - Servers タブでサーバーを右クリックし、 を選択して JBoss EAP サーバーを起動します。Servers タブが表示されない場合、またはサーバーをまだ定義していない場合は、次の手順に従ってください。「Define New Server を使用して JBossEAP サーバーを追加します」。
- Project Explorer タブで
jboss-bean-validationプロジェクトを右クリックし、 を選択します。選択肢のリストが提供されます。 を選択します。 - Edit Configuration ダイアログの Goals 入力フィールドに、次のように入力します clean test -Parq-jbossas-remote。次に、 をクリックします。
図1.12 設定の編集
- 結果を表示します。サーバーの Console タブには、JBoss EAP サーバーの起動と
bean-validationクイックスタート Arquillian テストの出力の詳細を示すメッセージが表示されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.2.2. コマンドラインを使用してクイックスタートを実行する リンクのコピーリンクがクリップボードにコピーされました!
手順1.8 コマンドラインを使用してクイックスタートをビルドおよびデプロイする
- まだ行っていない場合は、 「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」。
- クイックスタートのルートディレクトリーにある
README.htmlファイルを確認します。このファイルには、システム要件、Maven の設定方法、ユーザーの追加方法、およびクイックスタートの実行方法に関する一般的な情報が含まれています。始める前に必ず読んでください。また、利用可能なクイックスタートを一覧表示する表も含まれています。この表には、各クイックスタート名とそれが示すテクノロジーがリストされています。各クイックスタートと、それを設定するために必要な経験のレベルについて簡単に説明します。クイックスタートの詳細は、クイックスタート名をクリックしてください。一部のクイック起動は、他のクイック起動を強化または拡張するように設計されています。これらは、Prerequisitesの列に記載されています。クイックスタートに前提条件がリストされている場合は、クイックスタートを使用する前にまずそれらをインストールする必要があります。一部のクイックスタートでは、オプションのコンポーネントのインストールと設定が必要です。クイックスタートで必要な場合を除いて、これらのコンポーネントをインストールしないでください。 helloworldクイックスタートを実行します。helloworldクイックスタートは最もシンプルなクイックスタートの 1 つであり、JBoss サーバーが正しく設定され実行されていることを確認するための良い方法です。helloworldクイックスタートのルートにあるREADME.htmlファイルを開きます。クイックスタートをビルドしてデプロイし、実行中のアプリケーションにアクセスする方法の詳細な手順が含まれています- 他のクイックスタートを実行します。各クイックスタートのルートフォルダーにある
README.htmlファイルの指示に従って、例を実行します。
1.4.3. クイックスタートチュートリアルを確認する リンクのコピーリンクがクリップボードにコピーされました!
1.4.3.1. helloworld クイックスタート リンクのコピーリンクがクリップボードにコピーされました!
概要
helloworld クイックスタートは JBoss EAP 6 に単純なサーブレットをデプロイする方法を示します。ビジネスロジックは CDI (Contexts and Dependency Injection: コンテキストと依存関係の挿入) Bean として提供されるサービスにカプセル化され、サーブレットに挿入されます。このクイックスタートは非常に簡単です。HelloWorld を Web ページに出力するだけです。サーバーを適切に設定して起動したことを確認することは、良い出発点です。
helloworld クイックスタートをインポートして正常に実行したことを前提としています。
前提条件
- 以下の手順に従って、Red Hat JBossDeveloperStudio をインストールします。「Install Red Hat JBoss Developer Studio」。
- 以下の手順に従って、Red Hat JBoss Developer Studio で使用するように Maven を設定します。「Red Hat JBoss Developer Studio で使用するための Maven の設定」。
- こちらの手順に従って、Red Hat JBoss Developer Studio で
helloworldクイックスタートをインポート、ビルド、およびデプロイします。 「Red Hat JBoss Developer Studio でクイックスタートを実行します」 - Web ブラウザーを開き、次の URL でアプリケーションにアクセスして、
helloworldクイックスタートが JBoss EAP に正常にデプロイされたことを確認します。 http://localhost:8080/jboss-helloworld
手順1.9 ディレクトリー構造の確認
QUICKSTART_HOME/helloworld ディレクトリーにあります。helloworld クイックスタートはサーブレットと CDI Bean によって構成されます。また、JBoss EAP 6 にこのアプリケーションで Bean を検索し、CDI をアクティブ化するように指示する空の beans.xml ファイルも含まれています。
Beans.xmlファイルは、クイックスタートのsrc/main/webapp/ディレクトリーのWEB-INF/フォルダーにあります。src/main/webapp/ディレクトリーには、シンプルなメタリフレッシュを使用してユーザーのブラウザーをサーブレットにリダイレクトするindex.htmlファイルも含まれており、これはhttp://localhost:8080/jboss-helloworld/HelloWorldに配置されています。- この例のすべての設定ファイルは、
WEB-INF/にあります。これは、例のsrc/main/webapp/ディレクトリーにあります。 - クイックスタートには
web.xmlファイルも必要ないことに注意してください。
手順1.10 コードの確認
HelloWorldServlet コードを確認します。
HelloWorldServlet.javaファイルはsrc/main/java/org/jboss/as/quickstarts/helloworld/ディレクトリーにあります。このサーブレットが情報をブラウザーに送ります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表1.1 HelloWorldServlet の詳細 行 注記 43 Java EE 6 より前は、XML ファイルを使用してサーブレットを登録していました。よりきれいになりました。必要な作業は @WebServletアノテーションを追加し、サーブレットにアクセスするために使用する URL にマッピングを提供するだけです。46〜48 各 Web ページには適切な形式の HTML が必要になります。本クイックスタートは静的な文字列を使用して最低限のヘッダーとフッターの出力を書き出します。 50〜51 これらの行は、実際のメッセージを生成する HelloService CDI Bean を挿入します。HelloService の API を変更しない限り、ビューレイヤーを変更せずに HelloService の実装を後で変更することが可能です。 58 この行はサービスを呼び出し、「Hello World」というメッセージを生成して HTTP 要求へ書き出します。 HelloService コードを確認します
HelloService.javaファイルはsrc/main/java/org/jboss/as/quickstarts/helloworld/ディレクトリーにあります。このサービスはとてもシンプルです。メッセージを返します。XML やアノテーションの登録は必要ありません。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.3.2. numberguess クイックスタート リンクのコピーリンクがクリップボードにコピーされました!
概要
このクイックスタートでは、簡単なアプリケーションを作成して JBoss EAP 6 にデプロイする方法を示します。このアプリケーションは情報を保持しません。情報は JSF ビューを使用して表示され、ビジネスロジックは 2 つの CDI (コンテキストと依存性注入) Bean にカプセル化されます。numberguess クイックスタートでは、1 から 100 までの数字を推測する試みが 10 回行われます。数字を選択した後、その数字が正解の数字よりも大きいかまたは小さいかが表示されます。
QUICKSTART_HOME/numberguess ディレクトリーにあります。numberguess クイックスタートは複数の Bean、設定ファイル、および Facelets (JSF) ビューによって構成され、WAR モジュールとしてパッケージ化されています。
numberguess クイックスタートをインポートして正常に実行したことを前提としています。
前提条件
- 以下の手順に従って、Red Hat JBossDeveloperStudio をインストールします。「Install Red Hat JBoss Developer Studio」。
- 以下の手順に従って、Red Hat JBoss Developer Studio で使用するように Maven を設定します。「Red Hat JBoss Developer Studio で使用するための Maven の設定」。
- こちらの手順に従って、Red Hat JBoss Developer Studio で
numberguessクイックスタートをインポート、ビルド、およびデプロイします。 「Red Hat JBoss Developer Studio でクイックスタートを実行します」 - Web ブラウザーを開き、次の URL でアプリケーションにアクセスして、
numberguessクイックスタートが JBoss EAP に正常にデプロイされたことを確認します。 http://localhost:8080/jboss-numberguess
手順1.11 設定ファイルの確認
src/main/webapp/ ディレクトリーにある WEB-INF/ ディレクトリーに配置されています。
faces-config.xmlファイルを確認します。本クイックスタートはfaces-config.xmlファイル名の JSF 2.0 バージョンを使用します。Facelets の標準化されたバージョンは JSF 2.0 のデフォルトのビューハンドラーであるため、実際に設定する必要はありません。JBoss EAP 6 は、ここで JavaEE を超えています。この設定ファイルを含めると、JSF が自動的に設定されます。その結果、設定はルート要素のみで設定されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow beans.xmlファイルを確認します。空のbeans.xmlファイルもあります。これは、JBoss EAP 6 にこのアプリケーションで Bean を検索し、CDI をアクティブ化するように指示します。web.xmlファイルはありませんクイックスタートにはweb.xmlファイルも必要ないことに注意してください。
手順1.12 JSF コードの確認
.xhtml ファイル拡張子を使用しますが、レンダリングされたビューは .jsf 拡張子で提供されます。
home.xhtmlコードを調べます。home.xhtmlファイルはsrc/main/webapp/ディレクトリーにあります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表1.2 JSF の詳細 行 注記 36〜40 これらはユーザーに送信できるメッセージ、「Higher」(より大きい) と「Lower」(より小さい) です。 45〜48 ユーザーが数を選択するごとに数字の範囲が狭まります。有効な数の範囲が分かるようにこの文章は変更されます。 55〜58 この入力フィールドは値式を使用して Bean プロパティーにバインドされます。 58 ユーザーが誤って範囲外の数字を入力しないようにバリデーターのバインディングが使用されます。バリデーターがないと、ユーザーが範囲外の数字を使用する可能性があります。 59〜61 ユーザーの選択した数字をサーバーに送る方法がなければなりません。ここでは、Bean 上のアクションメソッドをバインドします。
手順1.13 クラスファイルの確認
src/main/java/org/jboss/as/quickstarts/numberguess/ ディレクトリーにあります。パッケージの宣言とインポートはこれらのリストからは除外されています。完全リストはクイックスタートのソースコードで確認できます。
Random.java修飾子コードの検証修飾子は、型を基にしたインジェクションの対象となる 2 つの bean 間のあいまいさを取り除くために使用されます。修飾語の詳細については、以下を参照してください。 「修飾子を使用したあいまいなインジェクションの解決」@Random修飾子は乱数のインジェクトに使用されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow MaxNumber.java修飾子コードの検証@MaxNumberqualifierは最大許可数の挿入に使用されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Generator.javaコードの検証Generatorクラスは、プロデューサーメソッドを介して乱数を作成するロールを果たします。また、プロデューサーメソッドを介して可能な最大数を公開します。このクラスはアプリケーションスコープであるため、毎回異なる乱数になることはありません。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Game.javaコードの検証セッションスコープのクラスGameは、アプリケーションの主要なエントリーポイントです。ゲームの設定や再設定、ユーザーが選択する数字のキャプチャーや検証、FacesMessageによるユーザーへのフィードバック提供を行います。コンストラクト後の lifecycle メソッドを使用し、@Random Instance<Integer>bean から乱数を取得することによりゲームを初期化します。このクラスの @Named アノテーションを見てください。このアノテーションは式言語 (EL) を使用して Bean が JSF ビューにアクセスできるようにしたい場合のみ必要です。この場合#{game}が EL になります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.4. デフォルトの Welcome Web アプリケーションの置き換え リンクのコピーリンクがクリップボードにコピーされました!
手順1.14 デフォルトの Welcome Web アプリケーションを独自の Web アプリケーションに置き換える
Welcome アプリケーションを無効にします。
管理 CLI スクリプトEAP_HOME/bin/jboss-cli.shを使用して、次のコマンドを実行します。プロファイルを変更して別の管理対象ドメインを変更するか、スタンドアロンサーバーのコマンドの/profile=default部分を削除する必要があることがあります。/profile=default/subsystem=web/virtual-server=default-host:write-attribute(name=enable-welcome-root,value=false)
/profile=default/subsystem=web/virtual-server=default-host:write-attribute(name=enable-welcome-root,value=false)Copy to Clipboard Copied! Toggle word wrap Toggle overflow ルートコンテキストを使用するよう Web アプリケーションを設定します。
ルートコンテキスト (/) を URL アドレスとして使用するように Web アプリケーションを設定するには、META-INF/またはWEB-INF/ディレクトリーにあるjboss-web.xmlを変更します。その<context-root>ディレクティブを次のようなものに置き換えます。<jboss-web> <context-root>/</context-root> </jboss-web><jboss-web> <context-root>/</context-root> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションをデプロイします。
最初のステップで変更したサーバーグループまたはサーバーにアプリケーションをデプロイします。アプリケーションは現在、http://SERVER_URL:PORT/。
1.4.5. WS-AtomicTransaction の使用 リンクのコピーリンクがクリップボードにコピーされました!
wsat-simple クイックスタートは、Red Hat JBoss Enterprise Application Platform にデプロイするために WAR アーカイブにバンドルされた WS-AT(WS-AtomicTransaction) 対応の JAX-WSWeb サービスのデプロイを示しています。
- サービスは、障害が発生した場合の回復をサポートするために必要なフックを実装していません。
- また、トランザクションバックエンドリソースを利用しません。
- プロトコルに参加する Web サービスは 1 つだけです。WS-AT は 2PC 調整プロトコルであるため、複数の参加者がいるシナリオに最適です。
org.jboss.as.quickstarts.wsat.simple.ClientTest#testCommit() メソッドを実行すると、次の手順が実行されます。
- 新しい Atomic Transaction (AT) がクライアントによって作成されます。
- WS-AT 対応の Web サービスでの操作は、クライアントによって呼び出されます。
- WS クライアントハンドラーチェーンの JaxWSHeaderContextProcessor は、WS-AT コンテキストを送信 SOAP メッセージに挿入します。
- サービスが SOAP 要求を受信すると、ハンドラーチェーン内の JaxWSHeaderContextProcessor が WS-AT コンテキストを検査し、要求をこの AT に関連付けます。
- Web サービス操作が呼び出されます。
- 参加者はこの AT に参加しています。これにより、Web サービスロジックがコミットやロールバックなどのプロトコルイベントに応答できるようになります。
- サービスはビジネスロジックを呼び出します。この場合、レストランへの予約となります。
- バックエンドリソースが準備されます。これにより、コーディネーターから指示されたときに、バックエンドリソースが変更を元に戻したり永続的にしたりできるようになります。
- その後、クライアントは AT をコミットするかロールバックするかを決定できます。クライアントがコミットすることを決定した場合、コーディネーターは 2PC プロトコルを開始します。参加者がロールバックすることを決定した場合、すべての参加者はロールバックするように指示されます。
第2章 Maven ガイド リンクのコピーリンクがクリップボードにコピーされました!
2.1. Maven について リンクのコピーリンクがクリップボードにコピーされました!
2.1.1. Maven リポジトリー リンクのコピーリンクがクリップボードにコピーされました!
http:// やファイルサーバーのリポジトリー用の file:// などの一般的なプロトコルが使用されます。
2.1.2. Maven POM ファイル リンクのコピーリンクがクリップボードにコピーされました!
pom.xml ファイルでは一部の設定オプションを設定する必要があり、他のすべてのオプションはデフォルト値に設定されます。詳細は、 「Maven POM ファイルの最低要件」 を参照してください。
pom.xml ファイルのスキーマは次の場所にあります。http://maven.apache.org/maven-v4_0_0.xsd。
2.1.3. Maven POM ファイルの最低要件 リンクのコピーリンクがクリップボードにコピーされました!
最小要件
pom.xml ファイルの最低要件は次のとおりです。
- プロジェクトルート
- modelVersion
- groupId - プロジェクトのグループの id
- artifactId - アーティファクト (プロジェクト) の id
- version - 指定したグループ下のアーティファクトのバージョン
サンプル pom.xml ファイル
基本的な pom.xml ファイルの例を以下に示します。
2.1.4. Maven 設定ファイル リンクのコピーリンクがクリップボードにコピーされました!
settings.xml ファイルには Maven のユーザー固有の設定情報が含まれています。開発者の ID、プロキシー情報、ローカルリポジトリーの場所、ユーザー固有のその他の設定など、pom.xml ファイルで配布されてはならない情報が含まれます。
settings.xml ファイルが存在する場所は 2 つあります。
- Maven インストール内:
- 設定ファイルは、
M2_HOME/conf/ディレクトリーにあります。これらの設定はglobal設定と呼ばれます。デフォルトの Maven 設定ファイルはコピー可能なテンプレートであり、これを基にユーザー設定ファイルを設定することが可能です。 - ユーザーのインストール内:
- 設定ファイルは、
USER_HOME/.m2/ディレクトリーにあります。Maven とユーザーのsettings.xmlファイルが両方存在する場合、内容はマージされます。重複する内容がある場合は、ユーザーのsettings.xmlファイルが優先されます。
settings.xml ファイルの例です。
settings.xml ファイルのスキーマは次の場所にあります。http://maven.apache.org/xsd/settings-1.0.0.xsd。
2.2. Maven と JBoss Maven リポジトリーをインストールします リンクのコピーリンクがクリップボードにコピーされました!
2.2.1. Maven のダウンロードおよびインストール リンクのコピーリンクがクリップボードにコピーされました!
- Apache Maven Project - Download Maven にアクセスし、ご使用のオペレーティングシステムに対応する最新のディストリビューションをダウンロードします。
- ご使用のオペレーシングシステムに Apache Maven をダウンロードおよびインストールする方法は、Maven のドキュメントを参照してください。
2.2.2. JBoss EAP 6 Maven リポジトリーをインストールします リンクのコピーリンクがクリップボードにコピーされました!
2.2.3. JBoss EAP 6 Maven リポジトリーのローカルインストール リンクのコピーリンクがクリップボードにコピーされました!
概要
JBoss EAP 6 Maven リポジトリーはオンラインで利用できるため、ローカルにダウンロードしてインストールする必要はありません。ただし、JBoss EAP Maven リポジトリーをローカルにインストールする場合は、ローカルファイルシステム、Apache Web サーバー、または Maven リポジトリーマネージャーを使用する 3 つの方法があります。この例では、JBoss EAP 6 Maven リポジトリーをローカルファイルシステムにダウンロードする手順について説明します。このオプションは設定が簡単で、ローカルマシンですぐに実行することができます。開発時における Maven の使用方法を理解することができますが、チームの本番環境では推奨されません。
手順2.1 JBoss EAP 6 Maven リポジトリーをダウンロードしてローカルファイルシステムにインストールします
- Web ブラウザーを開き、次の URL にアクセスします。https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform。
- リストから Red Hat JBoss Enterprise Application Platform VERSION Maven Repository を探します。
- ボタンをクリックして、リポジトリーを含む
.zipファイルをダウンロードします。 - ローカルファイルシステム上のファイルを、選択したディレクトリーに解凍します。
結果
これにより、jboss-eap-version-maven-repository という Maven リポジトリーディレクトリーが作成されます。
settings.xml 設定ファイルで個別に設定する必要があります。各ローカルリポジトリーは、独自の <repository> タグ内で設定する必要があります。
.m2/ ディレクトリーの下にあるキャッシュされた repository/ サブディレクトリーを削除してください。
2.2.4. Apache httpd で使用する JBoss EAP 6 Maven レポジトリーのインストール リンクのコピーリンクがクリップボードにコピーされました!
前提条件
Apache httpd を設定する必要があります。手順は、Apache HTTP Server Project ドキュメンテーションを参照してください。
手順2.2 JBoss EAP 6 Maven リポジトリーの ZIP アーカイブをダウンロードする
- Web ブラウザーを開き、次の URL にアクセスします。https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform。
- リストから Red Hat JBoss Enterprise Application Platform <VERSION> Maven リポジトリーを見つけます。
- ボタンをクリックして、リポジトリーを含む
.zipファイルをダウンロードします。 - Apache サーバー上で Web にアクセス可能なディレクトリーに Zip 形式のファイルを展開します。
- 作成されたディレクトリーで読み取りアクセスとディレクトリーの閲覧を許可するよう Apache を設定します。
結果
これにより、マルチユーザー環境が Apache httpd の Maven リポジトリーにアクセスできるようになります。
2.2.5. JBoss EAP 6 リポジトリーマネージャーを使用して JBoss EAP 6 Maven リポジトリーをインストールします リンクのコピーリンクがクリップボードにコピーされました!
手順2.3 JBoss EAP 6 Maven リポジトリーの ZIP アーカイブをダウンロードする
- Web ブラウザーを開き、次の URL にアクセスします。https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform。
- リストから Red Hat JBoss Enterprise Application Platform <VERSION> Maven リポジトリーを見つけます。
- ボタンをクリックして、リポジトリーを含む
.zipファイルをダウンロードします。 - Nexus をホストしているサーバー上の選択したディレクトリーにファイルを解凍します。
手順2.4 JBoss EAP 6 リポジトリーマネージャーを使用して JBoss EAP 6 Maven リポジトリーを追加します
- 管理者として Nexus にログインします。
- リポジトリーマネージャーの左側にある → メニューから Repositories セクションを選択します。
- Add... ドロップダウンをクリックし、Hosted Repository を選択します。
- 新しいリポジトリーに名前と ID を付けます。
- Override Local Storage するフィールドに、解凍したリポジトリーへのディスク上のパスを入力します。
- アーティファクトをリポジトリーグループで使用できるようにする場合は、続行します。これが希望どおりでない場合は、この手順を続行しないでください。
- リポジトリーグループを選択します。
- Configure タブをクリックします。
- 新しい JBoss Maven リポジトリーを Available Repositories リストから左側の Ordered Group Repositories リストにドラッグします。注記このリストの順序によって、Maven アーティファクトを検索するための優先順位が決まることに注意してください。
結果
リポジトリーは、Nexus Maven リポジトリーマネージャーを使用して設定されます。
2.2.6. Maven リポジトリーマネージャー リンクのコピーリンクがクリップボードにコピーされました!
- ユーザーの組織のリポジトリーとリモート Maven リポジトリーとの間のプロキシーを設定する機能を提供します。これには、デプロイメントの高速化や効率化、Maven によるダウンロード対象を制御するレベルの向上など、さまざまな利点があります。
- 独自に生成したアーティファクトのデプロイ先を提供し、組織内の異なる開発チーム間におけるコラボレーションを可能にします。
一般的に使用される Maven リポジトリーマネージャー
- Sonatype Nexus
- Nexus の詳細については、Sonatype Nexus: アーティファクトの管理 を参照してください。
- Artifactory
- Artifactory の詳細は、Artifactory オープンソース を参照してください。
- Apache Archiva
- Apache Archiva の詳細は、Apache Archiva: The Build Artifact Repository Manager を参照してください。
2.3. Maven リポジトリーの使用 リンクのコピーリンクがクリップボードにコピーされました!
2.3.1. JBoss EAP Maven 6 リポジトリーを設定します リンクのコピーリンクがクリップボードにコピーされました!
概要
プロジェクトで JBoss EAP 6 Maven リポジトリーを使用するよう Maven に指示する方法は 2 つあります。
- リポジトリーを Maven グローバルまたはユーザー設定で設定します。
- リポジトリーをプロジェクトの POM ファイルで設定します。
手順2.5 JBoss EAP 6 Maven リポジトリーを使用するように Maven 設定を設定する
Maven 設定を使用して Maven リポジトリーを設定します
これは、推奨の手法です。リポジトリーマネージャーや共有サーバー上のリポジトリーを使用して Maven を設定すると、プロジェクトの制御および管理を行いやすくなります。また、代替のミラーを使用してプロジェクトファイルを変更せずにリポジトリーマネージャーに特定のリポジトリーのルックアップ要求をすべてリダイレクトすることも可能になります。ミラーの詳細は、http://maven.apache.org/guides/mini/guide-mirror-settings.html を参照してください。プロジェクトの POM ファイルにリポジトリー設定が含まれていない場合、この設定方法はすべての Maven プロジェクトに対して適用されます。プロジェクト POM を使用して Maven リポジトリーを設定します
この設定方法は、通常はお勧めしません。プロジェクトの POM ファイルでリポジトリーを設定する場合は、慎重に計画し、ビルドが遅くなる可能性があり、予期されたリポジトリーからではないアーティファクトが発生する可能性があることに注意してください。注記リポジトリーマネージャーが通常使用されるエンタープライズ環境では、Maven は、このマネージャーを使用してすべてのプロジェクトに対してすべてのアーティファクトを問い合わせる必要があります。Maven は、宣言されたすべてのリポジトリーを使用して不足しているアーティファクトを見つけるため、探しているものが見つからない場合に、central リポジトリー (組み込みの親 POM で定義されます) で検索を試行します。この central の場所をオーバーライドするには、centralで定義を追加してデフォルトの central リポジトリーがリポジトリーマネージャーになるようにします。これは、確立されたプロジェクトには適切ですが、クリーンなプロジェクトや「新しい」プロジェクトの場合は、cyclic 依存関係が作成されるため、問題が発生します。推移的に含まれる POM も、このタイプの設定の問題です。Maven は、これらの外部リポジトリーに欠落しているアーティファクトを照会する必要があります。これにより、ビルドの速度が低下するだけでなく、アーティファクトの発生元を制御できなくなり、ビルドが破損する可能性があります。この設定方法は、設定されたプロジェクトのグローバル設定とユーザー Maven 設定をオーバーライドします。
2.3.2. Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- Maven の設定を変更できます。これにより、Maven はすべてのプロジェクトで設定を使用するように指示されます。
- プロジェクトの POM ファイルを設定できます。これにより、設定が特定のプロジェクトに制限されます。
- ファイルシステム
- file:///path/to/repo/jboss-eap-6.x-maven-repository
- Apache Web Server
- http://intranet.acme.com/jboss-eap-6.x-maven-repository/
- Nexus リポジトリーマネージャー
- https://intranet.acme.com/nexus/content/repositories/jboss-eap-6.x-maven-repository
手順2.6 クイックスタートの例に含まれる設定を使って Maven を設定する
settings.xml ファイルが付属しています。これが最も簡単なアプローチです。
- この手順では、既存の Maven 設定ファイルが上書きされるため、既存の
Mavensettings.xmlファイルをバックアップする必要があります。- オペレーティングシステムの Maven インストールディレクトリーを見つけます。通常、
USER_HOME/.m2/ディレクトリーにインストールされます。- Linux または Mac では、これは
~/.m2/になります。 - Windows の場合、これは次のとおりです。
\Documents and Settings\USER_NAME\.m2\または\Users\USER_NAME\.m2\
- 既存の
USER_HOME/.m2/settings.xmlファイルがある場合は、後で復元できるように、ファイルの名前を変更するか、バックアップコピーを作成します。
- JBoss EAP 6 に付属のクイックスタートの例をダウンロードして解凍します。詳細は、「クイックスタートにアクセスする」 を参照してください
QUICKSTART_HOME/settings.xmlファイルをUSER_HOME/.m2/ディレクトリーにコピーします。- Red Hat JBoss Developer Studio の実行中に
settings.xmlファイルを変更する場合は、以下のタイトルの手順に従ってください。手順2.9「Red Hat JBoss Developer Studio のユーザー設定を更新します」。
手順2.7 Online JBoss EAP 6 Maven リポジトリーを使用するには、Maven 設定を手動で編集および設定します
- オペレーティングシステムの Maven インストールディレクトリーを見つけます。通常、
USER_HOME/.m2/ディレクトリーにインストールされます。- Linux または Mac では、これは
~/.m2/になります。 - Windows の場合、これは
\Documents and Settings\USER_NAME\.m2\または\Users\USER_NAME\.m2\です。
settings.xmlファイルが見つからない場合、settings.xmlファイルをUSER_HOME/.m2/conf/ディレクトリーからUSER_HOME/.m2/ディレクトリへコピーします。- 次の XML を
<profiles>ファイルの要素にコピーします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の XML をsettings.xmlファイルの要素<activeProfiles>にコピーします。<activeProfile>jboss-ga-repository</activeProfile> <activeProfile>jboss-earlyaccess-repository</activeProfile>
<activeProfile>jboss-ga-repository</activeProfile> <activeProfile>jboss-earlyaccess-repository</activeProfile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Red Hat JBoss Developer Studio の実行中に
settings.xmlファイルを変更する場合は、以下のタイトルの手順に従ってください。手順2.9「Red Hat JBoss Developer Studio のユーザー設定を更新します」。
手順2.8 ローカルにインストールされた JBoss EAP リポジトリーを使用するように設定を設定します
- オペレーティングシステムの Maven インストールディレクトリーを見つけます。通常、
USER_HOME/.m2/ディレクトリーにインストールされます。- Linux または Mac では、これは
~/.m2/になります。 - Windows の場合、これは
\Documents and Settings\USER_NAME\.m2\または\Users\USER_NAME\.m2\です。
settings.xmlファイルが見つからない場合、settings.xmlファイルをUSER_HOME/.m2/conf/ディレクトリーからUSER_HOME/.m2/ディレクトリへコピーします。- 次の XML を
settings.xmlファイルの要素<profiles>にコピーします。必ず<url>を実際のリポジトリーの場所に変更するようにしてください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の XML をsettings.xmlファイルの要素<activeProfiles>にコピーします。<activeProfile>jboss-eap-repository</activeProfile>
<activeProfile>jboss-eap-repository</activeProfile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Red Hat JBoss Developer Studio の実行中に
settings.xmlファイルを変更する場合は、以下のタイトルの手順に従ってください。手順2.9「Red Hat JBoss Developer Studio のユーザー設定を更新します」。
手順2.9 Red Hat JBoss Developer Studio のユーザー設定を更新します
settings.xml ファイルを変更する場合は、ユーザー設定を更新する必要があります。
- メニューから、 → を選択します。
- Preferences ウインドウで Maven を展開表示し、User Settings を選択します。
- ボタンをクリックし、Red Hat JBoss Developer Studio で Maven のユーザー設定を更新します。
図2.1 Maven ユーザー設定を更新する
- アーティファクト ARTIFACT_NAME がありません
- [ERROR] Failed to execute goal on project PROJECT_NAME; Could not resolve dependencies for PROJECT_NAME
~/.m2/repository/ サブディレクトリー、Windows の場合は %SystemDrive%\Users\USERNAME\.m2\repository\ サブディレクトリーにあります。
2.3.3. Red Hat JBoss Developer Studio で使用するための Maven の設定 リンクのコピーリンクがクリップボードにコピーされました!
手順2.10 Red Hat JBoss Developer Studio で Maven を設定する
- → の順にクリックし、JBoss Tools を展開して JBoss Maven Integration を選択します。
図2.2 Preferences ウィンドウの JBoss Maven 統合ペイン
- をクリックします。
- をクリックして、JBoss GA Tech Preview Maven リポジトリー を設定します。
Add Maven Repositoryダイアログで以下の手順を実行します。- Profile ID、Repository ID、および Repository Name の値を
jboss-ga-repositoryに設定します。 - Repository URL 値を
http://maven.repository.redhat.com/techpreview/allに設定します。 - チェックボックスをクリックして Maven リポジトリーを有効にします。
- をクリックします。
図2.3 Maven リポジトリーの追加 -JBoss Tech Preview
- をクリックして、JBoss Early Access Maven リポジトリーを設定します。
Add Maven Repositoryダイアログで以下の手順を実行します。- Profile ID、Repository ID、および Repository Name の値を
jboss-earlyaccess-repositoryに設定します。 - Repository URL 値を
http://maven.repository.redhat.com/earlyaccess/all/に設定します。 - チェックボックスをクリックして Maven リポジトリーを有効にします。
- をクリックします。
図2.4 Maven リポジトリーの追加 -JBoss Early Access
- リポジトリーを確認して、 をクリックします。
図2.5 Maven リポジトリーを確認する
- Are you sure you want to update the file MAVEN_HOME/settings.xml? というメッセージが表示されます。 をクリックして設定を更新します。 をクリックしてダイアログを閉じます。これで、JBoss EAP Maven リポジトリーが Red Hat JBoss Developer Studio で使用できるように設定されました。
2.3.4. プロジェクト POM を使用した JBoss EAP 6 Maven リポジトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- Maven の設定を変更できます。
- プロジェクトの POM ファイルを設定できます。
pom.xml にリポジトリー情報を追加して、JBoss EAP 6 Maven リポジトリーを使用するように特定のプロジェクトを設定する方法を示します。この設定方法は、グローバル設定とユーザー設定の設定に優先し、オーバーライドします。
central で定義を追加してデフォルトの central リポジトリーがリポジトリーマネージャーになるようにします。これは、確立されたプロジェクトには適切ですが、クリーンなプロジェクトや「新しい」プロジェクトの場合は、cyclic 依存関係が作成されるため、問題が発生します。
- ファイルシステム
- file:///path/to/repo/jboss-eap-6.x-maven-repository
- Apache Web Server
- http://intranet.acme.com/jboss-eap-6.x-maven-repository/
- Nexus リポジトリーマネージャー
- https://intranet.acme.com/nexus/content/repositories/jboss-eap-6.x-maven-repository
- テキストエディターでプロジェクトの
pom.xmlファイルを開きます。 - 次のリポジトリー設定を追加します。ファイル内にすでに
<repositories>の設定がある場合は、それに<repository>の要素を追加します。必ず<url>を実際のリポジトリーの場所に変更するようにしてください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のプラグインリポジトリー設定を追加します。ファイル内にすでに
<pluginRepositories>の設定がある場合は、それに<pluginRepository>の要素を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3.5. プロジェクト依存関係の管理 リンクのコピーリンクがクリップボードにコピーされました!
pom.xml (POM) ファイルです。バージョン依存関係は、ファイルの依存関係管理セクションにリストされています。
pom.xml ファイルの依存関係管理セクションに groupId:artifactId:version (GAV) を追加し、<scope>import</scope>と<type>pom</type>の要素値を指定することで BOM を使用します。
provided スコープが使用されます。これは、これらのクラスが実行時にアプリケーションサーバーによって提供され、ユーザーアプリケーションとともにパッケージ化する必要がないためです。
サポート対象の Maven アーティファクト
1.0.0-redhat-1 のように使用される -redhat バージョン修飾子によって簡単に識別可能です。
pom.xml ファイルに追加すると、ローカルビルドおよびテスト向けの適切なバイナリーアーティファクトがビルドで使用されるようになります。-redhat バージョンのアーティファクトは、サポートされるパブリック API の一部とは限らず、今後の改訂で変更されることがあります。サポートされるパブリック API の詳細は、本リリースに含まれる JavaDoc ドキュメント を参照してください。
<version/>のフィールドに値が含まれていることに注意してください。ただし、依存関係バージョンの設定には、Maven の依存関係管理を使用することが推奨されます。
依存関係管理
JBoss JavaEE Specs Bom
jboss-javaee-6.0BOM には、JBoss EAP で使用される Java EE 仕様 API JAR が含まれています。
jboss-javaee-6.0BOM の 3.0.2.Final-redhat-x バージョンを使用しています。
JBoss EAP とクイックスタート
| Maven artifactId | Description |
|---|---|
| jboss-javaee-6.0-with-hibernate | この BOM は、Java EE フルプロファイル BOM に基づいて構築されており、Hibernate ORM、Hibernate Search、HibernateValidator などの Hibernate コミュニティープロジェクトが追加されています。また、Hibernate JPA Model Gen や Hibernate Validator Annotation Processor などのツールプロジェクトも提供します。 |
| jboss-javaee-6.0-with-hibernate3 | この BOM は、Java EE フルプロファイル BOM に基づいて構築されており、Hibernate 3 ORM、Hibernate Entity Manager (JPA 1.0)、Hibernate Validator などの Hibernate コミュニティープロジェクトが追加されています。 |
| jboss-javaee-6.0-with-logging | この BOM は、Java EE フルプロファイル BOM に基づいて構築されており、JBoss Logging Tools と Log4j フレームワークが追加されています。 |
| jboss-javaee-6.0-with-osgi | この BOM は、Java EE フルプロファイル BOM に基づいて構築されており、OSGI が追加されています。 |
| jboss-javaee-6.0-with-resteasy | この BOM は、Java EE フルプロファイル BOM に基づいて構築されており、RESTEasy が追加されています。 |
| jboss-javaee-6.0-with-security | この BOM は、Java EE フルプロファイル BOM に基づいて構築されており、Picketlink が追加されています。 |
| jboss-javaee-6.0-with-tools | この BOM は、Java EE フルプロファイル BOM に基づいて構築されており、Arquillian がミックスに追加されています。また、Arquillian での使用が推奨されるバージョンの JUnit と TestNG も提供します。 |
| jboss-javaee-6.0-with-transactions | この BOM には、ワールドクラスのトランザクションマネージャーが含まれています。JBossTS API を使用して、その全機能にアクセスします。 |
6.4.0.GA バージョンのjboss-javaee-6.0-with-hibernateBOM。
JBoss クライアント BOM
jboss-as-ejb-client-bom と jboss-as-jms-client-bom の 2 つのクライアント BOM が含まれています。
7.4.0.Final-redhat-x バージョンのjboss-as-ejb-client-bomクライアント BOM。
7.4.0.Final-redhat-x バージョンのjboss-as-jms-client-bomクライアント BOM。
2.4. Maven リポジトリーをアップグレードする リンクのコピーリンクがクリップボードにコピーされました!
2.4.1. ローカル Maven リポジトリーにパッチを適用する リンクのコピーリンクがクリップボードにコピーされました!
概要
Maven リポジトリーには、アプリケーションをビルドして JBoss EAP にデプロイするために必要な Java ライブラリー、プラグイン、およびその他のアーティファクトが保管されます。JBoss EAP リポジトリーはオンラインで利用でき、ダウンロードした ZIP ファイルとして使用することもできます。パブリックにホストされているリポジトリーを使用する場合、更新は自動的に適用されます。ただし、Maven リポジトリーをローカルにダウンロードしてインストールする場合は、更新を適用する責任があります。JBoss EAP のパッチが利用可能な場合は常に、対応するパッチが JBoss EAP Maven リポジトリーに提供されます。このパッチは、既存のローカルリポジトリーで展開される増分 ZIP ファイルで提供されます。ZIP ファイルには、新しい JAR ファイルと POM ファイルが含まれています。既存の JAR を上書きしたり、JAR を削除したりすることはないため、ロールバックの要件はありません。
前提条件
- Red Hat カスタマーポータルへの有効なアクセスおよびサブスクリプション。
- Red Hat JBoss Enterprise Application Platform <VERSION> Maven リポジトリーの ZIP ファイル。ローカルにダウンロードおよびインストールされます。
手順2.11 Maven リポジトリーを更新します
- ブラウザーを開き、https://access.redhat.comにログインします。
- ページの上部にあるメニューから を選択します。
- リストで
Red Hat JBoss Enterprise Application Platformを見つけ、クリックします。 - この画面に表示される Version ドロップダウンメニューから JBoss EAP の正しいバージョンを選択し、Patches をクリックします。
- リストから
Red Hat JBoss Enterprise Application Platform <VERSION> CPx Incremental Maven Repositoryを見つけ、 をクリックします。 - 選択したディレクトリーに ZIP ファイルを保存するように求められます。ディレクトリーを選択してファイルを保存します。
- オペレーティングシステムの JBoss EAP リポジトリーへのパス (以下のコマンドで EAP_MAVEN_REPOSITORY_PATH と呼ばれる) を見つけます。Maven リポジトリーをローカルファイルシステムにインストールする方法の詳細については、「JBoss EAP 6 Maven リポジトリーのローカルインストール」を参照してください。
- Maven パッチファイルを JBoss EAP <VERSION>.x Maven リポジトリーのインストールディレクトリーに直接解凍します。
- Linux の場合は、ターミナルを開き、次のコマンドを入力します。
[standalone@localhost:9999 /] unzip -o jboss-eap-<VERSION>.x-incremental-maven-repository.zip -d EAP_MAVEN_REPOSITORY_PATH
[standalone@localhost:9999 /] unzip -o jboss-eap-<VERSION>.x-incremental-maven-repository.zip -d EAP_MAVEN_REPOSITORY_PATHCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Windows の場合は、Windows 展開ユーティリティーを使用して ZIP ファイルを
EAP_MAVEN_REPOSITORY_PATHディレクトリーのルートに展開します。
結果
ローカルにインストールされた Maven リポジトリーは、最新のパッチで更新されます。
第3章 クラスローディングとモジュール リンクのコピーリンクがクリップボードにコピーされました!
3.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
3.1.1. クラスロードとモジュールの概要 リンクのコピーリンクがクリップボードにコピーされました!
3.1.2. クラスの読み込み リンクのコピーリンクがクリップボードにコピーされました!
3.1.3. モジュール リンクのコピーリンクがクリップボードにコピーされました!
- 静的モジュール
- 静的モジュールは、アプリケーションサーバーの
EAP_HOME/modules/ディレクトリーで事前定義されます。各サブディレクトリーは 1 つのモジュールを表し、設定ファイル (module.xml) と必要な JAR ファイルを含むmain/サブディレクトリーを定義します。モジュールの名前は、module.xmlファイルで定義されています。アプリケーションサーバーが提供するすべての API は、Java EE API や JBoss Logging などの他の API を含む静的モジュールとして提供されます。例3.1 module.xml ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow モジュール名、com.mysql、main/サブディレクトリー名を除いて、モジュールのディレクトリー構造と一致する必要があります。JBoss EAP ディストリビューションで提供されるモジュールは、EAP_HOME/modulesディレクトリー内のsystemディレクトリーにあります。このため、サードパーティーによって提供されるモジュールから分離されます。JBoss EAP 6.1 以降の上にレイヤー化された Red Hat が提供するレイヤード製品も、systemディレクトリー内にモジュールをインストールします。カスタム静的モジュールの作成は、同じサードパーティーライブラリーを使用する同じサーバー上に多くのアプリケーションがデプロイされる場合に役立ちます。これらのライブラリーを各アプリケーションとバンドルする代わりに、JBoss 管理者はこれらのライブラリーが含まれるモジュールを作成およびインストールできます。アプリケーションは、カスタム静的モジュールで明示的な依存関係を宣言できます。モジュールレイアウトごとに 1 つのディレクトリーを使用して、カスタムモジュールがEAP_HOME/modulesディレクトリーにインストールされるようにする必要があります。こうすると、同梱されたバージョンではなく、systemディレクトリーに存在するカスタムバージョンのモジュールがロードされるようになります。これにより、ユーザー提供のモジュールがシステムモジュールよりも優先されます。JBOSS_MODULEPATH環境変数を使用して JBoss EAP がモジュールを検索する場所を変更する場合は、指定された場所の 1 つでsystemサブディレクトリー構造を探します。システム構造体は、JBOSS_MODULEPATHで指定された場所のどこかに存在する必要があります。 - 動的モジュール
- 動的モジュールは、各 JAR または WAR デプロイメント (または、EAR 内のサブデプロイメント) に対してアプリケーションサーバーによって作成およびロードされます。動的モジュールの名前は、デプロイされたアーカイブの名前に由来します。デプロイメントはモジュールとしてロードされるため、依存関係を設定し、他のデプロイメントで依存関係として使用することが可能です。
3.1.4. モジュールの依存性 リンクのコピーリンクがクリップボードにコピーされました!
明示的な依存関係
明示的な依存関係は開発者が設定ファイルで宣言します。静的モジュールは、module.xml ファイルで依存関係を宣言できます。動的モジュールは、デプロイメントの MANIFEST.MF または jboss-deployment-structure.xml デプロイメント記述子で宣言された依存関係を持つことができます。
暗黙的な依存関係
デプロイメントで特定の条件またはメタデータが検出されると、アプリケーションサーバーによって暗黙の依存関係が自動的に追加されます。JBoss EAP 6 に同梱される Java EE 6 API は、デプロイメントで暗黙的な依存関係が検出されたときに追加されるモジュールの例になります。
jboss-deployment-structure.xml デプロイメント記述子ファイルを使用して行われます。これは通常、アプリケーションサーバーが暗黙的な依存関係として追加しようとする特定のバージョンのライブラリーをアプリケーションがバンドルする場合に行われます。
例3.2 モジュールの依存関係
- モジュール A がモジュール C への明示的な依存関係を宣言する場合。
- または、モジュール B がモジュール B の依存関係をモジュール C でエクスポートする場合。
3.1.5. デプロイメントでのクラスローディング リンクのコピーリンクがクリップボードにコピーされました!
- WAR デプロイメント
- WAR デプロイメントは 1 つのモジュールとして考慮されます。
WEB-INF/libディレクトリーのクラスはWEB-INF/classesディレクトリーにあるクラスと同じように処理されます。WAR にパッケージされているクラスはすべて、同じクラスローダーでロードされます。 - EAR デプロイメント
- EAR デプロイメントは、複数のモジュールで設定されています。これらのモジュールの定義は、次のルールに従います。
- EAR の
lib/ディレクトリーは親モジュールと呼ばれる 1 つのモジュールです。 - また、EAR 内の各 WAR デプロイメントは 1 つのモジュールです。
- 同様に、EAR 内の EJB JAR デプロイメントも 1 つのモジュールです。
サブデプロイメントモジュール (EAR 内の WAR および JAR デプロイメント) は、自動的に親モジュールに依存しますが、サブデプロイメントモジュール同士が自動的に依存するわけではありません。ただし、相互で自動的な依存関係はありません。これはサブデプロイメントの分離と呼ばれ、デプロイメントごとに、またはアプリケーションサーバー全体に対して無効にすることができます。サブデプロイメントモジュール間の明示的な依存関係は、他のモジュールと同じ方法で追加することが可能です。
3.1.6. クラスローディングの優先順位 リンクのコピーリンクがクリップボードにコピーされました!
- 暗黙的な依存関係これらは、JAVA EE API などの JBoss EAP 6 によって自動的に追加される依存関係です。これらの依存関係には一般的な機能や JBoss EAP 6 によって提供される API が含まれるため、これらの依存関係のクラスローダー優先順位は最も高くなります。各暗黙的依存関係の詳細は、「暗黙的なモジュール依存関係」を参照してください。
- 明示的な依存関係これらは、アプリケーション設定に手動で追加される依存関係です。これは、アプリケーションの
MANIFEST.MFファイルまたは新しいオプションの JBoss デプロイメント記述子jboss-deployment-structure.xmlファイルを使用して実行できます。明示的に依存関係を追加する方法は、「デプロイメントへの明示的なモジュール依存関係の追加」を参照してください。 - ローカルリソースデプロイメント自体の内部にパッケージ化されたクラスファイル。たとえば、WAR ファイルの
WEB-INF/classesまたはWEB-INF/libディレクトリーにあるものです。 - デプロイメント間の依存関係これらは、EAR デプロイメント内の他のデプロイメントへの依存関係です。これには、EAR の
libディレクトリーにあるクラスや他の EJB jar で定義されたクラスが含まれることがあります。
3.1.7. 動的モジュールの名前付け リンクのコピーリンクがクリップボードにコピーされました!
- WAR および JAR ファイルのデプロイメントは次の形式で名前が付けられます。
deployment.DEPLOYMENT_NAME
deployment.DEPLOYMENT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 例えば、inventory.warとstore.jarは、それぞれdeployment.inventory.warとdeployment.store.jarというモジュール名を持ちます。 - エンタープライズアーカイブ内のサブデプロイメントは次の形式で名前が付けられます。
deployment.EAR_NAME.SUBDEPLOYMENT_NAME
deployment.EAR_NAME.SUBDEPLOYMENT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、エンタープライズアーカイブaccounts.ear内のreports.warのサブデプロイメントには、deployment.accounts.ear.reports.warというモジュール名が付きます。
3.1.8. jboss-deployment-structure.xml リンクのコピーリンクがクリップボードにコピーされました!
jboss-deployment-structure.xml は JBoss EAP 6 の新しい任意のデプロイメント記述子です。このデプロイメント記述子を使用すると、デプロイメントでクラスローディングを制御できます。
EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd にあります。
3.2. デプロイメントへの明示的なモジュール依存関係の追加 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- モジュールの依存関係を追加する作業用ソフトウェアプロジェクトがすでにある必要があります。
- 依存関係として追加するモジュールの名前を知っている必要があります。JBoss EAP 6 に含まれる静的モジュールの一覧は、「含まれるモジュール」を参照してください。モジュールが他のデプロイメントである場合は、「動的モジュールの名前付け」を参照してモジュール名を決定してください。
- デプロイメントの
MANIFEST.MFファイルにエントリーを追加します。 jboss-deployment-structure.xmlデプロイメント記述子にエントリーを追加します。
手順3.1 MANIFEST.MF への依存関係設定の追加
MANIFEST.MF ファイルの必要な依存関係エントリーを作成するよう Maven プロジェクトを設定できます。「Maven を使用した MANIFEST.MF エントリーの生成」を参照してください。
MANIFEST.MFファイルを追加しますプロジェクトにMANIFEST.MFファイルがない場合、MANIFEST.MFというファイルを作成します。Web アプリケーション (WAR) では、このファイルをMETA-INFディレクトリーに追加します。EJB アーカイブ (JAR) では、このファイルをMETA-INFディレクトリーに追加します。依存関係エントリーを追加
依存関係モジュール名をコンマで区切り、依存関係エントリーをMANIFEST.MFファイルへ追加します。Dependencies: org.javassist, org.apache.velocity
Dependencies: org.javassist, org.apache.velocityCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 依存関係をオプションにします
依存関係は、依存関係エントリーのモジュール名にoptionalを追加することでオプションにすることができます。Dependencies: org.javassist optional, org.apache.velocity
Dependencies: org.javassist optional, org.apache.velocityCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 依存関係をエクスポートします
依存関係エントリーのモジュール名にexportを付けると、依存関係をエクスポートすることができます。Dependencies: org.javassist, org.apache.velocity export
Dependencies: org.javassist, org.apache.velocity exportCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: アノテーションを使用した依存関係
この annotations フラグは、EJB インターセプターを宣言するときなど、アノテーションのスキャン中に処理する必要があるアノテーションがモジュールの依存関係に含まれる場合に必要になります。これを行わないと、モジュールで宣言された EJB インターセプターをデプロイメントで使用できなくなります。アノテーションのスキャンが関係するその他の状況でも、この設定が必要になる場合があります。このフラグを使用するには、モジュールに Jandex インデックスが含まれている必要があります。Jandex インデックスを作成および使用するための手順は、このトピックの最後に含まれています。
手順3.2 依存関係設定を jboss-deployment-structure.xml に追加します
jboss-deployment-structure.xmlの追加アプリケーションにjboss-deployment-structure.xmlファイルがない場合は、jboss-deployment-structure.xmlという名前の新しいファイルを作成し、プロジェクトに追加します。このファイルは、ルート要素が<jboss-deployment-structure>である XML ファイルです。<jboss-deployment-structure> </jboss-deployment-structure>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Web アプリケーション (WAR) では、このファイルをWEB-INFディレクトリーに追加します。EJB アーカイブ (JAR) では、このファイルをMETA-INFディレクトリーに追加します。依存関係セクションを追加
ドキュメントルート内に<deployment>要素を作成し、その中に<dependencies>要素を作成します。モジュール要素を追加する
dependencies ノード内に各モジュールの依存関係に対するモジュール要素を追加します。name属性にモジュール名を設定します。<module name="org.javassist" />
<module name="org.javassist" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 依存関係をオプションにします
依存関係をオプションにするには、optional属性をモジュールエントリーに追加し、値をtrueにします。この属性のデフォルト値はfalseです。<module name="org.javassist" optional="true" />
<module name="org.javassist" optional="true" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 依存関係をエクスポートします
依存関係をエクスポートするには、export属性をモジュールエントリーに追加し、値をtrueにします。この属性のデフォルト値はfalseです。<module name="org.javassist" export="true" />
<module name="org.javassist" export="true" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例3.3 2 つの依存関係を持つ jboss-deployment-structure.xml
Jandex インデックスの作成
annotations フラグは Jandex インデックスが含まれるモジュールを必要とします。モジュールに追加する新しいインデックス JAR を作成できます。Jandex JAR を使用してインデックスを構築し、新しい JAR ファイルに挿入します。
手順3.3
インデックスの作成
java -jar EAP_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar $JAR_FILE
java -jar EAP_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar $JAR_FILECopy to Clipboard Copied! Toggle word wrap Toggle overflow 一時作業領域の作成
mkdir /tmp/META-INF
mkdir /tmp/META-INFCopy to Clipboard Copied! Toggle word wrap Toggle overflow インデックスファイルを作業ディレクトリーに移動します。
mv $JAR_FILE.ifx /tmp/META-INF/jandex.idx
mv $JAR_FILE.ifx /tmp/META-INF/jandex.idxCopy to Clipboard Copied! Toggle word wrap Toggle overflow - オプション 1: インデックスを新しい JAR ファイルに含めます。
jar cf index.jar -C /tmp META-INF/jandex.idx
jar cf index.jar -C /tmp META-INF/jandex.idxCopy to Clipboard Copied! Toggle word wrap Toggle overflow JAR をモジュールディレクトリーに置き、module.xmlを編集してリソースルートへ追加します。 - オプション 2: インデックスを既存の JAR に追加します。
java -jar EAP_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar -m $JAR_FILE
java -jar EAP_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar -m $JAR_FILECopy to Clipboard Copied! Toggle word wrap Toggle overflow
モジュールのインポートに注釈インデックスを利用するように指示します
アノテーションインデックスを使用するようモジュールインポートに指示し、アノテーションのスキャンでアノテーションを見つけられるようにします。状況に応じて、以下のいずれかの方法を選択してください。- MANIFEST.MF を使用してモジュールの依存関係を追加する場合は、
annotationsをモジュール名の後に追加します。例を以下に示します。Dependencies: test.module, other.module
Dependencies: test.module, other.moduleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 上記を以下のように変更します。Dependencies: test.module annotations, other.module
Dependencies: test.module annotations, other.moduleCopy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xmlを使用してモジュールの依存関係を追加する場合は、モジュールの依存関係にannotations="true"を追加します。
3.3. Maven を使用した MANIFEST.MF エントリーの生成 リンクのコピーリンクがクリップボードにコピーされました!
Dependenciesエントリーを含む MANIFEST.MF ファイルを生成することができます。これは依存関係のリストを自動的に生成するのではなく、このプロセスは pom.xml で指定された内容で MANIFEST.MF ファイルを作成するのみです。
前提条件
- 作業用の Maven プロジェクトがすでに存在している必要があります。
- Maven プロジェクトは、JAR、EJB、または WAR プラグインのいずれかを使用している必要があります (
maven-jar-plugin、maven-ejb-plugin、maven-war-plugin)。 - プロジェクトのモジュール依存関係の名前を知っている必要があります。JBoss EAP 6 に含まれる静的モジュールの一覧は、「含まれるモジュール」を参照してください。モジュールが他のデプロイメントである場合、「動的モジュールの名前付け」を参照してモジュール名を決定します。
手順3.4 モジュール依存関係が含まれる MANIFEST.MF ファイルの生成
設定の追加
プロジェクトのpom.xmlファイルにあるパッケージングプラグイン設定に次の設定を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 依存関係のリスト
<Dependencies>要素に、モジュールの依存関係のリストを追加します。MANIFEST.MFファイルに依存関係を追加するときと同じ形式を使用します。そのフォーマットの詳細については、「デプロイメントへの明示的なモジュール依存関係の追加」を参照してください。<Dependencies>org.javassist, org.apache.velocity</Dependencies>
<Dependencies>org.javassist, org.apache.velocity</Dependencies>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、optional属性とexport属性を使用することもできます。<Dependencies>org.javassist optional, org.apache.velocity export</Dependencies>
<Dependencies>org.javassist optional, org.apache.velocity export</Dependencies>Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロジェクトをビルドします。
Maven アセンブリーゴールを使用してプロジェクトをビルドします。mvn assembly:assembly
[Localhost ]$ mvn assembly:assemblyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
MANIFEST.MF ファイルが最終アーカイブに含まれます。
例3.4 pom.xml で設定されたモジュールの依存関係
3.4. モジュールが暗黙的にロードされないようにする リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- 暗黙の依存関係を除外したいソフトウェアプロジェクトがすでに機能している必要があります。
- 除外するモジュール名を知っている必要があります。暗黙の依存関係とその条件の一覧は、「暗黙的なモジュール依存関係」を参照してください。
手順3.5 jboss-deployment-structure.xml への依存関係除外設定の追加
- アプリケーションに
jboss-deployment-structure.xmlファイルがない場合は、jboss-deployment-structure.xmlという名前の新しいファイルを作成し、プロジェクトに追加します。このファイルは、ルート要素が<jboss-deployment-structure>である XML ファイルです。<jboss-deployment-structure> </jboss-deployment-structure>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Web アプリケーション (WAR) では、このファイルをWEB-INFディレクトリーに追加します。EJB アーカイブ (JAR) では、このファイルをMETA-INFディレクトリーに追加します。 - ドキュメントルート内に
<deployment>要素を作成し、その中に<exclusions>要素を作成します。<deployment> <exclusions> </exclusions> </deployment>
<deployment> <exclusions> </exclusions> </deployment>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - exclusions 要素内で、除外する各モジュールに対して
<module>要素を追加します。name属性にモジュール名を設定します。<module name="org.javassist" />
<module name="org.javassist" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例3.5 2 つのモジュールを除く
3.5. サブシステムをデプロイメントから除外 リンクのコピーリンクがクリップボードにコピーされました!
概要
このトピックでは、サブシステムをデプロイメントから除外するために必要な手順について説明します。これは、jboss-deployment-structure.xml 設定ファイルを編集することによって行われます。サブシステムの除外は、サブシステムの削除と同じ効果がありますが、単一のデプロイメントにのみ適用されます。
手順3.6 サブシステムの除外
- テキストエディターで
jboss-deployment-structure.xmlファイルを開きます。 - <deployment> タグ内に以下の XML を追加します。
<exclude-subsystems> <subsystem name="SUBSYSTEM_NAME" /> </exclude-subsystems>
<exclude-subsystems> <subsystem name="SUBSYSTEM_NAME" /> </exclude-subsystems>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xmlファイルを保存します。
結果
サブシステムは正常に除外されました。サブシステムのデプロイメントユニットプロセッサーがデプロイメント上で実行されなくなります。
例3.6 例: jboss-deployment-structure.xml ファイル
3.6. デプロイメントでのプログラムを用いたクラスローダーの使用 リンクのコピーリンクがクリップボードにコピーされました!
3.6.1. デプロイメントでのプログラムによるクラスおよびリソースのロード リンクのコピーリンクがクリップボードにコピーされました!
- Class.forName() メソッドを使用したクラスのロード
Class.forName()メソッドを使用すると、プログラムでクラスをロードして初期化することができます。このメソッドには 2 つのシグネチャーがあります。プログラムでクラスをロードする場合は、3 つの引数のシグネチャーを用いる方法が推奨されます。このシグネチャーを使用すると、ロード時に目的のクラスを初期化するかどうかを制御できます。また、JVM はコールスタックをチェックして、使用するクラスローダーを判断する必要がないため、クラスローダーの取得および提供がより効率的になります。コードを含むクラスが- Class.forName(String className)
- このシグネチャーは、1 つのパラメーター (ロードする必要があるクラスの名前) のみを取ります。このメソッドシグネチャーを使用すると、現在のクラスのクラスローダーによってクラスがロードされ、デフォルトで新たにロードされたクラスが初期化されます。
- Class.forName(String className, boolean initialize, ClassLoader loader)
- このシグネチャーは、クラス名、クラスを初期化するかどうかを指定するブール値、およびクラスをロードする ClassLoader の 3 つのパラメーターを想定します。
CurrentClassという名前だとすると、CurrentClass.class.getClassLoader()メソッドを使ってそのクラスのクラスローダーを取得することができます。次の例は、TargetClassクラスをロードして初期化するためのクラスローダーを提供します。例3.7 TargetClass をロードして初期化するためのクラスローダーを提供します。
Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 名前ですべてのリソースを検索
- リソースの名前とパスが分かり、直接そのリソースをロードする場合は、標準的な Java development kit の Class または ClassLoader API を使用するのが最良の方法です。
- 単一のリソースをロードします。
- 自分のクラスまたはデプロイメント内の別のクラスと同じディレクトリーにある単一のリソースをロードするには、
Class.getResourceAsStream()メソッドを使用します。例3.8 デプロイメントに単一のリソースをロードします。
InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 単一リソースのインスタンスをすべてロードします。
- デプロイメントのクラスローダーが認識できる単一リソースのすべてのインスタンスをロードするには、
Class.getClassLoader().getResources(String resourceName)メソッドを使用します。ここで、resourceNameはリソースの完全修飾パスに置き換えます。このメソッドは、指定の名前でクラスローダーがアクセスできるリソースに対し、すべてのURLオブジェクトの列挙を返します。その後、URL の配列で繰り返し処理し、openStream()メソッドを使用して各ストリームを開くことができます。例3.9 リソースのすべてのインスタンスをロードし、結果を繰り返し処理します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記URL インスタンスはローカルストレージからロードされるため、openConnection()や他の関連するメソッドを使用する必要はありません。ストリームは非常に簡単に使用でき、ストリームを使用することにより、コードの複雑さが最小限に抑えられます。
- クラスローダーからクラスファイルをロードします。
- クラスがすでにロードされている場合は、以下の構文を使用して、そのクラスに対応するクラスファイルをロードできます。クラスがロードされていない場合は、クラスローダーを使用し、パスを変換する必要があります。
例3.10 ロードされたクラスのクラスファイルをロードします。
InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");
InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.11 ロードされていないクラスのクラスファイルをロードします。
String className = "com.myorg.util.TargetClass" InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");String className = "com.myorg.util.TargetClass" InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.2. デプロイメントでのプログラムによるリソースの繰り返し リンクのコピーリンクがクリップボードにコピーされました!
MANIFEST.MF に追加する必要があります。
Dependencies: org.jboss.modules
Dependencies: org.jboss.modules
- デプロイメント内およびすべてのインポート内のリソースをリストします。
- 場合によっては、正確なパスでリソースを検索できないことがあります。たとえば、正確なパスがわからない場合や、特定のパス内の複数のファイルを調べる必要がある場合があります。このような場合、JBoss Modules ライブラリーはすべてのデプロイメントを繰り返し処理するための API を複数提供します。2 つのメソッドのいずれかを使用すると、デプロイメントでリソースを繰り返し処理できます。
- 単一のモジュールで見つかったすべてのリソースを繰り返し処理します。
- The
ModuleClassLoader.iterateResources()メソッドは、このモジュールクラ出力ダー内のすべてのリソースを繰り返します。このメソッドは、検索を開始するディレクトリーの名前と、サブディレクトリーで再帰的に処理するかどうかを指定するブール値の 2 つの引数を取ります。以下の例は、ModuleClassLoader の取得方法と、bin/ディレクトリーにあるリソースのイテレーターの取得方法 (サブディレクトリーを再帰的に検索) を示しています。取得されたイテレーターは、一致した各リソースをチェックし、名前とサイズのクエリー (可能な場合) を行うために使用できます。また、読み取り可能ストリームを開いたり、リソースの URL を取得するために使用できます。例3.12 bin ディレクトリーでリソースを検索し、サブディレクトリーに繰り返します。
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 単一のモジュールで見つかったすべてのリソースとインポートされたリソースを繰り返し処理します。
- The
Module.iterateResources()メソッドは、モジュールにインポートされたリソースを含む、このモジュールクラ出力ダー内のすべてのリソースを繰り返します。このメソッドは、前述のメソッドよりもはるかに大きなセットを返します。このメソッドには、特定パターンの結果を絞り込むフィルターとなる引数が必要になります。代わりに、PathFilters.acceptAll() を指定してセット全体を返すことも可能です。例3.13 インポートを含む、このモジュールのリソースのセット全体を検索します。
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- パターンと一致するすべてのリソースを検索します。
- デプロイメント内またはデプロイメントの完全なインポートセット内で特定のリソースのみを見つける必要がある場合は、リソースの繰り返しをフィルターする必要があります。JBoss Modules のフィルター API は、リソースの繰り返しをフィルターする複数のツールを提供します。
- 依存関係の完全セットを確認します。
- 依存関係の完全なセットを調べる必要がある場合は、
Module.iterateResources()メソッドのPathFilter各リソースの名前が一致するかどうかを確認するパラメーター。 - デプロイメント依存関係を確認します。
- デプロイメント内のみを調べる必要がある場合は、
ModuleClassLoader.iterateResources()方法。が、追加のメソッドを使用して結果となるイテレーターをフィルターする必要があります。ThePathFilters.filtered()この場合、メソッドはリソースイテレータのフィルタリングされたビューを提供できます。PathFiltersクラスには、さまざまな関数を実行するフィルターを作成する多くの静的メソッドが含まれています。これには、子パスや完全一致の検索、Ant 形式の「glob」パターンの一致などが含まれます。
- リソースのフィルターに関する追加のコード例。
- 以下の例は、異なる基準を基にしてリソースをフィルターする方法を示しています。
例3.14 デプロイメントでファイル名が messages.properties のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.15 デプロイメントおよびインポートでファイル名が messages.properties のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.16 デプロイメントでディレクトリー名が my-resources であるディレクトリー内部のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.17 デプロイメントおよびインポートで messages または errors という名前のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.18 デプロイメントで指定のパッケージにあるすべてのファイルを検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.7. クラスローディングとサブデプロイメント リンクのコピーリンクがクリップボードにコピーされました!
3.7.1. エンタープライズアーカイブのモジュールおよびクラスロード リンクのコピーリンクがクリップボードにコピーされました!
- EAR アーカイブのルートにある
lib/ディレクトリーの内容はモジュールです。これは、親モジュールと呼ばれます。 - 各 WAR および EJB JAR サブデプロイメントはモジュールです。これらのモジュールの動作は、他のモジュールおよび親モジュールの暗黙的な依存関係と同じです。
- サブデプロイメントでは、親モジュールとすべての他の非 WAR サブデプロイメントに暗黙的な依存関係が存在します。
MANIFEST.MF ファイルの Class-Path エントリーとして明示的に宣言されている場合を除き、移植可能なアプリケーションがお互いにアクセスできるサブデプロイメントに依存しないことが推奨されます。
3.7.2. サブデプロイメントクラスローダーの分離 リンクのコピーリンクがクリップボードにコピーされました!
3.7.3. EAR 内のサブデプロイメントクラスローダーの分離を有効にする リンクのコピーリンクがクリップボードにコピーされました!
デプロイメント記述子ファイルを追加します
jboss-deployment-structure.xmlデプロイメント記述子ファイルが EAR のMETA-INFディレクトリーに存在しない場合は追加し、次の内容を追加します。<jboss-deployment-structure> </jboss-deployment-structure>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 追加します
<ear-subdeployments-isolated>エレメント追加します<ear-subdeployments-isolated>trueのコンテンツで jboss-deployment-structure.xml ファイルがまだ存在しない場合は、要素をjboss-deployment-structure.xmlファイルに追加します。<ear-subdeployments-isolated>true</ear-subdeployments-isolated>
<ear-subdeployments-isolated>true</ear-subdeployments-isolated>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果:
これで、この EAR デプロイメントでサブデプロイメントクラ出力ダーの分離が有効になります。つまり、EAR のサブデプロイメントは WAR ではないサブデプロイメントごとに自動的な依存関係を持ちません。
3.8. カスタムモードでのタグライブラリー記述子 (TLD) のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
概要
共通のタグライブラリー記述子 (TLD) を使用する複数のアプリケーションがある場合、アプリケーションから TLD を分離し、一元的で一意な場所に置くと有用であることがあります。これにより、TLD を使用するアプリケーションごとに更新を行う必要がなくなり、TLD への追加や更新が簡単になります。
前提条件
- TLD を含む少なくとも 1 つの JAR。TLD がパックされていることを確認します
META-INF。
手順3.7 カスタムモジュールでの TLD のデプロイ
- 管理 CLI を使用して、JBoss EAP 6 インスタンスへ接続し、以下のコマンドを実行して TLD JAR が含まれるカスタムモジュールを作成します。
module add --name=MyTagLibs --resources=/path/to/TLDarchive.jar
module add --name=MyTagLibs --resources=/path/to/TLDarchive.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow TLD が依存関係を必要とするクラスとともにパッケージ化されている場合は、--dependencies=DEPENDENCYオプションを使用して、カスタムモジュールの作成時にこれらの依存関係を指定するようにします。モジュールを作成するときに、それぞれを:で区切ることにより、複数の JAR リソースを指定できます。以下に例を示します。--resources=/path/to/one.jar:/path/to/two.jar - アプリケーションで、で説明されているメソッドの 1 つを使用して、新しい MyTagLibs カスタムモジュールへの依存関係を宣言します。「デプロイメントへの明示的なモジュール依存関係の追加」。重要インポートすることも確認してください
META-INF依存関係を宣言するとき。たとえば、MANIFEST.MFの場合は以下のようになります。または、Dependencies: com.MyTagLibs meta-inf
Dependencies: com.MyTagLibs meta-infCopy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xmlの場合は、meta-inf属性。
結果
アプリケーションでは、新しいカスタムモジュールに含まれている TLD を使用できます。
3.9. 参照 リンクのコピーリンクがクリップボードにコピーされました!
3.9.1. 暗黙的なモジュール依存関係 リンクのコピーリンクがクリップボードにコピーされました!
| 依存関係を追加するサブシステム | 常に追加される依存関係 | 条件付きで追加される依存関係 | 依存関係の追加を引き起こす条件 |
|---|---|---|---|
| Core Server |
| | |
| EE サブシステム |
| | |
| EJB3 サブシステム |
|
|
Java EE 6 仕様で説明されているように、デプロイメント内の有効な場所に
ejb-jar.xml ファイルが存在する。
注釈ベースの EJB の存在。例:
@Stateless、@Stateful、 @MessageDriven
|
| JAX-RS(RESTEasy) サブシステム |
|
| デプロイメントに JAX-RS アノテーションが存在すること。 |
| JCA サブシステム |
|
| リソースアダプター (RAR) アーカイブのデプロイメント。 |
| JPA(Hibernate) サブシステム |
|
|
の存在
@PersistenceUnitまた@PersistenceContext注釈、または<persistence-unit-ref>また<persistence-context-ref>デプロイメント記述子の要素。
JBoss EAP 6 は永続プロバイダー名をモジュール名にマップします。
persistence.xml ファイルで特定のプロバイダーに名前を付けると、適切なモジュールに対して依存関係が追加されます。これが希望の挙動ではない場合は、jboss-deployment-structure.xml を使用して除外できます。
|
| ロギングサブシステム |
| |
これらの依存関係は、
add-logging-api-dependencies属性が false に設定されています。
|
| SAR サブシステム | |
| SAR アーカイブの展開。 |
| セキュリティーサブシステム |
| | |
| Web サブシステム | |
| WAR アーカイブの展開。JavaServer Faces (JSF) は、使用されている場合にのみ追加されます。 |
| Web サービスサブシステム |
|
|
アプリケーションクライアントタイプでない場合は、条件付き依存関係が追加されます。
|
| 溶接 (CDI) サブシステム |
|
| デプロイメントに beans.xml ファイルが存在すること。 |
| コンテナー管理による永続性 (CMP) サブシステム | |
|
3.9.2. 含まれるモジュール リンクのコピーリンクがクリップボードにコピーされました!
3.9.3. JBoss デプロイメント構造デプロイメント記述子リファレンス リンクのコピーリンクがクリップボードにコピーされました!
- 明示的なモジュール依存関係を定義する。
- 特定の暗黙的な依存関係がロードされないようにする。
- デプロイメントのリソースより追加モジュールを定義する。
- EAR デプロイメントのサブデプロイメント分離の挙動を変更する。
- EAR のモジュールに追加のリソースルートを追加する。
第4章 バルブ リンクのコピーリンクがクリップボードにコピーされました!
4.1. バルブ リンクのコピーリンクがクリップボードにコピーされました!
- グローバルバルブはサーバーレベルで設定され、サーバーにデプロイされたすべてのアプリケーションに適用されます。グローバルバルブを設定する手順は、JBoss EAP の 『管理および設定ガイド』 に記載されています。
- アプリケーションレベルで設定されたバルブは、アプリケーションデプロイメントにパッケージ化されており、特定のアプリケーションにのみ影響します。アプリケーションレベルでバルブを設定する手順は、JBoss EAP の 『開発ガイド』 に記載されています。
4.2. グローバルバルブ リンクのコピーリンクがクリップボードにコピーされました!
4.3. オーセンティケーターバルブ リンクのコピーリンクがクリップボードにコピーされました!
org.apache.catalina.authenticator.AuthenticatorBaseとオーバーライドしますauthenticate(Request request, Response response, LoginConfig config)方法。
4.4. バルブを使用するように Web アプリケーションを設定する リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml デプロイメント記述子で設定されている必要があります。
前提条件
- バルブを作成して、アプリケーションのクラスパスに含める必要があります。これは、アプリケーションの WAR ファイルまたは依存関係として追加されたモジュールに含めることで実行できます。このようなモジュールの例には、サーバーにインストールされた静的モジュールや、WAR が EAR にデプロイされている場合は EAR アーカイブの
lib/ディレクトリーにある JAR ファイルが含まれます。 - アプリケーションには、
jboss-web.xmlデプロイメント記述子が含まれている必要があります。
手順4.1 ローカルバルブのアプリケーションを設定します
バルブを設定する
作成するvalveを含む要素class-nameアプリケーションのjboss-web.xmlファイルの子要素。Theclass-nameバルブクラスの名前です。<valve> <class-name>VALVE_CLASS_NAME</class-name> </valve>
<valve> <class-name>VALVE_CLASS_NAME</class-name> </valve>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例4.1 jboss-web.xml ファイルで設定されたバルブ要素
<valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve>
<valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve>Copy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムバルブを設定する
バルブに設定可能なパラメーターがある場合は、param子要素valve各パラメーターの要素、指定param-nameとparam-valueそれぞれのために。例4.2 jboss-web.xml ファイルで設定されたカスタムバルブエレメント
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例4.3 jboss-web.xml バルブ設定
4.5. オーセンティケーターバルブを使用するように Web アプリケーションを設定する リンクのコピーリンクがクリップボードにコピーされました!
web.xml デプロイメント記述子を設定する必要があります。最も単純なケースでは、web.xml 設定は、BASIC 認証を使用する場合と同じですが、auth-methodの子要素login-config設定を実行するバルブの名前に設定されます。
前提条件
- 認証バルブはすでに作成されている必要があります。
- 認証バルブがグローバルバルブである場合、それはすでにインストールおよび設定されている必要があり、設定された名前を知っている必要があります。
- アプリケーションが使用するセキュリティーレルムのレルム名を知っている必要があります。
手順4.2 オーセンティケーターバルブを使用するようにアプリケーションを設定する
バルブを設定する
ローカルバルブを使用する場合は、アプリケーションのjboss-web.xmlデプロイメント記述子で設定する必要があります。「バルブを使用するように Web アプリケーションを設定する」を参照してください。グローバルバルブを使用する場合、これは必要ありません。web.xml にセキュリティー設定を追加します
security-constraint、login-config、security-roleなどの標準要素を使用して、アプリケーションのweb.xmlファイルにセキュリティー設定を追加します。login-config要素で、auth-methodの値をオーセンティケーターバルブの名前に設定します。realm-name 要素は、アプリケーションで使用されている JBoss セキュリティーレルムの名前にも設定する必要があります。<login-config> <auth-method>VALVE_NAME</auth-method> <realm-name>REALM_NAME</realm-name> </login-config>
<login-config> <auth-method>VALVE_NAME</auth-method> <realm-name>REALM_NAME</realm-name> </login-config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6. カスタムバルブを作成する リンクのコピーリンクがクリップボードにコピーされました!
手順4.3 カスタムバルブを作成する
Maven の依存関係を設定します。
次の依存関係設定をプロジェクトpom.xmlファイルに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記jbossweb -VERSION.jarファイルをアプリケーションに含めないでください。これは、JBoss EAP サーバーのランタイムクラスパスで JBoss モジュールとして次の場所で利用できます:EAP_HOME/modules/system/layers/base/org/jboss/as/web/main/jbossweb-7.5.7.Final-redhat-1。jar。Valve クラスを作成します
のサブクラスを作成しますorg.apache.catalina.valves.ValveBase。Copy to Clipboard Copied! Toggle word wrap Toggle overflow invoke メソッドを実装します。
Theinvoke()このバルブがパイプラインで実行されると、メソッドが呼び出されます。リクエストオブジェクトとレスポンスオブジェクトはパラメーターとして渡されます。ここで、要求と応答の処理と変更を実行します。public void invoke(Request request, Response response) { }public void invoke(Request request, Response response) { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のパイプラインステップを呼び出します。
invoke メソッドが最後に実行する必要があるのは、パイプラインの次のステップを呼び出して、変更された要求オブジェクトと応答オブジェクトを渡すことです。これは、getNext().invoke()方法getNext().invoke(request, response);
getNext().invoke(request, response);Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: パラメーターを指定します。
バルブを設定可能にする必要がある場合は、パラメーターを追加してこれを有効にします。これを行うには、各パラメーターにインスタンス変数とセッターメソッドを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 完成したコード例を確認します。
これで、クラスは次の例のようになります。例4.4 サンプルカスタムバルブ
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第5章 開発者のためのロギング リンクのコピーリンクがクリップボードにコピーされました!
5.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
5.1.1. ロギング リンクのコピーリンクがクリップボードにコピーされました!
5.1.2. JBoss LogManager でサポートされるアプリケーションロギングフレームワーク リンクのコピーリンクがクリップボードにコピーされました!
- JBoss Logging - JBoss EAP 6 に含まれます
- Apache Commons Logging - http://commons.apache.org/logging/
- Simple Logging Facade for Java (SLF4J) - http://www.slf4j.org/
- Apache Log4j - http://logging.apache.org/log4j/1.2/
- Java SE Logging (java.util.logging) - http://download.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html
- java.util.logging
- JBoss Logging
- Log4j
- SLF4J
- commons-logging
- java.util.logging Handler
- Log4j Appender
Log4j API と Log4J Appender を使用している場合、オブジェクトは渡される前に string に変換されます。
5.1.3. ログレベル リンクのコピーリンクがクリップボードにコピーされました!
TRACE、DEBUG、INFO、WARN、ERROR、FATAL です。
WARN レベルのログハンドラーは、WARN、ERROR、および FATAL のレベルのメッセージのみを記録します。
5.1.4. サポート対象のログレベル リンクのコピーリンクがクリップボードにコピーされました!
| ログのレベル | Value | 説明 |
|---|---|---|
| FINEST | 300 |
-
|
| FINER | 400 |
-
|
| TRACE | 400 |
アプリケーションの実行状態に関する詳細情報を提供するメッセージに使用します。
TRACE のログメッセージは通常、アプリケーションのデバッグ時にのみキャプチャされます。
|
| DEBUG | 500 |
アプリケーションの個々の要求またはアクティビティーの進行状況を示すメッセージに使用します。
DEBUG のログメッセージは通常、アプリケーションのデバッグ時にのみキャプチャされます。
|
| FINE | 500 |
-
|
| CONFIG | 700 |
-
|
| INFO | 800 |
アプリケーションの全体的な進行状況を示すメッセージに使用します。多くの場合、アプリケーションの起動、シャットダウン、およびその他の主要なライフサイクルイベントに使用されます。
|
| WARN | 900 |
エラーではないが理想的とは見なされない状況を示すために使用します。将来エラーにつながる可能性のある状況を示している可能性があります。
|
| 警告 | 900 |
-
|
| ERROR | 1000 |
発生したエラーの中で、現在の活動や要求の完了を妨げる可能性があるが、アプリケーション実行の妨げにはならないエラーを表示するために使用されます。
|
| SEVERE | 1000 |
-
|
| FATAL | 1100 |
クリティカルなサービス障害やアプリケーションのシャットダウンをもたらしたり、JBoss EAP 6 のシャットダウンを引き起こす可能性があるイベントを表示するのに使用されます。
|
5.1.5. デフォルトのログファイルの場所 リンクのコピーリンクがクリップボードにコピーされました!
| ログファイル | Description |
|---|---|
EAP_HOME/standalone/log/server.log |
Server Log.サーバー起動メッセージを含む、すべてのサーバーログメッセージが含まれます。
|
EAP_HOME/standalone/log/gc.log |
ガベージコレクションログ。すべてのガベージコレクションの詳細が含まれています。
|
| ログファイル | Description |
|---|---|
EAP_HOME/domain/log/host-controller.log |
ホストコントローラーのブートログ。ホストコントローラーの起動に関連するログメッセージが含まれます。
|
EAP_HOME/domain/log/process-controller.log |
プロセスコントローラーのブートログ。プロセスコントローラーの起動に関連するログメッセージが含まれます。
|
EAP_HOME/domain/servers/SERVERNAME/log/server.log |
指定されたサーバーのサーバーログ。サーバーの起動メッセージを含む、そのサーバーのすべてのログメッセージが含まれます。
|
5.2. JBoss Logging Framework を用いたロギング リンクのコピーリンクがクリップボードにコピーされました!
5.2.1. JBoss Logging について リンクのコピーリンクがクリップボードにコピーされました!
5.2.2. JBossLogging の機能 リンクのコピーリンクがクリップボードにコピーされました!
- 革新的で使いやすい型付きロガーを提供します。
- 国際化およびローカリゼーションの完全なサポート。翻訳者は properties ファイルのメッセージバンドルを、開発者はインターフェースやアノテーションを使い作業を行います。
- 実稼働用の型指定されたロガーを生成し、開発用の型指定されたロガーを実行時に生成する構築時ツール。
5.2.3. JBoss Logging を使用したアプリケーションへのロギングの追加 リンクのコピーリンクがクリップボードにコピーされました!
org.jboss.logging.Logger) そしてそのオブジェクトの適切なメソッドを呼び出します。このタスクでは、これに対するサポートをアプリケーションに追加するために必要な手順について説明します。
前提条件
- ビルドシステムとして Maven を使用している場合は、JBossMaven リポジトリーを含めるようにプロジェクトを設定する必要があります。「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」 を参照してください。
- JBoss Logging JAR ファイルがアプリケーションのビルドパスに指定されている必要があります。これを行う方法は、Red Hat JBossDeveloperStudio を使用してアプリケーションをビルドするか Maven を使用してアプリケーションをビルドするかによって異なります。
- Red Hat JBoss Developer Studio を使用してビルドする場合は、 メニューから を選択し、 ランタイムを選択して、JBoss EAP 6 のランタイムがチェックされていることを確認します。
- Maven を使用してビルドする場合は、次の依存関係設定をプロジェクトの
pom.xmlファイルに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
JAR は、JBoss EAP 6 がデプロイされたアプリケーションに提供するため、ビルドされたアプリケーションに含める必要はありません。
手順5.1 アプリケーションにロギングを追加する
インポートを追加
使用する JBoss Logging クラスネームスペースに対してimportステートメントを追加します。少なくとも、インポートする必要がありますimport org.jboss.logging.Logger。import org.jboss.logging.Logger;
import org.jboss.logging.Logger;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Logger オブジェクトを作成します
のインスタンスを作成しますorg.jboss.logging.Logger静的メソッドを呼び出して初期化しますLogger.getLogger(Class)。Red Hat は、これをクラスごとに単一のインスタンス変数として作成することをお勧めします。private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);
private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);Copy to Clipboard Copied! Toggle word wrap Toggle overflow ロギングメッセージを追加する
のメソッドへの呼び出しを追加しますLoggerログメッセージを送信するコードに反対します。Loggerオブジェクトには、異なるタイプのメッセージに対して異なるパラメーターを持つさまざまなメソッドがあります。最も使いやすいのは次のとおりです。debug(Object message)info(Object message)error(Object message)trace(Object message)fatal(Object message)これらのメソッドは、対応するログレベルとmessage文字列としてのパラメーター。LOGGER.error("Configuration file not found.");LOGGER.error("Configuration file not found.");Copy to Clipboard Copied! Toggle word wrap Toggle overflow JBoss Logging メソッドの完全なリストについては、以下を参照してください。org.jboss.loggingJBoss EAP 6 ドキュメントのパッケージ。
例5.1 プロパティーファイルを開くときに JBossLogging を使用する
5.3. デプロイメントごとのロギング リンクのコピーリンクがクリップボードにコピーされました!
5.3.1. デプロイメントごとのロギング リンクのコピーリンクがクリップボードにコピーされました!
5.3.2. デプロイメントごとのロギングをアプリケーションに追加 リンクのコピーリンクがクリップボードにコピーされました!
logging.properties をデプロイメントに追加します。この設定ファイルは、JBoss Log Manager が基礎となるログマネージャーである場合にどのロギングファサードとも使用できるため、推奨されます。
Simple Logging Facade for Java (SLF4J) または Apache log4j を使用している場合は、logging.properties 設定ファイルが適しています。Apache log4j アペンダーを使用している場合は、log4j.properties 設定ファイルが必要になります。jboss-logging.properties 設定ファイルはレガシーデプロイメントのみでサポートされます。
手順5.2 アプリケーションに設定ファイルを追加する
設定ファイルが追加されるディレクトリーは、デプロイメント方法によって異なります。
EAR、WAR、JARのいずれかです。EARデプロイメントロギング設定ファイルをMETA-INFディレクトリーにコピーします。WARまたはJARデプロイメントロギング設定ファイルをMETA-INFまたはWEB-INF/classesディレクトリーにコピーします。
5.3.3. logging.properties ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
5.4. ロギングプロファイル リンクのコピーリンクがクリップボードにコピーされました!
5.4.1. ロギングプロファイル リンクのコピーリンクがクリップボードにコピーされました!
- 一意な名前これは必須です。
- 任意の数のログハンドラー。
- 任意の数のログカテゴリー。
- 最大 1 つのルートロガー。
logging-profile 属性を使用して、MANIFEST.MF ファイルで使用するロギングプロファイルを指定できます。
5.4.2. アプリケーションでのロギングプロファイルの指定 リンクのコピーリンクがクリップボードにコピーされました!
MANIFEST.MF ファイルで指定できます。
要件:
- このアプリケーションが使用するサーバー上に設定されたロギングプロファイルの名前を知っている必要があります。使用するプロファイルの名前については、サーバー管理者に問い合わせてください。
手順5.3 ロギングプロファイル設定のアプリケーションへの追加
MANIFEST.MF を編集しますアプリケーションにMANIFEST.MFファイルがない場合は、次の内容でファイルを作成し、NAME を必要なプロファイル名に置き換えます。Manifest-Version: 1.0 Logging-Profile: NAME
Manifest-Version: 1.0 Logging-Profile: NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションにすでにMANIFEST.MFファイルがある場合は、次の行を追加して、NAME を必要なプロファイル名に置き換えます。Logging-Profile: NAME
Logging-Profile: NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
maven-war-plugin を使用している場合は、MANIFEST.MF ファイルを src/main/resources/META-INF/ に置き、次の設定を pom.xml ファイルに追加できます。
第6章 国際化と現地語化 リンクのコピーリンクがクリップボードにコピーされました!
6.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
6.1.1. 国際化 リンクのコピーリンクがクリップボードにコピーされました!
6.1.2. 多言語化 リンクのコピーリンクがクリップボードにコピーされました!
6.2. JBoss Logging Tools リンクのコピーリンクがクリップボードにコピーされました!
6.2.1. 概要 リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.1. JBoss Logging Tools の国際化および現地語化 リンクのコピーリンクがクリップボードにコピーされました!
org.jboss.logging注釈。インターフェイスを実装する必要はありません。JBossLoggingTools はコンパイル時にこれを実行します。定義すると、これらのメソッドを使用してコードでメッセージをログに記録したり、例外オブジェクトを取得したりできます。
6.2.1.2. JBossLoggingTools クイックスタート リンクのコピーリンクがクリップボードにコピーされました!
logging-tools には、JBossLoggingTools の機能を示す単純な Maven プロジェクトが含まれています。このドキュメントでは、コードサンプルとして広く使用されています。
6.2.1.3. メッセージロガー リンクのコピーリンクがクリップボードにコピーされました!
@org.jboss.logging.MessageLogger。
6.2.1.4. メッセージバンドル リンクのコピーリンクがクリップボードにコピーされました!
@org.jboss.logging.MessageBundle。
6.2.1.5. 国際化されたログメッセージ リンクのコピーリンクがクリップボードにコピーされました!
@LogMessageと@Message注釈を付け、の value 属性を使用してログメッセージを指定します@Message。国際化されたログメッセージはプロパティーファイルで翻訳を提供することによりローカライズされます。
6.2.1.6. 国際化された例外 リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.7. 国際化されたメッセージ リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.8. 翻訳プロパティーファイル リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.9. JBoss Logging Tools のプロジェクトコード リンクのコピーリンクがクリップボードにコピーされました!
projectCodeの属性@MessageLogger注釈。
6.2.1.10. JBoss Logging Tools のメッセージ ID リンクのコピーリンクがクリップボードにコピーされました!
idの属性@Message注釈。
6.2.2. 国際化されたロガー、メッセージ、例外の作成 リンクのコピーリンクがクリップボードにコピーされました!
6.2.2.1. 国際化されたログメッセージの作成 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
要件:
- 作業用の Maven プロジェクトがすでに存在している必要があります。「JBoss Logging Tools の Maven 設定」 を参照してください。
- プロジェクトには、JBossLoggingTools に必要な Maven 設定が必要です。
手順6.1 国際化されたログメッセージバンドルを作成する
メッセージロガーインターフェイスを作成する
プロジェクトに Java インターフェイスを追加して、ログメッセージ定義を含めます。インターフェイスに定義されるログメッセージの説明的な名前を付けます。ログメッセージインターフェースの要件は次のとおりです。- 注釈を付ける必要があります
@org.jboss.logging.MessageLogger。 - 延長する必要があります
org.jboss.logging.BasicLogger。 - インターフェイスは、このインターフェイスを実装する型付きロガーであるフィールドを定義する必要があります。でこれを行う
getMessageLogger()の方法org.jboss.logging.Logger。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッド定義を追加する
各ログメッセージのインターフェースにメソッド定義を追加します。ログメッセージの各メソッドにその内容を表す名前を付けます。各メソッドの要件は次のとおりです。- メソッドは返す必要があります
void。 - 注釈を付ける必要があります
@org.jboss.logging.LogMessage注釈。 - 注釈を付ける必要があります
@org.jboss.logging.Message注釈。 - の値属性
@org.jboss.logging.Messageデフォルトのログメッセージが含まれています。このメッセージは翻訳がない場合に使用されます。
@LogMessage @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
@LogMessage @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトのログレベルはINFOです。メソッドを呼び出します。
メッセージをログに記録する必要があるコードのインターフェイスメソッドへの呼び出しを追加します。インターフェースの実装を作成する必要はありません。これは、プロジェクトがコンパイルされる時にアノテーションプロセッサーにより行われます。AccountsLogger.LOGGER.customerQueryFailDBClosed();
AccountsLogger.LOGGER.customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムロガーは BasicLogger からサブクラス化されているため、BasicLogger((debug()、error()など) も使用できます。国際化されていないメッセージをログに記録するために他のロガーを作成する必要はありません。AccountsLogger.LOGGER.error("Invalid query syntax.");AccountsLogger.LOGGER.error("Invalid query syntax.");Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
プロジェクトで、現地語化できる 1 つ以上の国際化されたロガーがサポートされるようになります。
6.2.2.2. 国際化されたメッセージの作成と使用 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
前提条件
- JBoss EAP 6 リポジトリーを使用する Maven プロジェクトが機能しています。「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」 を参照してください。
- JBossLoggingTools に必要な Maven 設定が追加されました。「JBoss Logging Tools の Maven 設定」 を参照してください。
手順6.2 国際化されたメッセージの作成と使用
例外のインターフェースを作成します。
JBoss Logging Tools はインターフェースで国際化されたメッセージを定義します。各インターフェイスに、そのインターフェイスで定義されるメッセージの説明的な名前を付けます。インターフェースの要件は以下のとおりです。- public として宣言する必要があります。
- 注釈を付ける必要があります
@org.jboss.logging.MessageBundle。 - インターフェースと同じ型のメッセージバンドルであるフィールドをインターフェースが定義する必要があります。
@MessageBundle(projectCode="") public interface GreetingMessageBundle { GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class); }@MessageBundle(projectCode="") public interface GreetingMessageBundle { GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッド定義を追加する
各メッセージのインターフェースにメソッド定義を追加します。メッセージに対する各メソッドにその内容を表す名前を付けます。各メソッドの要件は次のとおりです。- タイプのオブジェクトを返す必要があります
String。 - 注釈を付ける必要があります
@org.jboss.logging.Message注釈。 - の値属性
@org.jboss.logging.Messageデフォルトのメッセージに設定する必要があります。このメッセージは翻訳がない場合に使用されます。
@Message(value = "Hello world.") String helloworldString();
@Message(value = "Hello world.") String helloworldString();Copy to Clipboard Copied! Toggle word wrap Toggle overflow invoke メソッド
メッセージを取得する必要があるアプリケーションでインターフェースメソッドを呼び出します。System.console.out.println(helloworldString());
System.console.out.println(helloworldString());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.2.3. 国際化された例外の作成 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
手順6.3 国際化された例外を作成して使用する
JBossLoggingTools 設定を追加します
JBossLoggingTools をサポートするために必要なプロジェクト設定を追加します。「JBoss Logging Tools の Maven 設定」 を参照してください例外のインターフェースを作成します。
JBoss Logging Tools はインターフェースで国際化されたメッセージを定義します。定義される例外について、各インターフェイスにわかりやすい名前を付けます。インターフェースの要件は以下のとおりです。- 次のように宣言する必要があります
public。 - 注釈を付ける必要があります
@org.jboss.logging.MessageBundle。 - インターフェースと同じ型のメッセージバンドルであるフィールドをインターフェースが定義する必要があります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッド定義を追加する
各例外のインターフェースにメソッド定義を追加します。例外に対する各メソッドにその内容を表す名前を付けます。各メソッドの要件は次のとおりです。- タイプのオブジェクトを返す必要があります
ExceptionまたはのサブタイプException。 - 注釈を付ける必要があります
@org.jboss.logging.Message注釈。 - の値属性
@org.jboss.logging.Messageデフォルトの例外メッセージに設定する必要があります。このメッセージは翻訳がない場合に使用されます。 - メッセージ文字列の他にパラメーターを必要とするコンストラクターが返される例外にある場合は、
@Paramアノテーションを使用してこれらのパラメーターをメソッド定義に提供する必要があります。パラメーターは、コンストラクターと同じタイプおよび順序である必要があります。
@Message(value = "The config file could not be opened.") IOException configFileAccessError(); @Message(id = 13230, value = "Date string '%s' was invalid.") ParseException dateWasInvalid(String dateString, @Param int errorOffset);
@Message(value = "The config file could not be opened.") IOException configFileAccessError(); @Message(id = 13230, value = "Date string '%s' was invalid.") ParseException dateWasInvalid(String dateString, @Param int errorOffset);Copy to Clipboard Copied! Toggle word wrap Toggle overflow invoke メソッド
例外を取得する必要があるコードでインターフェースメソッドを呼び出します。メソッドによって例外は発生されず、発生できるな例外オブジェクトがメソッドによって返されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.3. 国際化されたロガー、メッセージ、例外の現地語化 リンクのコピーリンクがクリップボードにコピーされました!
6.2.3.1. Maven での新しい翻訳プロパティーファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
要件:
- 作業用の Maven プロジェクトがすでに存在している必要があります。
- JBoss Logging Tools に対してプロジェクトが設定されていなければなりません。
- 国際化されたログメッセージや例外を定義する 1 つ以上のインターフェースがプロジェクトに含まれていなければなりません。
手順6.4 Maven での新しい翻訳プロパティーファイルの作成
Maven 設定を追加する
追加します-AgenereatedTranslationFilePathMaven コンパイラープラグイン設定へのコンパイラー引数を指定し、新しいファイルが作成されるパスを割り当てます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の設定により、Maven プロジェクトのtarget/generated-translation-filesディレクトリーに新しいファイルが作成されます。プロジェクトをビルドします。
Maven を使用してプロジェクトをビルドします。mvn compile
[Localhost]$ mvn compileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
@MessageBundleまた@MessageLogger。各インターフェースが宣言された Java パッケージに対応するサブディレクトリーに新しいファイルが作成されます。
InterfaceNameこのファイルが生成されたインターフェイスの名前です: InterfaceName.i18n_locale_COUNTRY_VARIANT.properties。
6.2.3.2. 国際化されたロガー、例外、またはメッセージの翻訳 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
前提条件
- 作業用の Maven プロジェクトがすでに存在している必要があります。
- JBoss Logging Tools に対してプロジェクトが設定されていなければなりません。
- 国際化されたログメッセージや例外を定義する 1 または複数のインターフェースがプロジェクトに含まれていなければなりません。
- テンプレート翻訳プロパティーファイルを生成するようプロジェクトが設定されている必要があります。
手順6.5 国際化されたロガー、例外、またはメッセージの翻訳
テンプレートプロパティーファイルを生成する
mvn compile コマンドを実行して、テンプレート変換プロパティーファイルを作成します。テンプレートファイルをプロジェクトに追加します
翻訳したいインターフェースのテンプレートを、テンプレートが作成されたディレクトリーからプロジェクトのsrc/main/resourcesディレクトリーにコピーします。プロパティーファイルは翻訳するインターフェースと同じパッケージに存在する必要があります。コピーしたテンプレートファイルの名前を変更します
テンプレートファイルに含まれる翻訳に従って、テンプレートファイルのコピーの名前を変更します。例:GreeterLogger.i18n_fr_FR.properties.テンプレートの内容を翻訳します。
新しい翻訳プロパティーファイルを編集して、適切な翻訳を含めます。# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.
# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 実行する各バンドルの翻訳ごとに、手順 2、3、および 4 を繰り返します。
target/generated-sources/annotations/ で確認できます。
6.2.4. 国際化されたログメッセージのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
6.2.4.1. ログメッセージへのメッセージ ID とプロジェクトコードの追加 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
前提条件
- 国際化されたログメッセージが含まれるプロジェクトが存在する必要があります。「国際化されたログメッセージの作成」 を参照してください。
- 使用するプロジェクトコードを知っている必要があります。プロジェクトコードを 1 つ使用することも、各インターフェースに異なる複数のコードを定義することも可能です。
手順6.6 ログメッセージへのメッセージ ID とプロジェクトコードの追加
インターフェイスのプロジェクトコードを指定します。
の projectCode 属性を使用してプロジェクトコードを指定します@MessageLoggerカスタムロガーインターフェイスに付加された注釈。インターフェースに定義されるすべてのメッセージがこのプロジェクトコードを使用します。@MessageLogger(projectCode="ACCNTS") interface AccountsLogger extends BasicLogger { }@MessageLogger(projectCode="ACCNTS") interface AccountsLogger extends BasicLogger { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow メッセージ ID を指定する
メッセージを定義するメソッドに付けられる@Messageアノテーションのid属性を使用して、各メッセージのメッセージ ID を指定します。@LogMessage @Message(id=43, value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
@LogMessage @Message(id=43, value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10:55:50,638 INFO [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
10:55:50,638 INFO [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
6.2.4.2. メッセージのログレベル設定 リンクのコピーリンクがクリップボードにコピーされました!
INFO です。別のログレベルを指定できますlevelの属性@LogMessageロギングメソッドに付加されたアノテーション。
手順6.7 メッセージのログレベル設定
レベル属性を指定する
追加しますlevelに属性@LogMessageログメッセージメソッド定義のアノテーション。ログレベルを割り当てる
を割り当てますlevelこのメッセージのログレベルの値を属性付けします。の有効な値levelで定義されている 6 つの列挙型定数ですorg.jboss.logging.Logger.Level:DEBUG、ERROR、FATAL、INFO、TRACE、とWARN。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ERROR レベルのログメッセージが作成されます。
10:55:50,638 ERROR [com.company.app.Main] (MSC service thread 1-4) Customer query failed, Database not available.
10:55:50,638 ERROR [com.company.app.Main] (MSC service thread 1-4)
Customer query failed, Database not available.
6.2.4.3. パラメーターによるログメッセージのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
手順6.8 パラメーターによるログメッセージのカスタマイズ
メソッド定義にパラメーターを追加する
任意のタイプのパラメーターをメソッド定義に追加できます。型に関係なくパラメーターの String 表現がメッセージに表示されます。ログメッセージにパラメーター参照を追加します
参照は明示的なインデックスまたは通常のインデックスを使用できます。- 通常のインデックスを使用するには、各パラメーターを表示したいメッセージ文字列に
%s文字を挿入します。%sの最初のインスタンスにより最初のパラメーターが挿入され、2 番目のインスタンスにより 2 番目のパラメーターが挿入されます。 - 明示的なインデックスを使用するには、文字
%{#$}sをメッセージに挿入します。ここで、# は表示したいパラメーターの数を示します。
@Cause アノテーションが付けられたパラメーターはパラメーターの数には含まれません。
例6.1 通常のインデックスを使用したメッセージパラメーター
@LogMessage(level=Logger.Level.DEBUG) @Message(id=2, value="Customer query failed, customerid:%s, user:%s") void customerLookupFailed(Long customerid, String username);
@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, customerid:%s, user:%s")
void customerLookupFailed(Long customerid, String username);
例6.2 明示的なインデックスを使用したメッセージパラメーター
@LogMessage(level=Logger.Level.DEBUG) @Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s") void customerLookupFailed(Long customerid, String username);
@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s")
void customerLookupFailed(Long customerid, String username);
6.2.4.4. 例外をログメッセージの原因として指定 リンクのコピーリンクがクリップボードにコピーされました!
Throwableまたはそのサブクラスのいずれかであり、@Cause注釈。このパラメーターは、他のパラメーターのようにログメッセージで参照することはできず、ログメッセージの後に表示されます。
@Cause パラメーターを使用して「原因となる」例外を示し、ロギングメソッドを更新する方法を表しています。この機能に追加したい国際化されたロギングメッセージがすでに作成されていることを前提とします。
手順6.9 例外をログメッセージの原因として指定
パラメーターを追加します。
タイプのパラメーターを追加しますThrowableまたはメソッドのサブクラス。@LogMessage @Message(id=404, value="Loading configuration failed. Config file:%s") void loadConfigFailed(Exception ex, File file);
@LogMessage @Message(id=404, value="Loading configuration failed. Config file:%s") void loadConfigFailed(Exception ex, File file);Copy to Clipboard Copied! Toggle word wrap Toggle overflow アノテーションを追加します。
追加します@Causeパラメーターへの注釈。Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッドを呼び出します。
コードでメソッドが呼び出されると、正しい型のオブジェクトが渡され、ログメッセージの後に表示されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下は、コードがタイプの例外を出力した場合の上記のコードサンプルの出力です。FileNotFoundException。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.5. 国際化された例外のカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
6.2.5.1. メッセージ ID およびプロジェクトコードの例外メッセージへの追加 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- 国際化された例外が含まれるプロジェクトが存在する必要があります。「国際化された例外の作成」 を参照してください。
- 使用するプロジェクトコードを知っている必要があります。プロジェクトコードを 1 つ使用することも、各インターフェースに異なる複数のコードを定義することも可能です。
手順6.10 メッセージ ID およびプロジェクトコードの例外メッセージへの追加
プロジェクトコードを指定する
を使用してプロジェクトコードを指定しますprojectCodeの属性@MessageBundle例外バンドルインターフェイスに付加された注釈。インターフェースに定義されるすべてのメッセージがこのプロジェクトコードを使用します。@MessageBundle(projectCode="ACCTS") interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }@MessageBundle(projectCode="ACCTS") interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow メッセージ ID を指定する
を使用して、各例外のメッセージ ID を指定します。idの属性@Message例外を定義するメソッドに付加されたアノテーション。@Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError();
@Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError();Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例6.3 国際化された例外の作成
throw ExceptionBundle.EXCEPTIONS.configFileAccessError();
throw ExceptionBundle.EXCEPTIONS.configFileAccessError();
Exception in thread "main" java.io.IOException: ACCTS000143: The config file could not be opened. at com.company.accounts.Main.openCustomProperties(Main.java:78) at com.company.accounts.Main.go(Main.java:53) at com.company.accounts.Main.main(Main.java:43)
Exception in thread "main" java.io.IOException: ACCTS000143: The config file could not be opened.
at com.company.accounts.Main.openCustomProperties(Main.java:78)
at com.company.accounts.Main.go(Main.java:53)
at com.company.accounts.Main.main(Main.java:43)
6.2.5.2. パラメーターによる例外メッセージのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
手順6.11 パラメーターを使用して例外メッセージをカスタマイズする
メソッド定義にパラメーターを追加する
任意のタイプのパラメーターをメソッド定義に追加できます。型に関係なくパラメーターのString表現がメッセージに表示されます。例外メッセージにパラメーター参照を追加します
参照は明示的なインデックスまたは通常のインデックスを使用できます。- 通常のインデックスを使用するには、各パラメーターを表示したいメッセージ文字列に
%s文字を挿入します。%sの最初のインスタンスにより最初のパラメーターが挿入され、2 番目のインスタンスにより 2 番目のパラメーターが挿入されます。 - 明示的なインデックスを使用するには、文字
%{#$}sをメッセージに挿入します。ここで、#は表示したいパラメーターの数を示します。
明示的なインデックスを使用すると、メッセージのパラメーター参照の順番がメソッドで定義される順番とは異なるようになります。これは、パラメーターの異なる順序を必要とする可能性のある翻訳されたメッセージにとって重要です。
@Cause アノテーションが付けられたパラメーターはパラメーターの数には含まれません。
例6.4 通常のインデックスを使用する
@Message(id=2, value="Customer query failed, customerid:%s, user:%s") void customerLookupFailed(Long customerid, String username);
@Message(id=2, value="Customer query failed, customerid:%s, user:%s")
void customerLookupFailed(Long customerid, String username);
例6.5 明示的なインデックスの使用
@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s") void customerLookupFailed(Long customerid, String username);
@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s")
void customerLookupFailed(Long customerid, String username);
6.2.5.3. 別の例外の原因として 1 つの例外を指定 リンクのコピーリンクがクリップボードにコピーされました!
@Cause アノテーションを付けます。このパラメーターは、原因となる例外を渡すために使用されます。このパラメーターは、例外メッセージでは参照できません。
@Cause パラメーターを使用して原因となる例外を示し、例外バンドルよりメソッドを更新する方法を表しています。この機能に追加したい国際化された例外バンドルがすでに作成されていることを前提とします。
手順6.12 別の例外の原因として 1 つの例外を指定
パラメーターを追加します。
タイプのパラメーターを追加しますThrowableまたはメソッドのサブクラス。@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);
@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);Copy to Clipboard Copied! Toggle word wrap Toggle overflow アノテーションを追加します。
追加します@Causeパラメーターへの注釈。import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);
import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッドを呼び出します。
例外オブジェクトを取得するため、インターフェースメソッドを呼び出します。catch ブロックから新しい例外を発生させ、キャッチした例外を原因として使用するのが最も一般的なユースケースです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例6.6 別の例外の原因として 1 つの例外を指定
6.2.6. 参照 リンクのコピーリンクがクリップボードにコピーされました!
6.2.6.1. JBoss Logging Tools の Maven 設定 リンクのコピーリンクがクリップボードにコピーされました!
pom.xml ファイルのプロジェクトの設定に次の変更を加える必要があります。
pom.xml ファイルの例については、logging-tools クイックスタートを参照してください。
- プロジェクトで JBossMaven リポジトリーを有効にする必要があります。「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」 を参照してください。
jboss-loggingおよびjboss-logging-processorの Maven 依存関係を追加する必要があります。両方の依存関係は JBoss EAP 6 で使用できるため、それぞれのスコープ要素を次のように提供するように設定できます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow maven-compiler-pluginのバージョンは2.2以上であり、1.6のターゲットソースおよび生成されたソースに対して設定する必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.6.2. 翻訳プロパティーファイルの形式 リンクのコピーリンクがクリップボードにコピーされました!
key=value クラス http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html のドキュメントで説明されている単純な行指向の java.util.Properties ペア形式です。
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
InterfaceNameは、翻訳が適用されるインターフェイスの名前です。locale、COUNTRY、とVARIANT翻訳が適用される地域の設定を特定します。localeとCOUNTRYISO-639 および ISO-3166 の言語コードと国コードをそれぞれ使用して、言語と国を指定します。COUNTRYは任意になります。VARIANTは特定のオペレーティングシステムまたはブラウザーのみに適用される翻訳を識別するために使用できる任意の識別子です。
例6.7 サンプル: 翻訳プロパティーファイル
GreeterService.i18n_fr_FR_POSIX.properties
# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.
# Level: Logger.Level.INFO
# Message: Hello message sent.
logHelloMessageSent=Bonjour message envoyé.
6.2.6.3. JBoss Logging Tools のアノテーションに関するリファレンス リンクのコピーリンクがクリップボードにコピーされました!
| アノテーション | ターゲット | 説明 | 属性 |
|---|---|---|---|
@MessageBundle | Interface |
インターフェースをメッセージバンドルとして定義します。
| projectCode |
@MessageLogger | Interface |
インターフェースをメッセージロガーとして定義します。
| projectCode |
@Message | メソッド |
メッセージバンドルとメッセージロガーで使用できます。メッセージロガーでは、現地語化されたロガーとしてメソッドが定義されます。メッセージバンドルでは、現地語化された String または Exception オブジェクトを返すメソッドとして定義されます。
| value、id |
@LogMessage | メソッド |
メッセージロガーのメソッドをロギングメソッドとして定義します。
| level (デフォルトは INFO です)。 |
@Cause | パラメーター |
ログメッセージまたは他の例外が発生したときに例外を渡すパラメーターとして定義します。
| - |
@Param | パラメーター |
例外のコンストラクターへ渡されるパラメーターとして定義します。
| - |
第7章 リモート JNDI ルックアップ リンクのコピーリンクがクリップボードにコピーされました!
7.1. JNDI へのオブジェクトの登録 リンクのコピーリンクがクリップボードにコピーされました!
java:jboss/exported環境。
メッセージング サブシステムの JNDI に登録して、リモート JNDI クライアントが検索できるようにする方法の例です。
java:jboss/exported/jms/queue/myTestQueue
java:jboss/exported/jms/queue/myTestQueue
java:jboss/exported/リモートクライアントを検索するときの接頭辞。リモート JNDI クライアントは、次の名前を使用してリモートオブジェクトを検索できます。
jms/queue/myTestQueue
jms/queue/myTestQueue
例7.1 スタンドアロンサーバーの JMS キュー設定の例
7.2. リモート JNDI クライアントの設定 リンクのコピーリンクがクリップボードにコピーされました!
jboss-client.jar が必要です。
myTestQueueリモート JNDI クライアントからの JMS キュー:
例7.2 リモート JNDI ルックアップの例
第8章 Enterprise JavaBeans 3.2 リンクのコピーリンクがクリップボードにコピーされました!
8.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
8.1.1. Enterprise JavaBeans の概要 リンクのコピーリンクがクリップボードにコピーされました!
8.1.2. EJB 3.1 機能セット リンクのコピーリンクがクリップボードにコピーされました!
- セッション Bean
- メッセージ駆動 Bean
- インターフェースなしビュー
- ローカルインターフェース
- リモートインターフェース
- JAX-WS Web サービス
- JAX-RSWeb サービス
- タイマーサービス
- 非同期呼び出し
- インターセプター
- RMI/IIOP の相互運用性
- トランザクションサポート
- セキュリティー
- 組み込み API
- エンティティー Bean (コンテナーおよび Bean で管理された永続性)
- EJB 2.1 エンティティー Bean クライアントビュー
- EJB クエリー言語 (EJB QL)
- JAX-RPC ベースの Web サービス: エンドポイントおよびクライアントビュー
8.1.3. EJB 3.1 Lite リンクのコピーリンクがクリップボードにコピーされました!
- Web アプリケーションに意味のある機能のみをサポートし、
- EJB を Web アプリケーションと同じ WAR ファイルにデプロイできるようにします。
8.1.4. EJB3.1Lite の機能 リンクのコピーリンクがクリップボードにコピーされました!
- ステートレス、ステートフル、およびシングルトンセッション Bean
- ローカルビジネスインターフェイスとインターフェイスなし Bean
- インターセプター
- コンテナー管理および Bean 管理のトランザクション
- 宣言型およびプログラムによるセキュリティー
- 組み込み API
- リモートインターフェース
- RMI/IIOP の相互運用性
- JAX-WS Web サービスエンドポイント
- EJB タイマーサービス
- 非同期セッション Bean の呼び出し
- メッセージ駆動 Bean
8.1.5. エンタープライズ Bean リンクのコピーリンクがクリップボードにコピーされました!
8.1.6. EnterpriseBeans の作成の概要 リンクのコピーリンクがクリップボードにコピーされました!
8.1.7. セッション Bean ビジネスインターフェイス リンクのコピーリンクがクリップボードにコピーされました!
8.1.7.1. エンタープライズ Bean のビジネスインターフェース リンクのコピーリンクがクリップボードにコピーされました!
8.1.7.2. EJB ローカルビジネスインターフェース リンクのコピーリンクがクリップボードにコピーされました!
8.1.7.3. EJB リモートビジネスインターフェース リンクのコピーリンクがクリップボードにコピーされました!
8.1.7.4. EJB No-interface Beans リンクのコピーリンクがクリップボードにコピーされました!
8.2. エンタープライズ Bean プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
8.2.1. Red Hat JBossDeveloperStudio を使用して EJB アーカイブプロジェクトを作成する リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- JBoss EAP 6 のサーバーとサーバーランタイムが設定されました。「Define New Server を使用して JBossEAP サーバーを追加します」 を参照すること。
手順8.1 Red Hat JBossDeveloperStudio で EJB プロジェクトを作成します
新規プロジェクトを作成します。
新規 EJB プロジェクトウィザードを開くには、 メニューに移動し、、 の順に選択します。図8.1 新しい EJB プロジェクトウィザード
詳細を指定
次の詳細を入力します。- プロジェクト名。Red Hat JBoss Developer Studio に表示されるプロジェクトの名前であるだけでなく、これはデプロイされた JAR ファイルのデフォルトのファイル名でもあります。
- プロジェクトの場所。プロジェクトのファイルが保存されるディレクトリー。デフォルトは、現在のワークスペースのディレクトリーです。
- ターゲットランタイムこれは、プロジェクトに使用されるサーバーランタイムです。これは、デプロイするサーバーによって使用されるものと同じ JBoss EAP 6 ランタイムに設定する必要があります。
- EJB モジュールバージョン。これは、エンタープライズ Bean が準拠する EJB 仕様のバージョンです。Red Hat は、
3.1の使用を推奨します。 - 設定これにより、プロジェクトでサポートされている機能を調整できます。選択したランタイムにデフォルト設定を使用します。
をクリックして先に進みます。Java ビルド設定
この画面では、Java ソースファイルとビルドされた出力が配置されるディレクトリーを含むディレクトリーをカスタマイズできます。この設定は変更せず、 をクリックします。EJB モジュールの設定
デプロイメント記述子が必要な場合は、ejb-jar.xml デプロイメント記述子を生成 するチェックボックスをオンにします。デプロイメント記述子は EJB 3 1 では任意で、必要な場合は後で追加できます。をクリックするとプロジェクトが作成され、Project Explorer に表示されます。図8.2 Project Explorer で新たに作成された EJB プロジェクト
デプロイのためにビルドアーティファクトをサーバーに追加する
ビルドされたアーティファクトをデプロイするサーバーをサーバータブで右クリックして 追加と削除 ダイアログを開き、追加と削除を選択します。Available コラムからデプロイする リソースを選択し、 ボタンをクリックします。リソースは Configured コラムに移動します。 をクリックしてダイアログを閉じます。図8.3 ダイアログの追加または削除
結果
これで、Red Hat JBoss Developer Studio に EJB プロジェクトがあり、指定したサーバーにビルドしてデプロイできます。
8.2.2. Maven での EJB アーカイブプロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
要件:
- Maven がすでにインストールされている。
- Maven の基本的な使用方法を理解している。
手順8.2 Maven での EJB アーカイブプロジェクトの作成
Maven プロジェクトを作成する
EJB プロジェクトは、Maven のアーキタイプシステムとejb-javaee6アーキタイプ。これを実行するには、以下のパラメーターを指定して mvn コマンドを実行します。mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6
mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6Copy to Clipboard Copied! Toggle word wrap Toggle overflow Maven はプロンプトを表示しますgroupId、artifactId、versionとpackageあなたのプロジェクトのために。Copy to Clipboard Copied! Toggle word wrap Toggle overflow エンタープライズ Bean を追加する
エンタープライズ Bean を作成し、それらを Bean のパッケージの適切なサブディレクトリーのsrc/main/javaディレクトリーの下のプロジェクトに追加します。プロジェクトをビルドします。
プロジェクトをビルドするには、pom.xmlファイルと同じディレクトリーで mvnpackage コマンドを実行します。これにより、Java クラスがコンパイルされ、JAR ファイルがパッケージ化されます。ビルドされた JAR ファイルの名前はartifactId -- version.jarで、target/ディレクトリーに配置されます。
8.2.3. EJB プロジェクトを含む EAR プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- JBoss EAP 6 のサーバーとサーバーランタイムが設定されました。「Define New Server を使用して JBossEAP サーバーを追加します」を参照してください。
手順8.3 EJB プロジェクトを含む EAR プロジェクトの作成
新しい EAR アプリケーションプロジェクトウィザードを開きます
メニューに移動し、新規、 の順に選択すると、プロジェクト ウィザードが表示されます。 を選択し、 をクリックします。図8.4 新規 EAR アプリケーションプロジェクトウィザード
供給の詳細
次の詳細を入力します。- プロジェクト名。Red Hat JBoss Developer Studio に表示されるプロジェクトの名前であるだけでなく、これはデプロイされた EAR ファイルのデフォルトのファイル名でもあります。
- プロジェクトの場所。プロジェクトのファイルが保存されるディレクトリー。デフォルトは、現在のワークスペースのディレクトリーです。
- ターゲットランタイムこれは、プロジェクトに使用されるサーバーランタイムです。これは、デプロイするサーバーによって使用されるものと同じ JBoss EAP 6 ランタイムに設定する必要があります。
- EAR バージョン。これは、プロジェクトが準拠する JavaEnterpriseEdition 仕様のバージョンです。Red Hat は、
6の使用を推奨します。 - 設定これにより、プロジェクトでサポートされている機能を調整できます。選択したランタイムにデフォルト設定を使用します。
をクリックして先に進みます。新しい EJB モジュールを追加します。
ウィザードの Enterprise Applicaiton ページから、新しいモジュールを追加できます。新しい EJB Project をモジュールとして追加するには、以下の手順に従います。新しい EJB モジュールを追加する
をクリックし、Create Default Modules チェックボックスのチェックを外し、Enterprise Java Bean を選択して をクリックします。New EJB Project ウィザードが表示されます。EJB プロジェクトの作成
新しい EJB プロジェクト ウィザードは、新しいスタンドアロン EJB プロジェクトの作成に使用されるウィザードと同じであり、「Red Hat JBossDeveloperStudio を使用して EJB アーカイブプロジェクトを作成する」。プロジェクトの作成に必要な最低限の詳細は、以下のとおりです。- プロジェクト名
- ターゲットランタイム
- EJB モジュールバージョン
- 設定
ウィザードの他のすべての手順はオプションです。 をクリックし、EJB プロジェクトの作成を完了します。
新規作成した EJB プロジェクトは Java EE モジュール依存関係に一覧表示され、チェックボックスにチェックが付けられます。オプション: application.xml デプロイメント記述子を追加します。
必要な場合は、Generate application.xml deployment descriptor チェックボックスにチェックを入れます。Finish をクリックします。
EJB と EAR という 2 つのプロジェクトが表示されます。デプロイのためにビルドアーティファクトをサーバーに追加する
Server タブで、ビルドされたアーティファクトをデプロイするサーバーの Servers タブで Add and Remove ダイアログを開き、 を選択します。Available コラムからデプロイする EAR リソースを選択し、 ボタンをクリックします。リソースは Configured コラムに移動します。 をクリックしてダイアログを閉じます。図8.5 ダイアログの追加または削除
結果
これで、メンバー EJB プロジェクトを含む Enterprise Application Project ができました。これにより、EJB サブデプロイメントを含む単一の EAR デプロイメントとして指定のサーバーにビルドされ、デプロイされます。
8.2.4. EJB プロジェクトへのデプロイメント記述子の追加 リンクのコピーリンクがクリップボードにコピーされました!
必要条件:
- Red Hat JBoss Developer Studio に EJB プロジェクトがあり、そこに EJB デプロイメント記述子を追加します。
手順8.4 EJB プロジェクトへのデプロイメント記述子の追加
プロジェクトを開く
Red Hat JBossDeveloperStudio でプロジェクトを開きます。デプロイメント記述子を追加する
プロジェクトビューの Deployment Descriptor フォルダーを右クリックして、 タブを選択します。図8.6 デプロイメント記述子の追加
ejb-jar.xml が ejbModule/META-INF/ に作成されます。プロジェクトビューで DeploymentDescriptor フォルダーをダブルクリックすると、このファイルも開きます。
8.3. セッション Bean リンクのコピーリンクがクリップボードにコピーされました!
8.3.1. セッション Bean リンクのコピーリンクがクリップボードにコピーされました!
8.3.2. ステートレスセッション Bean リンクのコピーリンクがクリップボードにコピーされました!
8.3.3. ステートフルセッション Bean リンクのコピーリンクがクリップボードにコピーされました!
8.3.4. シングルトンセッション Bean リンクのコピーリンクがクリップボードにコピーされました!
8.3.5. Red Hat JBossDeveloperStudio のプロジェクトにセッション Bean を追加します リンクのコピーリンクがクリップボードにコピーされました!
要件:
- 1 つ以上のセッション Bean を追加する EJB または動的 Web プロジェクトが Red Hat にあります。
手順8.5 Red Hat JBossDeveloperStudio のプロジェクトにセッション Bean を追加します
プロジェクトを開く
Red Hat JBossDeveloperStudio でプロジェクトを開きます。”Create EJB 3.x Session Bean” ウィザードを開きます。
Create EJB 3.x Session Bean ウィザードを開くには、 メニューに移動し、 を選択して を選択します。図8.7 Create EJB 3.x Session Bean ウィザード
クラス情報を指定する
次の詳細を入力します。- プロジェクト正しいプロジェクトが選択されていることを確認します。
- ソースフォルダーこれは、Java ソースファイルが作成されるフォルダーです。通常、これは変更する必要はありません。
- Packageクラスが属するパッケージを指定します。
- クラス名セッション Bean となるクラスの名前を指定します。
- スーパークラスセッション Bean クラスは、スーパークラスから継承できます。セッションにスーパークラスがある場合は、これを指定します。
- 状態タイプセッション Bean の状態タイプ (stateless、stateful、または singleton) を指定します。
- ビジネスインターフェイスデフォルトでは、インターフェイスなしボックスがオンになっているため、インターフェイスは作成されません。定義するインターフェースのボックスにチェックを入れ、必要に応じて名前を調整します。Web アーカイブ (WAR) のエンタープライズ Bean は EJB 3.1 Lite のみをサポートし、これにはリモートビジネスインターフェースが含まれないことに注意してください。
をクリックします。セッション Bean 固有の情報
ここで追加情報を入力して、セッション Bean をさらにカスタマイズできます。ここで情報を変更する必要はありません。変更可能なアイテムは次のとおりです。- Bean 名
- マップされた名前
- トランザクションタイプ (管理対象コンテナーまたは管理対象 Bean)
- Bean が実装する必要のある追加のインターフェースを指定可能
- EJB 2.x Home and Component インターフェースを必要に応じて指定することもできます。
Finish
をクリックすると、新しいセッション Bean が作成され、プロジェクトに追加されます。新しいビジネスインターフェースのファイルが指定されていれば、それらも作成されます。
図8.8 Red Hat JBossDeveloperStudio の新しいセッション Bean
8.4. メッセージ駆動 Bean リンクのコピーリンクがクリップボードにコピーされました!
8.4.1. メッセージ駆動 Bean リンクのコピーリンクがクリップボードにコピーされました!
8.4.2. リソースアダプター リンクのコピーリンクがクリップボードにコピーされました!
8.4.3. Red Hat JBossDeveloperStudio で JMS ベースのメッセージ駆動型 Bean を作成する リンクのコピーリンクがクリップボードにコピーされました!
要件:
- Red Hat JBossDeveloperStudio で既存のプロジェクトを開いておく必要があります。
- Bean がリッスンする JMS 宛先の名前とタイプを知っている必要があります。
- Java Messaging Service (JMS) のサポートは、この Bean がデプロイされる JBoss EAP 6 設定で有効にする必要があります。
手順8.6 Red Hat JBossDeveloperStudio に JMS ベースのメッセージ駆動型 Bean を追加します
Create EJB 3.x Message-LoadBalancern Bean ウィザードを開きます。
→ → に移動します。EJB/Message-Driven Bean (EJB 3.x) を選択し、 ボタンをクリックします。図8.9 Create EJB 3.x Message-Driven Bean ウィザード
クラスファイル宛先の詳細を指定します。
ここでは、bean クラスに指定する詳細セット (プロジェクト、Java クラス、メッセージの宛先) があります。- プロジェクト
- Workspace に複数のプロジェクトが存在する場合は、 メニューで適切なプロジェクトが選択されていることを確認します。
- 新規 Bean のソースファイルが作成されるフォルダーは、選択したプロジェクトのディレクトリーの下の
ejbModuleになります。これは、特定の要件がある場合にのみ変更します。
- Java class
- 必須フィールドは Java package と class name です。
- アプリケーションのビジネスロジックで必要な場合を除いて、Superclass を指定する必要はありません。
- メッセージの宛先
- 以下は、JMS ベースのメッセージ駆動 Bean に提供する必要のある詳細です。
- 宛先名これは、Bean が応答するメッセージを含むキューまたはトピック名です。
- デフォルトでは、JMS チェックボックスが選択されます。これは変更しないでください。
- 必要に応じて Destination type を Queue または Topic に設定します。
ボタンをクリックします。メッセージ駆動 Bean 固有の情報を入力します。
ここでのデフォルト値は、コンテナー管理トランザクションを使用する JMS ベースのメッセージ駆動 Bean に適しています。- Bean が Bean 管理対象トランザクションを使用する場合は、Transaction type を Bean に変更します。
- クラス名とは異なる Bean 名が必要な場合は Bean name を変更します。
- JMS Message Listener インターフェースはすでにリストされています。インターフェースがアプリケーションのビジネスロジックに固有のものでない場合は、インターフェースを追加または削除する必要はありません。
- メソッドスタブを作成するためのチェックボックスは選択したままにしておきます。
ボタンをクリックします。
onMessage() メソッド用のスタブメソッドで作成されます。対応するファイルで開かれた Red Hat エディターウィンドウ。
8.4.4. MDB に対して jboss-ejb3.xml でのリソースアダプターの指定 リンクのコピーリンクがクリップボードにコピーされました!
jboss-ejb3.xml デプロイメント記述子では、MDB が使用するリソースアダプターを指定できます。または、MDB 用に JBoss EAP 6 サーバー全体のデフォルトリソースアダプターを設定するには、『管理および設定ガイド』 の 『メッセージドリブン Bean』 の設定を参照してください。
jboss-ejb3.xml でリソースアダプターを指定するには、以下の例を使用します。
例8.1 例: MDB リソースアダプターの jboss-ejb3.xml 設定
<mdb:resource-adapter-name>:
- 別の EAR にあるリソースアダプターの場合:
<mdb:resource-adapter-name>OtherDeployment.ear#MyResourceAdapter.rar</mdb:resource-adapter-name>
<mdb:resource-adapter-name>OtherDeployment.ear#MyResourceAdapter.rar</mdb:resource-adapter-name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - MDB と同じ EAR にあるリソースアダプターでは、EAR 名を省略できます。
<mdb:resource-adapter-name>#MyResourceAdapter.rar</mdb:resource-adapter-name>
<mdb:resource-adapter-name>#MyResourceAdapter.rar</mdb:resource-adapter-name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.4.5. アプリケーションで EJB および MDB プロパティーの置換を有効にする リンクのコピーリンクがクリップボードにコピーされました!
@ActivationConfigPropertyと@Resource注釈。プロパティーの置換には、以下の設定およびコードの変更が必要です。
- JBoss EAP サーバー設定ファイルでプロパティー置換を有効にする必要があります。
- JBoss EAP サーバーの起動時に、システムプロパティーをサーバー設定ファイルに定義するか、引数として渡す必要があります。
- 置換変数を使用するには、コードを変更する必要があります。
手順8.7 MDB アプリケーションにプロパティー置換を実装する
helloworld-mdb クイックスタートに基づいています。このトピックでは、そのクイックスタートを変更してプロパティーの置換を有効にする方法を示します。
プロパティー置換を有効にするように JBoss EAP サーバーを設定します。
プロパティーの置換を有効にするように JBoss EAP サーバーを設定する必要があります。これを行うには、<annotation-property-replacement>サーバー設定ファイルのeeサブシステムの属性をtrueに設定します。- サーバー設定ファイルをバックアップします。
helloworld-mdbクイックスタートの例では、スタンドアロンサーバーの完全なプロファイルが必要であるため、これはstandalone/configuration/standalone-full.xmlファイルです。管理対象ドメインでサーバーを実行している場合は、domain/configuration/domain.xmlファイルになります。 - フルプロファイルで JBoss EAP サーバーを起動します。Linux の場合Windows の場合:
EAP_HOME/bin/standalone.sh -c standalone-full.xml
EAP_HOME/bin/standalone.sh -c standalone-full.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOMEbin\standalone.bat -c standalone-full.xml
EAP_HOMEbin\standalone.bat -c standalone-full.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - ご使用のオペレーティングシステム向けのコマンドを使用して、管理 CLI を起動します。Linux の場合Windows の場合:
EAP_HOME/bin/jboss-cli.sh --connect
EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOME\bin\jboss-cli.bat --connect
EAP_HOME\bin\jboss-cli.bat --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow - アノテーションプロパティーの置換を有効にするには、以下のコマンドを実行します。
/subsystem=ee:write-attribute(name=annotation-property-replacement,value=true)
/subsystem=ee:write-attribute(name=annotation-property-replacement,value=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下の結果が表示されるはずです。
{"outcome" => "success"}{"outcome" => "success"}Copy to Clipboard Copied! Toggle word wrap Toggle overflow - JBoss EAP サーバー設定ファイルへの変更を確認します。
eeサブシステムには以下の XML が含まれるはずです。<subsystem xmlns="urn:jboss:domain:ee:1.2"> <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement> <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement> <annotation-property-replacement>true</annotation-property-replacement> </subsystem><subsystem xmlns="urn:jboss:domain:ee:1.2"> <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement> <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement> <annotation-property-replacement>true</annotation-property-replacement> </subsystem>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
システムプロパティーの定義
サーバー設定ファイルでシステムプロパティーを指定するか、JBoss EAP サーバーの起動時にコマンドラインの引数としてプロパティーを渡すことができます。サーバー設定ファイルで定義されたシステムプロパティーは、サーバーの起動時にコマンドラインに渡されるプロパティーよりも優先されます。- サーバー設定でのシステムプロパティーの定義
- 前のステップで説明したように、JBoss EAP サーバーと管理 API を起動します。
- 以下のコマンド構文を使用して、JBoss EAP サーバーのシステムプロパティーを設定します。
/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)
/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)Copy to Clipboard Copied! Toggle word wrap Toggle overflow helloworld-mdbクイックスタートでは、次のシステムプロパティーを設定します。/system-property=property.helloworldmdb.queue:add(value=java:/queue/HELLOWORLDMDBPropQueue) /system-property=property.helloworldmdb.topic:add(value=java:/topic/HELLOWORLDMDBPropTopic) /system-property=property.connection.factory:add(value=java:/ConnectionFactory)
/system-property=property.helloworldmdb.queue:add(value=java:/queue/HELLOWORLDMDBPropQueue) /system-property=property.helloworldmdb.topic:add(value=java:/topic/HELLOWORLDMDBPropTopic) /system-property=property.connection.factory:add(value=java:/ConnectionFactory)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - JBoss EAP サーバー設定ファイルへの変更を確認します。以下のシステムプロパティーは、
<extensions>の後に表示されるはずです。<system-properties> <property name="property.helloworldmdb.queue" value="java:/queue/HELLOWORLDMDBPropQueue"/> <property name="property.helloworldmdb.topic" value="java:/topic/HELLOWORLDMDBPropTopic"/> <property name="property.connection.factory" value="java:/ConnectionFactory"/> </system-properties><system-properties> <property name="property.helloworldmdb.queue" value="java:/queue/HELLOWORLDMDBPropQueue"/> <property name="property.helloworldmdb.topic" value="java:/topic/HELLOWORLDMDBPropTopic"/> <property name="property.connection.factory" value="java:/ConnectionFactory"/> </system-properties>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- JBoss EAP サーバーを起動するときにコマンドラインでシステムプロパティーを引数として -DPROPERTY_NAME=PROPERTY_VALUE の形式で渡します。以下は、前の手順で定義されたシステムプロパティーの引数を渡す方法の例になります。
EAP_HOME/bin/standalone.sh -c standalone-full.xml -Dproperty.helloworldmdb.queue=java:/queue/HELLOWORLDMDBPropQueue -Dproperty.helloworldmdb.topic=java:/topic/HELLOWORLDMDBPropTopic -Dproperty.connection.factory=java:/ConnectionFactory
EAP_HOME/bin/standalone.sh -c standalone-full.xml -Dproperty.helloworldmdb.queue=java:/queue/HELLOWORLDMDBPropQueue -Dproperty.helloworldmdb.topic=java:/topic/HELLOWORLDMDBPropTopic -Dproperty.connection.factory=java:/ConnectionFactoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow
システムプロパティーの置換を使用するようにコードを変更します。
ハードコードされたものを置き換える@ActivationConfigPropertyと@Resource新しく定義されたシステムプロパティーを置換した注釈値。以下は、helloworld-mdbクイックスタートを変更して、ソースコードのアノテーション内で新しく定義されたシステムプロパティーの置換を使用する方法の例です。- 変更
@ActivationConfigPropertyシステムプロパティーの置換を使用するためのHelloWorldQueueMDBクラスの宛先プロパティー値。The@MessageDriven注釈は次のようになります。@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.queue}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.queue}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 変更
@ActivationConfigPropertyシステムプロパティーの置換を使用するためのHelloWorldTopicMDBクラスの宛先プロパティー値。The@MessageDriven注釈は次のようになります。@MessageDriven(name = "HelloWorldQTopicMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.topic}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })@MessageDriven(name = "HelloWorldQTopicMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.topic}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })Copy to Clipboard Copied! Toggle word wrap Toggle overflow HelloWorldMDBServletClientクラスの@Resourceアノテーションを変更して、システムプロパティーの置換を使用します。コードは以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow hornetq-jms.xmlファイルを変更して、システムプロパティーの置換値を使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- アプリケーションをデプロイします。アプリケーションは、システムプロパティーで指定された値を使用します。
@Resourceと@ActivationConfigPropertyプロパティー値。
8.5. セッション Bean の呼び出し リンクのコピーリンクがクリップボードにコピーされました!
8.5.1. JNDI を使用してリモートで SessionBean を呼び出す リンクのコピーリンクがクリップボードにコピーされました!
ejb-remote クイックスタートには、この機能を実証する動作中の Maven プロジェクトが含まれています。クイックスタートには、デプロイするセッション Bean とリモートクライアントの両方のプロジェクトが含まれています。以下のコードサンプルは、リモートクライアントプロジェクトから取得したものです。
前提条件
- Maven プロジェクトを作成してすぐに使用できるようにしておく必要があります。
- JBoss EAP 6Maven リポジトリーの設定はすでに追加されています。
- 呼び出すセッション Bean はすでにデプロイされています。
- デプロイされたセッション Bean は、リモートビジネスインターフェイスを実装します。
- セッション Bean のリモートビジネスインターフェイスは、Maven 依存関係として利用できます。リモートビジネスインターフェイスが JAR ファイルとしてのみ利用可能な場合は、JAR をアーティファクトとして Maven リポジトリーに追加することをお勧めします。指示については、install:install-file の 目標について Maven のドキュメントを参照してください。 http://maven.apache.org/plugins/maven-install-plugin/usage.html
- セッション Bean をホストしているサーバーのホスト名と JNDI ポートを知っている必要があります。
手順8.8 セッション Bean のリモート呼び出し用の Maven プロジェクト設定の追加
- 必要なプロジェクトの依存関係を追加しますプロジェクトの
pom.xmlを更新して、必要な依存関係を含める必要があります。 jboss-ejb-client.propertiesファイルを追加しますJBoss EJB クライアント API は、JNDI サービスの接続情報を含むjboss-ejb-client.propertiesという名前のプロジェクトのルートでファイルを見つけることを想定しています。このファイルをプロジェクトのsrc/main/resources/ディレクトリーに次の内容で追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーに一致するようにホスト名とポートを変更します。4447はデフォルトのポート番号です。安全な接続のために、SSL_ENABLED行をtrueに設定し、SSL_STARTTLS行のコメントを解除します。コンテナーの Remoting インターフェイスは、同じポートを使用したセキュリティーで保護された接続とセキュリティーで保護されていない接続をサポートします。- リモートビジネスインターフェイスの依存関係を追加するセッション Bean のリモートビジネスインターフェイスの
pom.xmlに Maven 依存関係を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順8.9 JNDI を使用して Bean プロキシーを取得し、Bean のメソッドを呼び出す
- チェックされた例外を処理する次のコードで使用される 2 つのメソッド (
InitialContext()とlookup()) タイプのチェックされた例外がありますjavax.naming.NamingException。これらのメソッド呼び出しは、キャッチする try/catch ブロックで囲む必要がありますNamingExceptionまたは出力するように宣言されているメソッドでNamingException。ejb-remoteクイックスタートは 2 番目の手法を使用します。 - JNDI コンテキストを作成するJNDI コンテキストオブジェクトは、サーバーにリソースを要求するためのメカニズムを提供します。次のコードを使用して JNDI コンテキストを作成します。
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);Copy to Clipboard Copied! Toggle word wrap Toggle overflow JNDI サービスの接続プロパティーは、jboss-ejb-client.propertiesファイルから読み取られます。 - JNDI コンテキストの lookup () メソッドを使用して Bean プロキシーを取得しますを呼び出す
lookup()Bean プロキシーのメソッドを渡し、必要なセッション Bean の JNDI 名を渡します。これにより、呼び出すメソッドを含むリモートビジネスインターフェイスのタイプにキャストする必要があるオブジェクトが返されます。final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow セッション Bean の JNDI 名は、特別な構文を使用して定義されます。詳細は、「EJB JNDI 命名リファレンス」 を参照してください。 - invoke メソッドプロキシー 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);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);Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロキシー Bean は、メソッド呼び出し要求をサーバー上のセッション Bean に渡し、そこで実行されます。結果はプロキシー Bean に返され、プロキシー Bean はそれを呼び出し元に返します。プロキシー Bean とリモートセッション Bean の間の通信は、呼び出し元に対して透過的です。
8.5.2. EJB クライアントコンテキスト リンクのコピーリンクがクリップボードにコピーされました!
- スタンドアロン Java アプリケーションとして実行されるリモートクライアント。
- 別の JBoss EAP 6 インスタンス内で実行されるリモートクライアント。
8.5.3. 単一の EJB コンテキストを使用する場合の考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
概要
スタンドアロンのリモートクライアントで単一の EJB クライアントコンテキストを使用する場合は、アプリケーション要件を考慮する必要があります。さまざまなタイプのリモートクライアントの詳細については、以下を参照してください。「EJB クライアントコンテキスト」。
単一の EJB クライアントコンテキストを持つリモートスタンドアロンクライアントの一般的なプロセス
リモートスタンドアロンクライアントには、通常、任意の数の EJB レシーバーによってサポートされる EJB クライアントコンテキストが 1 つだけあります。次に、スタンドアロンのリモートクライアントアプリケーションの例を示します。
jboss-ejb-client.properties ファイルによってサポートされます。この設定にはセキュリティークレデンシャルも含まれ、JBoss EAP 6 サーバーに接続する EJB レシーバーを作成するために使用されます。上記のコードが呼び出されると、EJB クライアント API は EJB クライアントコンテキストを検索します。このコンテキストは、EJB 呼び出し要求を受信して処理する EJB レシーバーを選択するために使用されます。この場合、EJB クライアントコンテキストは 1 つしかないため、上記のコードでコンテキストを使用して Bean を呼び出します。JNDI を使用してリモートでセッション Bean を呼び出す手順については、以下で詳しく説明します。「JNDI を使用してリモートで SessionBean を呼び出す」。
異なる資格情報を必要とするリモートスタンドアロンクライアント
ユーザーアプリケーションが Bean を複数回呼び出したい場合がありますが、異なるセキュリティークレデンシャルを使用して JBoss EAP 6 サーバーに接続します。以下は、同じ Bean を 2 回呼び出すスタンドアロンのリモートクライアントアプリケーションの例です。
解決策
スコープ付き EJB クライアントコンテキストは、この問題の解決策を提供します。これらは、EJB クライアントコンテキストとそれに関連する JNDI コンテキスト (通常は EJB 呼び出しに使用される) をより詳細に制御する方法を提供します。スコープ付き EJB クライアントコンテキストの詳細については、以下を参照してください。「スコープ付き EJB クライアントコンテキストの使用」と「スコープ付き EJB クライアントコンテキストを使用して EJB を設定する」。
8.5.4. スコープ付き EJB クライアントコンテキストの使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
EJB を呼び出すには JBoss EAP 6 の以前のバージョンでは、通常、JNDI コンテキストを作成し、ターゲットサーバーを指す PROVIDER_URL を渡します。その JNDI コンテキストを使用してルックアップされた EJB プロキシーで行われた呼び出しはすべて、そのサーバーで終了します。スコープ付き EJB クライアントコンテキストを使用すると、ユーザーアプリケーションは、特定の呼び出しに使用される EJB レシーバーを制御できます。
リモートスタンドアロンクライアントでスコープ付き EJB クライアントコンテキストを使用する
スコープ付き EJB クライアントコンテキストが導入される前は、コンテキストは通常、クライアントアプリケーションにスコープされていました。スコープ付きクライアントコンテキストにより、EJB クライアントコンテキストを JNDI コンテキストでスコープできるようになりました。以下は、スコープ付き EJB クライアントコンテキストを使用して同じ Bean を 2 回呼び出すスタンドアロンのリモートクライアントアプリケーションの例です。
jboss-ejb-client.properties ファイルで使用されているものと同じプロパティーのセットです。EJB クライアントコンテキストを JNDI コンテキストにスコープするには、org.jboss.ejb.client.scoped.context プロパティーを指定し、その値を true に設定する必要もあります。このプロパティーは、EJB クライアント API に、EJB レシーバーによってサポートされる EJB クライアントコンテキストを作成する必要があること、および作成されたコンテキストが、それを作成した JNDI コンテキストに対してのみスコープまたは表示されることを通知します。この JNDI コンテキストを使用してルックアップまたは呼び出された EJB プロキシーは、この JNDI コンテキストに関連付けられた EJB クライアントコンテキストのみを認識します。アプリケーションが EJB をルックアップして呼び出すために使用する他の JNDI コンテキストは、他のスコープ付き EJB クライアントコンテキストを認識しません。
org.jboss.ejb.client.scoped.context プロパティーを渡さず、EJB クライアントコンテキストにスコープされていない JNDI コンテキストは、デフォルトの動作を使用します。これは、通常、アプリケーション全体。
InitialContext不要になったとき。いつInitialContextが閉じられると、リソースはすぐに解放されます。それにバインドされているプロキシーは無効になり、呼び出しは例外を出力します。を閉じられなかったInitialContextリソースとパフォーマンスの問題が発生する可能性があります。
8.5.5. スコープ付き EJB クライアントコンテキストを使用して EJB を設定する リンクのコピーリンクがクリップボードにコピーされました!
概要
EJB は、マップベースのスコープコンテキストを使用して設定できます。これは、jboss-ejb-client.properties にある標準プロパティーを使用して プロパティー マップにプログラムで入力し、org.jboss.ejb.client.scoped.context プロパティーに true を指定し、InitialContext 作成時にプロパティーを渡すことで実現されます。
手順8.10 マップベースのスコープコンテキストを使用して EJB を設定する
プロパティーを設定します。
標準のjboss-ejb-client.propertiesファイルで使用されているのと同じプロパティーのセットを指定して、EJB クライアントのプロパティーをプログラムで設定します。スコープコンテキストを有効にするには、org.jboss.ejb.client.scoped.contextプロパティーを指定し、その値をtrueに設定する必要があります。以下は、プログラムでプロパティーを設定する例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテキスト作成でプロパティーを渡す
// Create the context using the configured properties InitialContext ic = new InitialContext(ejbClientContextProps); MySLSB bean = ic.lookup("ejb:myapp/ejb//MySLSBBean!" + MySLSB.class.getName());// Create the context using the configured properties InitialContext ic = new InitialContext(ejbClientContextProps); MySLSB bean = ic.lookup("ejb:myapp/ejb//MySLSBBean!" + MySLSB.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
追加情報
- ルックアップ EJB プロキシーによって生成されたコンテキストは、このスコープコンテキストによってバインドされ、関連する接続パラメーターのみを使用します。これにより、さまざまなコンテキストを作成して、クライアントアプリケーション内のデータにアクセスしたり、さまざまなログインを使用してサーバーに個別にアクセスしたりすることができます。
- クライアントでは、スコープ付き
InitialContextとスコープ付きプロキシーの両方がスレッドに渡され、各スレッドが指定されたコンテキストで動作できるようになります。プロキシーを同時に使用できる複数のスレッドにプロキシーを渡すこともできます。 - スコープコンテキスト EJB プロキシーは、リモートコールでシリアル化されてから、サーバーで逆シリアル化されます。デシリアライズされると、スコープされたコンテキスト情報が削除され、デフォルトの状態に戻ります。デシリアライズされたプロキシーがリモートサーバーで使用されている場合、作成時に使用されていたスコープコンテキストがなくなったため、
EJBCLIENT000025エラーが発生したり、EJB 名を使用して不要なターゲットを呼び出したりする可能性があります。
8.5.6. EJB クライアントのプロパティー リンクのコピーリンクがクリップボードにコピーされました!
概要
次の表に、プログラムまたは jboss-ejb-client.properties ファイルで設定できるプロパティーを示します。
EJB クライアントのグローバルプロパティー
次の表に、同じスコープ内のライブラリー全体に有効なプロパティーを示します。
| プロパティー名 | Description |
|---|---|
endpoint.name |
クライアントエンドポイントの名前。設定されていない場合、デフォルト値は
client-endpoint です。
スレッド名にはこのプロパティーが含まれているため、これはさまざまなエンドポイント設定を区別するのに役立ちます。
|
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED |
すべての接続で SSL プロトコルを有効にするかどうかを指定するブール値。
警告
Red Hat は、影響するすべてのパッケージで TLSv1.1 または TLSv1.2 を利用するために SSL を明示的に無効化することを推奨しています。
|
deployment.node.selector | org.jboss.ejb.client.DeploymentNodeSelector の実装の完全修飾名。
これは、EJB の呼び出しの負荷を分散するために使用されます。
|
invocation.timeout |
EJB ハンドシェイクまたはメソッド呼び出しの要求/応答サイクルのタイムアウト。値はミリ秒単位です。
実行にタイムアウト期間より長い時間がかかる場合、メソッドを呼び出すと
java.util.concurrent.TimeoutException が出力されます。実行が完了し、サーバーは中断されません。
|
reconnect.tasks.timeout |
バックグラウンド再接続タスクのタイムアウト。値はミリ秒単位です。
多数の接続がダウンしている場合、次のクライアント EJB 呼び出しはアルゴリズムを使用して、適切なノードを見つけるために再接続が必要かどうかを判断します。
|
org.jboss.ejb.client.scoped.context |
スコープ付き EJB クライアントコンテキストを有効にするかどうかを指定するブール値。デフォルト値は
false です。
true に設定すると、EJB クライアントは JNDI コンテキストに関連付けられたスコープコンテキストを使用します。それ以外の場合、EJB クライアントコンテキストは JVM のグローバルセレクターを使用して、リモート EJB とホストの呼び出しに使用されるプロパティーを決定します。
|
EJB クライアント接続のプロパティー
接続プロパティーは、接頭辞 remote.connection で始まります。CONNECTION_NAME ここで、CONNECTION_NAME は、接続を一意に識別するためにのみ使用されるローカル識別子です。
| プロパティー名 | Description |
|---|---|
remote.connections |
アクティブな
接続名 のコンマ区切りのリスト。各接続は、この名前を使用して設定されます。
|
|
接続のホスト名または IP。
|
|
接続用のポート。デフォルト値は 4447 です。
|
|
接続セキュリティーの認証に使用されるユーザー名。
|
|
ユーザーの認証に使用されるパスワード。
|
|
初期接続のタイムアウト期間。その後、再接続タスクは、接続を確立できるかどうかを定期的にチェックします。値はミリ秒単位です。
|
| CallbackHandler クラスの完全修飾名。接続を確立するために使用され、接続が開いている限り変更できません。
|
|
アウトバウンド要求の最大数を指定する整数値。デフォルトでは 80 回です。
すべての呼び出しを処理するために、クライアント (JVM) からサーバーへの接続は 1 つだけです。
|
|
正常に接続するためにクライアントが資格情報を提供する必要があるかどうかを決定するブール値。デフォルト値は
true です。
true に設定されている場合、クライアントは資格情報を提供する必要があります。false に設定すると、リモートコネクターがセキュリティーレルムを要求しない限り、呼び出しが許可されます。
|
|
接続の作成中に認証に使用される特定の SASL メカニズムを無効にします。
JBOSS-LOCAL-USER は、クライアントとサーバーが同じマシン上にある場合に使用されるサイレント認証メカニズムが無効になっていることを意味します。
|
|
認証中のプレーンテキストメッセージの使用を有効または無効にするブール値。JAAS を使用する場合、プレーンテキストのパスワードを許可するには、false に設定する必要があります。
|
|
この接続で SSL プロトコルを有効にするかどうかを指定するブール値。
警告
Red Hat は、影響するすべてのパッケージで TLSv1.1 または TLSv1.2 を利用するために SSL を明示的に無効化することを推奨しています。
|
|
ファイアウォールの場合など、自動クローズを防ぐためにクライアントとサーバー間でハートビートを送信する間隔。値はミリ秒単位です。
|
EJB クライアントクラスターのプロパティー
最初の接続がクラスター化された環境に接続する場合、クラスターのトポロジーは自動的かつ非同期に受信されます。これらのプロパティーは、受信した各メンバーに接続するために使用されます。各プロパティーは、接頭辞 remote.cluster で始まります。CLUSTER_NAME ここで、CLUSTER_NAME は、サーバーの Infinispan サブシステム設定に関連するものを指します。
| プロパティー名 | Description |
|---|---|
| org.jboss.ejb.client.ClusterNodeSelector の実装の完全修飾名。
org.jboss.ejb.client.DeploymentNodeSelector ではなく、このクラスは、クラスター化された環境で EJB 呼び出しの負荷を分散するために使用されます。クラスターが完全にダウンしている場合、呼び出しは失敗し、使用可能な ejb レシーバーがありません。
|
|
クラスター全体に対して実行できるアウトバウンド要求の最大数を指定する整数値。
|
|
この特定のクラスターノードに対して実行できるアウトバウンド要求の最大数を指定する整数値。
|
8.5.7. リモート EJB データ圧縮 リンクのコピーリンクがクリップボードにコピーされました!
org.jboss.ejb.client.annotation.CompressionHint。ヒントの値では、リクエスト、応答、要求、応答を圧縮するかどうかを指定します。@CompressionHint デフォルトをcompressResponse=true と compressRequest=true に追加。
compressionLevel 設定は、以下の値にすることができます。
- BEST_COMPRESSION
- BEST_SPEED
- DEFAULT_COMPRESSION
- NO_COMPRESSION
CompressionLevel のデフォルト設定は Deflater.DEFAULT_COMPRESSION です。
org.jboss.ejb.client.view.annotation.scan.enabled システムプロパティーが true に設定されていることを確認します。このプロパティーは JBoss EJB Client に対してアノテーションをスキャンするように指示します。
8.6. コンテナーインターセプター リンクのコピーリンクがクリップボードにコピーされました!
8.6.1. コンテナーインターセプターについて リンクのコピーリンクがクリップボードにコピーされました!
ejb-jar.xml ファイルで許可されているものと同じ XSD 要素を使用します。
インターセプターチェーン内のコンテナーインターセプターの配置
EJB 用に設定されたコンテナーインターセプターは、JBoss EAP が提供するセキュリティーインターセプター、トランザクション管理インターセプター、およびその他のサーバーが提供するインターセプターの前に実行されることが保証されています。これにより、特定のアプリケーションコンテナーインターセプターは、呼び出しが進む前に、関連するコンテキストデータを処理または設定できます。
コンテナーインターセプターと Java EE インターセプター API の違い
コンテナーインターセプターは Java EE インターセプターと同様にモデル化されますが、API のセマンティクスにはいくつかの違いがあります。たとえば、コンテナーインターセプターがjavax.interceptor.InvocationContext.getTarget()これらのインターセプターは、EJB コンポーネントがセットアップまたはインスタンス化されるずっと前に呼び出されるためです。
8.6.2. コンテナーインターセプタークラスを作成する リンクのコピーリンクがクリップボードにコピーされました!
概要
コンテナーインターセプタクラスは、単純な Plain Old Java Object (POJO) です。彼らは使用します@javax.annotation.AroundInvokeBean での呼び出し中に呼び出されるメソッドをマークします。
iAmAround呼び出しの方法:
例8.2 コンテナーインターセプタークラスの例
jboss-ejb3.xml ファイルを参照してください。「コンテナーインターセプターの設定」。
8.6.3. コンテナーインターセプターの設定 リンクのコピーリンクがクリップボードにコピーされました!
概要
コンテナーインターセプタは、標準の Java EE インターセプタライブラリーを使用します。つまり、3.1 バージョンの ejb-jar デプロイメント記述子の ejb-jar.xml ファイルで許可されているものと同じ XSD 要素を使用します。それらは標準の Java EE インターセプターライブラリーをベースとしているため、コンテナーインターセプターはデプロイメント記述子を使用してのみ設定できます。これは設計によって行われたため、アプリケーションは JBoss 固有のアノテーションやその他のライブラリー依存関係を必要としません。コンテナーインターセプターの詳細については、以下を参照してください。「コンテナーインターセプターについて」。
手順8.11 記述子ファイルを作成して、コンテナーインターセプターを設定します
- EJB デプロイメントの
META-INFディレクトリーにjboss-ejb3.xmlファイルを作成します。 - 記述子ファイルにコンテナーインターセプター要素を設定します。
urn:container-interceptors:1.0ネームスペースを使用して、コンテナーインターセプター要素の設定を指定します。<container-interceptors>要素を使用してコンテナーインターセプターを指定します。>interceptor-binding>要素を使用してコンテナーインターセプターを EJB にバインドします。インターセプターは、次のいずれかの方法でバインドできます。- ワイルドカード
*を使用して、インターセプターをデプロイメントのすべての EJB にバインドします。 - 特定の EJB 名を使用して、個々の Bean レベルでインターセプターをバインドします。
- EJB の特定のメソッドレベルでインターセプターをバインドします。
注記これらの要素は、JavaEE インターセプターの場合と同じ方法で EJB3.1XSD を使用して設定されます。
- 上記の要素の例については、次の記述子ファイルを確認してください。
例8.3 jboss-ejb3.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow urn:container-interceptors:1.0名前空間の XSD は、EAP_HOME/docs/schema/jboss-ejb-container-interceptors_1_0.xsd で入手できます。
8.6.4. セキュリティーコンテキスト ID を変更する リンクのコピーリンクがクリップボードにコピーされました!
概要
デフォルトでは、アプリケーションサーバーにデプロイされた EJB にリモート呼び出しを行うと、サーバーへの接続が認証され、この接続を介して受信した要求はすべて、接続を認証した ID として実行されます。これは、クライアントとサーバー間の呼び出しの両方に適用されます。同じクライアントから異なるアイデンティティーを使用する必要がある場合は、通常は、異なるアイデンティティーとして認証されるように、サーバーへの接続を複数開く必要があります。複数のクライアント接続を開くのではなく、認証されたユーザーに別のユーザーとしてリクエストを実行する権限を与えることができます。
ejb-security-interceptors クイックスタートを参照してください。
手順8.12 セキュリティーコンテキストの ID を変更する
クライアント側インターセプターを作成する
クライアント側インターセプターは、org.jboss.ejb.client.EJBClientInterceptorインターフェイスを実装する必要があります。インターセプターは、要求された ID をコンテキストデータマップを介して渡す必要があります。コンテキストデータマップは、EJBClientInvocationContext.getContextData()。以下は、クライアント側のインターセプターコードの例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーアプリケーションは、次のいずれかの方法で、EJBClientContextのインターセプターチェーンにインターセプターを挿入できます。プログラムで
このアプローチでは、org.jboss.ejb.client.EJBClientContext.registerInterceptor(int order, EJBClientInterceptor interceptor)メソッドとパスorderそしてそのinterceptor実例。Theorderこのクライアントインターセプターがインターセプターチェーンのどこに配置されるかを決定します。ServiceLoader メカニズム
このアプローチでは、META-INF/services/org.jboss.ejb.client.EJBClientInterceptorファイルを作成し、クライアントアプリケーションのクラスパスに配置またはパッケージ化します。ファイルのルールは、Java ServiceLoader Mechanism によって指示されます。このファイルには、EJB クライアントインターセプター実装の完全修飾クラス名ごとに個別の行が含まれることが予想されます。EJB クライアントインターセプタークラスはクラスパスで利用できる必要があります。ServiceLoaderメカニズムを使用して追加された EJB クライアントインターセプターは、クラスパスで検出された順序で、クライアントインターセプターチェーンの最後に追加されます。ejb-security-interceptorsクイックスタートはこのアプローチを使用します。
サーバー側コンテナーインターセプターを作成して設定する
コンテナーインターセプタクラスは、単純な Plain Old Java Object (POJO) です。彼らは使用します@javax.annotation.AroundInvokeBean での呼び出し中に呼び出されるメソッドをマークします。コンテナーインターセプターの詳細については、以下を参照してください。「コンテナーインターセプターについて」。コンテナーインターセプターを作成する
このインターセプターは、ID を含むInvocationContextを受信し、その新しい ID への切り替えを要求します。以下は、実際のコード例の要約版です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーインターセプターを設定する
サーバー側のコンテナーインターセプターを設定する方法については、以下を参照してください。「コンテナーインターセプターの設定」。
JAASLoginModule を作成します
このコンポーネントは、ユーザーが要求された ID として要求を実行できることを確認するロールを果たします。次の簡略化されたコード例は、ログインと検証を実行するメソッドを示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ejb-security-interceptors クイックスタート README.html ファイルを参照してください。
8.6.5. アプリケーションでクライアント側インターセプターを使用する リンクのコピーリンクがクリップボードにコピーされました!
プログラムでインターセプターをアプリケーションに接続します
このアプローチでは、org.jboss.ejb.client.EJBClientContext.registerInterceptor(int order, EJBClientInterceptor interceptor)API とパスorderそしてそのinterceptor実例。Theorderクライアントインターセプターチェーンのどこに正確にこれを決定するために使用されますinterceptor配置されます。
ServiceLoader メカニズムを介してインターセプターをアプリケーションに接続します
このアプローチでは、META-INF/services/org.jboss.ejb.client.EJBClientInterceptor ファイルを作成し、クライアントアプリケーションのクラスパスに配置またはパッケージ化します。ファイルのルールは、Java ServiceLoader Mechanism によって指示されます。このファイルには、EJB クライアントインターセプター実装の完全修飾クラス名ごとに個別の行が含まれることが予想されます。EJB クライアントインターセプタークラスはクラスパスで利用できる必要があります。ServiceLoader メカニズムを使用して追加された EJB クライアントインターセプターは、クラスパスで検出された順序で、クライアントインターセプターチェーンの最後に追加されます。ejb-security-interceptors クイックスタートはこのアプローチを使用します。
8.7. Clustered Enterprise JavaBeans リンクのコピーリンクがクリップボードにコピーされました!
8.7.1. Clustered Enterprise JavaBeans (EJB) について リンクのコピーリンクがクリップボードにコピーされました!
8.7.2. スタンドアロンおよびサーバー内クライアントの設定 リンクのコピーリンクがクリップボードにコピーされました!
jboss-ejb-client.properties、またはサーバー側のアプリケーションの jboss-ejb-client.xml ファイルを拡張してクラスター設定を組み込む必要があります。
サーバー 内にあります。つまり、別の EAP インスタンスを呼び出す EAP インスタンスは、サーバー内クライアントと見なされます。
例8.4 jboss-ejb-client.properties 設定のスタンドアロンクライアント
jboss-ejb-client.xml ファイルを設定し、クラスター設定を追加する必要があります。
例8.5 別の EAP6 インスタンスにデプロイされているクライアントアプリケーション (jboss-ejb-client.xml ファイルの設定)
8.7.3. EJB 呼び出しのカスタムロードバランシングポリシーの実装 リンクのコピーリンクがクリップボードにコピーされました!
AllClusterNodeSelector を実装することができます。AllClusterNodeSelector のノード選択の動作はデフォルトのセレクターと似ていますが、大規模なクラスター (ノード数 >20) の場合でも AllClusterNodeSelector は利用可能なすべてのクラスターノードを使用する点が異なります。接続されていないクラスターノードが返されると、そのクラスターノードは自動的に開きます。以下の例は、AllClusterNodeSelector 実装を示しています。
SimpleLoadFactorNodeSelector を実装することもできます。SimpleLoadFactorNodeSelector での負荷分散は、負荷係数に基づいて実行されます。負荷係数 (2/3/4) は、各ノードの負荷に関係なく、ノードの名前 (A/B/C) を基に計算されます。以下の例は、SimpleLoadFactorNodeSelector 実装を示しています。
jboss-ejb-client.properties を使用した設定
remote.cluster.ejb.clusternode.selector プロパティーを実装クラスの名前 (AllClusterNodeSelector または SimpleLoadfactorNodeSelector) とともに追加する必要があります。セレクターは、呼び出し時に利用可能な設定済みのサーバーをすべて表示します。次の例では、デプロイメントノードセレクターとして AllClusterNodeSelector を使用しています。
JBossejb-clientAPI の使用
プロパティー remote.cluster.ejb.clusternode.selector を PropertiesBasedEJBClientConfiguration コンストラクターの一覧に追加する必要があります。次の例では、デプロイメントノードセレクターとして AllClusterNodeSelector を使用しています。
jboss-ejb-client.xml を使用したサーバーアプリケーション側の設定
サーバー間の通信に負荷分散ポリシーを使用するには、クラスをアプリケーションとともにパッケージ化し、(META-INF フォルダーにある) jboss-ejb-client.xml で設定します。次の例では、デプロイメントノードセレクターとして AllClusterNodeSelector を使用しています。
ejb-security-realm-1 を追加する必要があります。以下の例は、セキュリティーレルムを追加する CLI コマンド (ejb-security-realm-1) を示しています。値は、ユーザー "test" の base64 でエンコードされたパスワードです。
core-service=management/security-realm=ejb-security-realm-1:add() core-service=management/security-realm=ejb-security-realm-1/server-identity=secret:add(value=cXVpY2sxMjMr)
core-service=management/security-realm=ejb-security-realm-1:add()
core-service=management/security-realm=ejb-security-realm-1/server-identity=secret:add(value=cXVpY2sxMjMr)
standalone.xml を使用して、サーバー名 (server name = "") を設定します。サーバー名が一意であることを確認します。ドメインモードでは、コントローラーは名前が一意であることを自動的に検証します。
8.7.4. EJB 呼び出しのトランザクション動作 リンクのコピーリンクがクリップボードにコピーされました!
サーバー間の呼び出し
分散 JBoss EAP アプリケーションのトランザクション属性は、アプリケーションが同じサーバー上で呼び出されているかのように処理する必要があります。トランザクションを中止するには、別のインターフェイスを使用して宛先メソッドに REQUIRES_NEW のマークを付ける必要があります。
クライアント側の呼び出し
JBoss EAP 6 スタンドアロンクライアントで EJB セッション Bean を呼び出すには、EJB プロキシーまたは UserTransaction が使用されている間、クライアントは InitialContext オブジェクトへの参照を持っている必要があります。また、EJB プロキシーまたは UserTransaction が使用されている間、InitialContext オブジェクトを開いたままにしておくことも重要です。接続の制御は、InitialContext によってプロパティーを使用して作成されたクラス内で行われます。
InitialContext オブジェクトへの参照を保持する EJB クライアント API を示しています。
例8.6 InitialContext オブジェクトを参照する EJB クライアント API
UserTransaction 参照の取得は、スコープ付き EJB クライアントコンテキストを使用するシナリオ、および リモートネーミング プロトコルを使用する呼び出しではサポートされていません。これは、これらのシナリオでは、InitialContext が独自の EJB クライアントコンテキストインスタンスをカプセル化するためです。これは、EJBClient クラスの静的メソッドを使用してアクセスすることはできません。いつEJBClient.getUserTransaction()が呼び出されると、デフォルトの (グローバル)EJB クライアントコンテキスト (初期化されていない可能性があります) からではなく、目的のコンテキストからトランザクションを返します。
クライアント側の UserTransaction リファレンス
次の例は、スタンドアロンクライアントで UserTransaction 参照を取得する方法を示しています。
例8.7 UserTransaction オブジェクトを参照するスタンドアロンクライアント
UserTransaction 参照を取得するには;次のシステムプロパティー -Djboss.node.name=yourServerName を使用してサーバーを起動し、クライアント側で次のように使用します。
tx=EJBClient.getUserTransaction("yourServerName");
tx=EJBClient.getUserTransaction("yourServerName");
UserTransaction を使用することはできません。
8.8. 参照 リンクのコピーリンクがクリップボードにコピーされました!
8.8.1. EJB JNDI 命名リファレンス リンクのコピーリンクがクリップボードにコピーされました!
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
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>- ビュークラス名は、リモートインターフェイスの完全修飾クラス名です。これには、インターフェースのパッケージ名が含まれます。
?stateful- The
?statefulJNDI 名がステートフルセッション Bean を参照する場合は、接尾辞が必要です。他の Bean タイプには含まれません。
8.8.2. EJB リファレンス解決 リンクのコピーリンクがクリップボードにコピーされました!
@EJBと@Resource。XML は常にアノテーションを上書きしますが、同じルールが適用されることに注意してください。
@EJB アノテーションのルール
- The
@EJB注釈にもmappedName()属性。仕様ではこれをベンダー固有のメタデータとして残していますが、JBoss はこれを認識しますmappedName()参照している EJB のグローバル JNDI 名として。mappedName()を指定した場合は、他のすべての属性は無視され、このグローバル JNDI 名がバインディングに使用されます。 - 指定した場合
@EJB属性が定義されていない場合:@EJB ProcessPayment myEjbref;
@EJB ProcessPayment myEjbref;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次に、以下のルールが適用されます。- 参照 Bean の EJB jar は、
@EJBインジェクションで使用されるインターフェースで EJB を検索します。同じビジネスインターフェースを公開する EJB が複数ある場合、例外が発生します。このインターフェースを持つ BIOSean が 1 つしかない場合は、その Bean が使用されます。 - EAR でインターフェースを公開する EJB を検索します。重複が生じると、例外が発生します。それ以外の場合は、一致する Bean を返します。
- JBoss ランタイムで、そのインターフェースの EJB をグローバルに検索します。同様に、複製が見つかると、例外が発生します。
@EJB.beanName()に対応<ejb-link>。の場合beanName()が定義されたら、と同じアルゴリズムを使用します@EJBを使用する以外に属性が定義されていないbeanName()検索のキーとして。この規則の例外は、ejb-link'#' 構文を使用する場合です。'#' 構文を使用すると、参照している EJB が配置されている EAR 内の jar への相対パスを設定できます。詳細は EJB 3.1 仕様を参照してください。
8.8.3. リモート EJB クライアントのプロジェクト依存関係 リンクのコピーリンクがクリップボードにコピーされました!
| グループ ID | アーティファクト ID |
|---|---|
| org.jboss.spec | jboss-javaee-6.0 |
| org.jboss.as | jboss-as-ejb-client-bom |
| org.jboss.spec.javax.transaction | jboss-transaction-api_1.1_spec |
| org.jboss.spec.javax.ejb | jboss-ejb-api_3.1_spec |
| org.jboss | jboss-ejb-client |
| org.jboss.xnio | xnio-api |
| org.jboss.xnio | xnio-nio |
| org.jboss.remoting3 | jboss-remoting |
| org.jboss.sasl | jboss-sasl |
| org.jboss.marshalling | jboss-marshalling-river |
jboss-javaee-6.0とjboss-as-ejb-client-bom、これらの依存関係をに追加する必要があります<dependencies>pom.xml ファイルのセクション。
jboss-javaee-6.0とjboss-as-ejb-client-bom依存関係をに追加する必要があります<dependencyManagement>スコープ がimport。
artifactIDのバージョンは変更される可能性があります。関連するバージョンについては、Maven リポジトリーを参照してください。
ejb-remote/client/pom.xml を参照してください。
8.8.4. jboss-ejb3.xml デプロイメント記述子の参照 リンクのコピーリンクがクリップボードにコピーされました!
jboss-ejb3.xml は、EJB JAR または WAR アーカイブで使用できるカスタムデプロイメント記述子です。EJB JAR アーカイブでは、META-INF/ ディレクトリーに存在する必要があります。WAR アーカイブでは、WEB-INF/ ディレクトリーに配置する必要があります。
ejb-jar.xmlと同様で、同じネームスペースの一部を使用して追加の名前空間を提供します。jboss-ejb3.xml のコンテンツは ejb-jar.xml の内容でマージされ、jboss-ejb3.xml の内容が優先されます。
jboss-ejb3.xml で使用される追加の非標準の名前空間のみについて説明します。参照するhttp://java.sun.com/xml/ns/javaee/標準の名前空間に関するドキュメント。
http://www.jboss.com/xml/ns/javaee です。
アセンブリー記述子の名前空間
<assembly-descriptor>エレメント。これらを使用して、設定を単一の Bean に適用することも、デプロイメント内のすべての Bean に適用することもできます。*としてejb-name。
- クラスターリング名前空間:
urn:clustering:1.0 xmlns:c="urn:clustering:1.0"
xmlns:c="urn:clustering:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、EJB をクラスター化済みとしてマークできます。これは、に相当するデプロイメント記述子です。@org.jboss.ejb3.annotation.Clustered。<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>
<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - セキュリティー名前空間 (
urn:security)。 xmlns:s="urn:security"
xmlns:s="urn:security"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、security-domainそしてそのrun-as-principalEJB の場合。<s:security> <ejb-name>*</ejb-name> <s:security-domain>myDomain</s:security-domain> <s:run-as-principal>myPrincipal</s:run-as-principal> </s:security>
<s:security> <ejb-name>*</ejb-name> <s:security-domain>myDomain</s:security-domain> <s:run-as-principal>myPrincipal</s:run-as-principal> </s:security>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - リソースアダプターの名前空間:
urn:resource-adapter-binding xmlns:r="urn:resource-adapter-binding"
xmlns:r="urn:resource-adapter-binding"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、メッセージ駆動 Bean のリソースアダプターを設定できます。<r:resource-adapter-binding> <ejb-name>*</ejb-name> <r:resource-adapter-name>myResourceAdapter</r:resource-adapter-name> </r:resource-adapter-binding>
<r:resource-adapter-binding> <ejb-name>*</ejb-name> <r:resource-adapter-name>myResourceAdapter</r:resource-adapter-name> </r:resource-adapter-binding>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - IIOP 名前空間:
urn:iiop xmlns:u="urn:iiop"
xmlns:u="urn:iiop"Copy to Clipboard Copied! Toggle word wrap Toggle overflow IIOP 名前空間は IIOP 設定が設定される場所です。- プールの名前空間:
urn:ejb-pool:1.0 xmlns:p="urn:ejb-pool:1.0"
xmlns:p="urn:ejb-pool:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、含まれるステートレスセッション Bean またはメッセージ駆動 Bean が使用するプールを選択できます。プールはサーバー設定で定義されます。<p:pool> <ejb-name>*</ejb-name> <p:bean-instance-pool-ref>my-pool</p:bean-instance-pool-ref> </p:pool>
<p:pool> <ejb-name>*</ejb-name> <p:bean-instance-pool-ref>my-pool</p:bean-instance-pool-ref> </p:pool>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - キャッシュ名前空間:
urn:ejb-cache:1.0 xmlns:c="urn:ejb-cache:1.0"
xmlns:c="urn:ejb-cache:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、含まれるステートフルセッション Bean によって使用されるキャッシュを選択できます。キャッシュはサーバー設定で定義されます。<c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache>
<c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例8.8 jboss-ejb3.xml ファイル
jboss-ejb3-spec-2_0.xsd には、スキーマバリデーションエラーが発生する可能性がある既知の問題があります。これらのエラーは無視して構いません。詳細は、https://bugzilla.redhat.com/show_bug.cgi?id=1192591 を参照してください。
第9章 JBossMBean サービス リンクのコピーリンクがクリップボードにコピーされました!
9.1. JBoss MBean Service の記述 リンクのコピーリンクがクリップボードにコピーされました!
create、start、stop、および destroy が実行可能である場合に MBean サービスに通知する複数のライフサイクル操作で構成されます。
- MBean で特定のメソッドを呼び出したい場合は、これらのメソッドを MBean インターフェースで宣言します。この方法では、MBean 実装で JBoss 固有クラスの依存関係を回避できます。
- JBoss 固有クラスの依存関係を気にしない場合は、MBean インターフェースで
ServiceMBeanインターフェースおよびServiceMBeanSupportクラスを拡張できます。ServiceMBeanSupportクラスは、次のようなサービスライフサイクルメソッドの実装を提供します。create、startとstop。次のような特定のイベントを処理するにはstart()イベント、オーバーライドする必要がありますstartService()ServiceMBeanSupport クラスによって提供されるメソッド。
9.2. 標準の MBean の例 リンクのコピーリンクがクリップボードにコピーされました!
.sar) で一緒にパッケージ化される 2 つの MBean サービスのサンプルを開発します。
ConfigServiceMBean インターフェイスは、次のような特定のメソッドを宣言します。start、getTimeoutとstopJBoss 固有のクラスを使用せずに、MBean を正しく 開始、保持、および 停止 するためのメソッド。ConfigService クラスは ConfigServiceMBean インターフェースを実装した後、このインターフェース内で使用されたメソッドを実装します。
PlainThread クラスは ServiceMBeanSupport クラスを拡張し、PlainThreadMBean インターフェイスを実装します。PlainThread はスレッドを開始し、ConfigServiceMBean.getTimeout()スレッドがスリープする時間を決定します。
例9.1 サンプル MBean サービス
jboss-service.xml 記述子は、イン ジェクト タグを使用して ConfigService クラスが PlainThread クラスにインジェクトされる方法を示します。inject タグは PlainThreadMBean と ConfigServiceMBean 間の依存関係を確立し、PlainThreadMBean が簡単に ConfigServiceMBean を使用できるようにします。
例9.2 JBoss-service.xml サービス記述子
jboss-service.xml 記述子をサービスアーカイブ (.sar) の META-INF/ フォルダーでパッケージ化できます。
9.3. JBoss MBean サービスのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
ServiceMBeanTest.sar) を ドメイン モードでビルドおよびデプロイするには、次のコマンドを使用します。
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar --all-server-groups
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar --all-server-groups
ServiceMBeanTest.sar) を スタンドアロン モードでビルドおよびデプロイするには、次のコマンドを使用します。
[standalone@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[standalone@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[standalone@localhost:9999 /] undeploy ServiceMBeanTest.sar
[standalone@localhost:9999 /] undeploy ServiceMBeanTest.sar
第10章 Web アプリケーションのクラスター化 リンクのコピーリンクがクリップボードにコピーされました!
10.1. セッションレプリケーション リンクのコピーリンクがクリップボードにコピーされました!
10.1.1. HTTP セッションレプリケーション リンクのコピーリンクがクリップボードにコピーされました!
10.1.2. Web セッションキャッシュについて リンクのコピーリンクがクリップボードにコピーされました!
standalone-ha.xml プロファイル、または管理対象ドメインプロファイル ha または full-ha を含む任意の HA プロファイルを使用するときに設定できます。最も一般的に設定される要素は、キャッシュモードと分散キャッシュのキャッシュ所有者の数です。所有者 パラメーターは、DISTモード。
キャッシュモード
キャッシュモードは次のいずれかになりますREPL(デフォルト) またはDIST。
- REPL
- The
REPLモードは、キャッシュ全体をクラスター内の他のすべてのノードに複製します。これは最も安全なオプションですが、より多くのオーバーヘッドが発生します。 - DIST
- The
DISTモードは、以前の実装で提供された バディモード に似ています。所有者パラメーターで指定されたノード数にキャッシュを分散することにより、オーバーヘッドを削減します。この所有者の数のデフォルトは2です。
所有者
所有者 パラメーターは、セッションの複製されたコピーを保持するクラスターノードの数を制御します。デフォルトは 2 です。
10.1.3. Web セッションキャッシュを設定する リンクのコピーリンクがクリップボードにコピーされました!
REPL。使用したい場合DISTモードの場合は、管理 CLI で次の 2 つのコマンドを実行します。別のプロファイルを使用する場合は、コマンドでプロファイル名を変更してください。スタンドアロンサーバーを使用する場合は、コマンドの /profile=ha 部分を削除してください。
手順10.1 Web セッションキャッシュを設定する
デフォルトのキャッシュモードをに変更します
DIST。/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)
/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 分散キャッシュの所有者の数を設定します。
以下のコマンドは所有者の数を5に設定します。デフォルトは2です。/profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)
/profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトのキャッシュモードをに戻します
REPL。/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)
/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスを再起動します。
Web キャッシュモードを変更した後、サーバーを再起動する必要があります。
結果
サーバーはセッションレプリケーション用に設定されています。独自のアプリケーションでセッションレプリケーションを使用するには、次のトピックを参照してください。「アプリケーションにおけるセッションレプリケーションの有効化」。
10.1.4. アプリケーションにおけるセッションレプリケーションの有効化 リンクのコピーリンクがクリップボードにコピーされました!
概要
JBoss EAP 6 高可用性 (HA) 機能を利用するには、アプリケーションを配布可能に設定する必要があります。この手順では、その方法を示し、次に、使用できるいくつかの高度な設定オプションについて説明します。
手順10.2 アプリケーションを配布可能にする
必須: アプリケーションが配布可能であることを示します。
アプリケーションが配布可能でないと、そのセッションは配布されません。アプリケーションのweb.xml記述子ファイルの<web-app>タグ内に<distributable/>要素を追加します。以下は例です。例10.1 配布可能なアプリケーションの最低限の設定
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必要に応じて、デフォルトのレプリケーション動作を変更します。
セッションレプリケーションに影響を与える値のいずれかを変更する場合は、アプリケーションのjboss-web.xmlファイルの<jboss-web>要素の子要素である<replication-config>要素内でそれらをオーバーライドできます。該当する要素で、デフォルト値をオーバーライドする場合のみ値を含めます。次の例は、すべてのデフォルト設定をリストし、その後に最も一般的に変更されるオプションを説明する表が続きます。例10.2 例:
<replication-config>の値Copy to Clipboard Copied! Toggle word wrap Toggle overflow
|
オプション
|
Description
|
|---|---|
<replication-trigger>
|
クラスター全体でセッションデータレプリケーションをトリガーする条件を制御します。このオプションが必要なのは、セッションから可変オブジェクト (セッション属性として格納されている) にアクセスした後、メソッドがない限り、コンテナーはオブジェクトが変更されて複製する必要があるかどうかを明確に知る方法がないためです。
setAttribute()直接呼び出されます。
設定に関係なく、を呼び出すことでいつでもセッションレプリケーションをトリガーできます
setAttribute()。
|
<replication-granularity>
|
複製されるデータの粒度を決定します。デフォルト値は
SESSION ですが、代わりにATTRIBUTE を設定すると、ほとんどの属性は変更されずにセッションのパフォーマンスを向上させることができます。
注記
JBoss EAP 6 では FIELD はサポートされていません。
|
|
オプション
|
Description
|
|---|---|
<use-jk>
|
次のようなロードバランサーを想定するかどうか
mod_cluster、mod_jk、またmod_proxy使用中です。デフォルトは false です。true に設定されている場合、コンテナーは各リクエストに関連付けられているセッション ID を調べ、jvmRouteフェイルオーバーがある場合は、セッション ID の一部。
|
<max-unreplicated-interval>
|
セッションが変更されていないと見なされた場合でも、セッションがアクセスされた後、セッションのタイムスタンプのレプリケーションをトリガーする前に待機する最大間隔 (秒単位)。これにより、クラスターノードが各セッションのタイムスタンプを認識し、フェイルオーバー中に複製されていないセッションが誤って期限切れになることがなくなります。また、メソッドの呼び出しに正しい値を信頼できることも保証します
HttpSession.getLastAccessedTime()フェイルオーバー中。
デフォルトでは、値は指定されていません。値が
0 の場合、セッションにアクセスするたびにタイムスタンプが複製されます。値が -1 の場合、要求中の他のアクティビティーがレプリケーションをトリガーした場合にのみ、タイムスタンプがレプリケートされます。より大きい正の値HttpSession.getMaxInactiveInterval()設定ミスとして扱われ、0 に変換されます。
|
<snapshot-mode>
|
セッションを他のノードに複製するタイミングを指定します。デフォルトは
INSTANT で、他の可能な値は INTERVAL です。
インスタント モードでは、変更はリクエスト処理スレッドを使用して、リクエストの最後に複製されます。<snapshot-interval> オプションは無視されます。
INTERVAL モードでは、バックグラウンドタスクは <snapshot-interval> で指定された間隔で実行され、変更されたセッションを複製します。
|
<snapshot-interval>
| <snapshot-mode> の値に INTERVAL を使用するときに、変更されたセッションが複製される間隔 (ミリ秒単位)。
|
<session-notification-policy>
|
インターフェイスの実装の完全修飾クラス名
ClusteredSessionNotificationPolicyこれは、サーブレット仕様通知が登録済みに発行されるかどうかを管理しますHttpSessionListener、HttpSessionAttributeListener、またHttpSessionBindingListener。
|
10.2. HttpSession のパッシベーションとアクティベーション リンクのコピーリンクがクリップボードにコピーされました!
10.2.1. HTTP セッションパッシベーションおよびアクティベーション リンクのコピーリンクがクリップボードにコピーされました!
- コンテナーが新規セッションの作成を要求するときに現在アクティブなセッションの数が設定上限を超えている場合、サーバーはセッションの一部をパッシベートして新規セッションのスペースを作成しようとします。
- 定期的に、設定された間隔で、バックグラウンドタスクがセッションを非アクティブ化する必要があるかどうかを確認します。
- Web アプリケーションがデプロイされ、他のサーバーでアクティブなセッションのバックアップコピーが、新たにデプロイされる Web アプリケーションのセッションマネージャーによって取得された場合、セッションはパッシベートされることがあります。
- セッションは、設定可能な最大アイドル時間より長く使用されていません。
- アクティブなセッションの数が設定可能な最大値を超えており、セッションが設定可能な最小アイドル時間より長く使用されていません。
10.2.2. アプリケーションで HttpSession パッシベーションを設定する リンクのコピーリンクがクリップボードにコピーされました!
概要
HttpSession パッシベーションは、アプリケーションの WEB-INF/jboss-web.xml または META-INF/jboss-web.xml ファイルで設定されます。
例10.3 jboss-web.xml ファイル
パッシベーション設定要素
<max-active-sessions>- 許可されるアクティブなセッションの最大数。セッションマネージャーによって管理されるセッションの数がこの値を超え、パッシベーションが有効になっている場合、設定された
<passivation-min-idle-time> に基づいて超過分がパッシベーションされます。その後、アクティブなセッションの数がまだこの制限を超えている場合、新しいセッションを作成する試みは失敗します。デフォルト値の-1は、アクティブなセッションの最大数に制限を設定しません。 <passivation-config>- この要素は、子要素として残りのパッシベーション設定パラメーターを保持します。
<passivation-config> 子要素
<use-session-passivation>- セッションパッシベーションを使用するかどうか。デフォルト値は
falseです。 <passivation-min-idle-time>- max-active-sessions で定義された値に準拠するようにアクティブなセッション数を減らすために、コンテナーがセッションの非アクティブ化を検討する前に、セッションが非アクティブでなければならない最小時間 (秒単位)。デフォルト値の
-1は、<passivation-max-idle-time>が経過する前に不動態化セッションを無効にします。<max-active-sessions>が設定されている場合は、-1 の値も高い値もお勧めしません。 <passivation-max-idle-time>- コンテナーがメモリーを節約するためにセッションを非アクティブ化しようとする前に、セッションが非アクティブになることができる最大時間 (秒単位)。このようなセッションのパッシベーションは、アクティブなセッション数が
<max-active-sessions>を超えているかどうかに関係なく行われます。この値は、web.xmlの<session-timeout>設定よりも小さくする必要があります。デフォルト値の-1は、最大非アクティブに基づくパッシベーションを無効にします。
REPL とDISTレプリケーションモード<max-active-sessions> を設定してください。他のノードから複製されるセッションの数は、REPLまたDISTキャッシュモードが有効になっています。REPL キャッシュモードでは、各セッションは各ノードにレプリケートされます。のDISTキャッシュモードの場合、各セッションは、で指定された数のノードにのみ複製されます。ownersパラメーター。見る「Web セッションキャッシュについて」と「Web セッションキャッシュを設定する」セッションキャッシュモードの設定についての情報。
REPL キャッシュモードでは、各ノードのメモリーに 800 のセッションが格納されます。とDISTキャッシュモードが有効で、デフォルトowners2 に設定すると、各ノードは 200 セッションをメモリーに保存します。
10.3. HA シングルトンを実装する リンクのコピーリンクがクリップボードにコピーされました!
概要
次の手順は、SingletonService デコレータでラップされ、クラスター全体のシングルトンサービスとして使用されるサービスをデプロイする方法を示しています。このサービスは、クラスター内で 1 回だけ開始されるスケジュールされたタイマーをアクティブにします。
手順10.3 HA シングルトンサービスを実装する
- HA シングルトンサービスアプリケーションを作成します。以下は、シングルトンサービスとしてデプロイされる
SingletonServiceデコレータでラップされたサービスの簡単な例です。完全な例は、Red Hat JBoss Enterprise Application Platform に同梱されているcluster-ha-singletonクイックスタートにあります。このクイックスタートには、アプリケーションをビルドおよびデプロイするためのすべての手順が含まれています。- サービスを作成します。次のリストは、サービスの例です。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - クラスター化されたシングルトンとして
サービスをインストールするアクティベーターを作成します。次のリストは、HATimerServiceをクラスター化されたシングルトンサービスとしてインストールするサービスアクティベーターの例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記上記のコード例では、クラスを使用しています。org.jboss.as.clustering.singleton.SingletonService、これは JBoss EAP プライベート API の一部です。パブリック API は JBoss EAP リリースで利用可能になり、プライベートクラスは非推奨になりますが、これらのクラスは維持され、JBoss EAP リリースサイクルの間利用可能になります。 - ServiceActivator ファイルを作成するアプリケーションの
resources/META-INF/services/ディレクトリーにorg.jboss.msc.service.ServiceActivatorという名前のファイルを作成します。前の手順で作成した ServiceActivator クラスの完全修飾名を含む行を追加します。org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.HATimerServiceActivator
org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.HATimerServiceActivatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow - クラスター全体のシングルトンタイマーとして使用されるタイマーを実装するシングルトン Bean を作成します。このシングルトン Bean にはリモートインターフェイスがなく、アプリケーション内の別の EJB からローカルインターフェイスを参照してはなりません。これにより、クライアントまたは他のコンポーネントによるルックアップが防止され、SingletonService がシングルトンを完全に制御できるようになります。
- スケジューラーインターフェイスを作成する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - クラスター全体のシングルトンタイマーを実装するシングルトン Bean を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- クラスターリングを有効にして各 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
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSETCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例10.4 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
$ 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=100Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSETCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例10.5 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
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=100Copy to Clipboard Copied! Toggle word wrap Toggle overflow
注記コマンドライン引数を使用したくない場合は、サーバーインスタンスごとにstandalone-ha.xmlファイルを設定して、個別のインターフェイスにバインドできます。 - アプリケーションをサーバーにデプロイします次の Maven コマンドは、デフォルトのポートで実行されているスタンドアロンサーバーにアプリケーションをデプロイします。
mvn clean install jboss-as:deploy
mvn clean install jboss-as:deployCopy to Clipboard Copied! Toggle word wrap Toggle overflow 追加のサーバーにデプロイするには、サーバー名を渡します。別のホストにある場合は、コマンドラインでホスト名とポート番号を渡します。mvn clean package jboss-as:deploy -Djboss-as.hostname=localhost -Djboss-as.port=10099
mvn clean package jboss-as:deploy -Djboss-as.hostname=localhost -Djboss-as.port=10099Copy to Clipboard Copied! Toggle word wrap Toggle overflow Maven の設定とデプロイの詳細については、JBoss EAP 6 に同梱されているcluster-ha-singletonクイックスタートを参照してください。
10.4. Apache mod_cluster-manager アプリケーション リンクのコピーリンクがクリップボードにコピーされました!
10.4.1. mod_cluster-manager アプリケーション リンクのコピーリンクがクリップボードにコピーされました!
10.4.2. mod_cluster-manager アプリケーションの使用 リンクのコピーリンクがクリップボードにコピーされました!
図10.1 mod_cluster 管理 Web ページ
- 1 mod_cluster/1.2.8.Final: これは mod_cluster ネイティブライブラリーのバージョンを示します
- 2 ajp://192.168.122.204:8099: これは、使用されるプロトコル (AJP、HTTP、HTTPS のいずれか)、ワーカーノードおよびポートのホスト名または IP アドレスを示します。
- 3 jboss-eap-6.3-2: これはワーカーノードの JVMRoute を示します。
- 4 仮想ホスト 1: これはワーカーノードで設定された仮想ホストを示します
- : これは、特定のコンテキストでの新しいセッションの作成を無効にするために使用できる管理オプションです。ただし、現在のセッションは無効にされず、そのまま処理されます。
- : これは、コンテキストへのセッション要求のルーティングを停止するために使用できる管理オプションです。プロパティー
sticky-session-forceが true に設定されていない限り、残りのセッションは別のノードにフェイルオーバーします - : これらは、ノード全体で実行できる操作を示します。これらのいずれかのオプションを選択すると、すべての仮想ホストのノードのコンテキストすべてが影響を受けます。
- Load balancing group (LBGroup): すべてのワーカーノードをカスタム負荷分散グループにグループ化するために、
load-balancing-groupプロパティーは EAP 設定の modcluster サブシステムで設定されます。負荷分散グループ (LBGroup) は、設定されたすべての負荷分散グループに関する情報を提供する情報フィールドです。このフィールドが設定されていないと、すべてのワーカーノードは単一のデフォルト負荷分散グループにグループ化されます。備考これは唯一の情報フィールドであるため、load-balancing-groupプロパティーの設定に使用できません。プロパティーは、EAP 設定の mod_cluster サブシステムで設定する必要があります。 - 9 負荷 (値): これは、ワーカーノードの負荷率を示します。負荷率は次のように評価されます。
-load > 0 : A load factor with value 1 indicates that the worker node is overloaded. A load factor of 100 denotes a free and not-loaded node. -load = 0 :A load factor of value 0 indicates that the worker node is in a standby mode. This means that no session requests will be routed to this node until and unless the other worker nodes are unavailable -load = -1 : A load factor of value -1 indicates that the worker node is in an error state. -load = -2 : A load factor of value -2 indicates that the worker node is undergoing CPing/CPong and is in a transition state
-load > 0 : A load factor with value 1 indicates that the worker node is overloaded. A load factor of 100 denotes a free and not-loaded node. -load = 0 :A load factor of value 0 indicates that the worker node is in a standby mode. This means that no session requests will be routed to this node until and unless the other worker nodes are unavailable -load = -1 : A load factor of value -1 indicates that the worker node is in an error state. -load = -2 : A load factor of value -2 indicates that the worker node is undergoing CPing/CPong and is in a transition stateCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第11章 CDI リンクのコピーリンクがクリップボードにコピーされました!
11.1. CDI の概要 リンクのコピーリンクがクリップボードにコピーされました!
11.1.1. CDI の概要 リンクのコピーリンクがクリップボードにコピーされました!
11.1.2. コンテキストと依存関係の注入 (CDI) リンクのコピーリンクがクリップボードにコピーされました!
11.1.3. CDI の利点 リンクのコピーリンクがクリップボードにコピーされました!
- コードの大きなチャンクを注釈に置き換えることで、コードベースを簡素化および縮小します。
- 柔軟であり、インジェクションおよびイベントを無効または有効にしたり、代替の Bean を使用したり、非 CDI オブジェクトを簡単にインジェクトしたりできます。
- CDI で古いコードを使用するのは簡単です。
META-INF/またはWEB-INF/ディレクトリーにbeans.xmlを含めるだけで済みます。ファイルは空にすることができます。 - パッケージ化とデプロイメントを簡素化し、デプロイメントに追加する必要のある XML の量を削減します。
- コンテキストを介したライフサイクル管理を提供します。インジェクションを要求、セッション、会話、またはカスタムコンテキストに割り当てることができます。
- また、文字列ベースのインジェクションよりも安全かつ簡単にデバッグを行える、タイプセーフな依存関係の注入が提供されます。
- インターセプターを Bean から切り離します。
- 複雑なイベント通知を提供します。
11.1.4. タイプセーフな依存性注入について リンクのコピーリンクがクリップボードにコピーされました!
11.1.5. Weld、Seam 2、および JavaServer Faces 間の関係 リンクのコピーリンクがクリップボードにコピーされました!
11.2. CDI を使用する リンクのコピーリンクがクリップボードにコピーされました!
11.2.1. 最初の手順 リンクのコピーリンクがクリップボードにコピーされました!
11.2.1.1. CDI を有効にする リンクのコピーリンクがクリップボードにコピーされました!
概要
Contexts and Dependency Injection (CDI) は、JBoss EAP 6 のコアテクノロジーの 1 つであり、デフォルトで有効になっています。何らかの理由で無効になっていて、有効にする必要がある場合は、次の手順に従ってください。
手順11.1 JBoss EAP 6 で CDI を有効にする
CDI サブシステムの詳細が設定ファイルからコメント化されているかどうかを確認してください。
サブシステムを無効にするには、domain.xmlまたはstandalone.xml設定ファイルの関連セクションをコメントアウトするか、関連セクションを完全に削除します。EAP_HOME/domain/configuration/domain.xml またはEAP_HOME/standalone/configuration/standalone.xmlで CDI サブシステムを見つけるには、次の文字列を検索します。存在する場合は、<extensions> セクション内にあります。<extension module="org.jboss.as.weld"/>
<extension module="org.jboss.as.weld"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用しているプロファイルには、次の行も含まれている必要があります。プロファイルは、<profiles> セクション内の個々の <profile> 要素にあります。<subsystem xmlns="urn:jboss:domain:weld:1.0"/>
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルを編集する前に、JBoss EAP 6 を停止します。
JBoss EAP 6 は実行中に設定ファイルを変更するため、設定ファイルを直接編集する前にサーバーを停止する必要があります。設定ファイルを編集して、CDI サブシステムを復元します。
CDI サブシステムがコメント化されている場合は、コメントを削除します。完全に削除された場合は、ファイルの </extensions> タグのすぐ上にある新しい行に次の行を追加して復元します。<extension module="org.jboss.as.weld"/>
<extension module="org.jboss.as.weld"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - また、<profiles> セクションの関連するプロファイルに次の行を追加する必要があります。
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow JBoss EAP 6 を再起動します。
更新した設定で JBoss EAP 6 を起動します。
結果
JBoss EAP 6 は、CDI サブシステムを有効にして起動します。
11.2.2. CDI を使用したアプリケーションの開発 リンクのコピーリンクがクリップボードにコピーされました!
11.2.2.1. CDI を使用したアプリケーションの開発 リンクのコピーリンクがクリップボードにコピーされました!
はじめに
コンテキストと依存関係の注入 (CDI: Contexts and Dependency Injection) を使用すると、アプリケーションの開発、コードの再利用、デプロイメント時または実行時のコードの調整、およびユニットテストを非常に柔軟に行うことができます。JBoss EAP 6 には、CDI の参照実装である Weld が含まれます。これらのタスクは、エンタープライズアプリケーションで CDI を使用する方法を示しています。
11.2.2.2. 既存のコードで CDI を使用する リンクのコピーリンクがクリップボードにコピーされました!
META-INF/ または WEB-INF/ ディレクトリーに beans.xml というファイルを作成することだけです。ファイルは空にすることができます。
手順11.2 CDI アプリケーションでレガシー Bean を使用する
Bean をアーカイブにパッケージ化します。
Bean を JAR または WAR アーカイブにパッケージ化します。アーカイブに
beans.xmlファイルを含めます。Beans.xmlファイルを JAR アーカイブのMETA-INF/または WAR アーカイブのWEB-INF/ディレクトリーに配置します。ファイルは空にすることができます。
結果:
これらの Bean は CDI で使用できます。コンテナーは、Bean のインスタンスを作成および破棄し、それらを指定されたコンテキストに関連付け、他の Bean に注入し、EL 式で使用し、修飾子アノテーションで特殊化し、既存の Bean に変更を加えることなく、インターセプターとデコレーターを追加できます。コード。状況によっては、注釈を追加する必要がある場合があります。
11.2.2.3. スキャンプロセスからの Bean の除外 リンクのコピーリンクがクリップボードにコピーされました!
概要
Weld の機能の 1 つである CDI の JBoss EAP 6 実装は、アーカイブ内のクラスをスキャンから除外し、コンテナーライフサイクルイベントを発生させ、Bean としてデプロイする機能です。これは JSR-299 仕様の一部ではありません。
例11.1 Bean からパッケージを除外します
- 最初のものはすべての Swing クラスを除外します。
- 2 つ目は、Google Web Toolkit がインストールされていない場合、GoogleWebToolkit クラスを除外します。
- 3 番目は、システムプロパティーの場合、文字列
Blether(正規表現を使用) で終わるクラスを除外します verbosity低に設定されます。 - 4 つ目は、Wicket クラスが存在し、 viewlayerシステムプロパティーが設定されていません。
11.2.2.4. インジェクションを使用した実装の拡張 リンクのコピーリンクがクリップボードにコピーされました!
概要
インジェクションを使用して、既存のコードの機能を追加または変更できます。この例は、既存のクラスに翻訳機能を追加する方法を示しています。翻訳は架空の機能であり、例で実装される方法は擬似コードであり、説明のためにのみ提供されています。
buildPhrase。buildPhrase メソッドは、都市の名前を引数として取得し、「Welcome to Boston!」などのフレーズを出力します。 あなたの目標は、のバージョンを作成することですWelcome挨拶を別の言語に翻訳できるクラス。
例11.2 注入するTranslatorBean Into theWelcomeクラス
TranslatorオブジェクトにWelcomeクラス。TheTranslatorオブジェクトは、EJB ステートレス Bean または別のタイプの Bean であり、文をある言語から別の言語に翻訳できます。この場合、Translator元の挨拶を実際に変更せずに、挨拶全体を翻訳するために使用されますWelcomeまったくクラス。TheTranslatorの前に注入されますbuildPhraseメソッドが実装されます。
11.2.3. あいまいな依存関係または満たされていない依存関係 リンクのコピーリンクがクリップボードにコピーされました!
11.2.3.1. あいまいな依存関係または満たされていない依存関係について リンクのコピーリンクがクリップボードにコピーされました!
- インジェクションポイントの Bean 型を実装する全 Bean にある修飾子アノテーションを解決します。
- 無効となっている Bean をフィルタリングします。無効な Bean とは、明示的に有効化されていない @Alternative Bean のことです。
11.2.3.2. 予選について リンクのコピーリンクがクリップボードにコピーされました!
例11.3 を定義する@Synchronousと@Asynchronous修飾子
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Synchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Synchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}
例11.4 使用@Synchronousと@Asynchronous修飾子
11.2.3.3. 修飾子を使用したあいまいなインジェクションの解決 リンクのコピーリンクがクリップボードにコピーされました!
概要
このタスクは、あいまいなインジェクションを示し、修飾子を使用してあいまいさを取り除きます。あいまいな注入について詳しくは、「あいまいな依存関係または満たされていない依存関係について」。
例11.5 あいまいな注入
Welcome の 2 つの実装があります。1 つは変換し、もう 1 つは変換しません。そのような状況では、以下のインジェクションはあいまいであり、翻訳する Welcome を使用するように指定する必要があります。
手順11.3 修飾子を使用したあいまいなインジェクションの解決
@Translatingという修飾子アノテーションを作成します。@Qualifier @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETERS}) public @interface Translating{}@Qualifier @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETERS}) public @interface Translating{}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 翻訳を行う
Welcomeに@Translatingアノテーションを付けます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow インジェクションで翻訳を行う
Welcomeを要求します。ファクトリーメソッドパターンの場合と同様に、修飾された実装を明示的に要求する必要があります。あいまいさはインジェクションポイントで解決されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
翻訳ウェルカム が使用され、あいまいさはありません。
11.2.4. 管理 Bean リンクのコピーリンクがクリップボードにコピーされました!
11.2.4.1. マネージド Bean について リンクのコピーリンクがクリップボードにコピーされました!
Bean を定義するものについて独自のアイデアを導入しました。
@Inject アノテーションが指定されたコンストラクター) を持つ具象 Java クラスは bean になります。これには、すべての Java Bean と EJB セッション bean が含まれます。上記のサービスを Bean で有効にするための唯一の要件は、それらが特別なマーカーファイル META-INF/beans.xml を含むアーカイブ (JAR、または WAR や EJB JAR などの JavaEE モジュール) に存在することです。
11.2.4.2. Bean であるクラスのタイプ リンクのコピーリンクがクリップボードにコピーされました!
@ManagedBean アノテーションを付けることで明示的に管理対象 bean を宣言できますが、CDI ではその必要はありません。この仕様によると、CDI コンテナーでは、以下の条件を満たすクラスはすべて管理対象 bean として扱われます。
- 非静的な内部クラスではないこと。
- これは具象クラスであるか、
@Decoratorアノテーションが付けられています。 - EJB コンポーネントを定義するアノテーションが付与されていないこと、あるいは
ejb-jar.xmlで EJB bean クラスとして宣言されていること。 - インターフェイスを実装していません
javax.enterprise.inject.spi.Extension. - パラメーターのないコンストラクターか、
@Injectアノテーションが付与されたコンストラクターがあること。
11.2.4.3. CDI を用いたオブジェクトの Bean へのインジェクト リンクのコピーリンクがクリップボードにコピーされました!
META-INF/beans.xml または WEB-INF/Beans.xml ファイルが含まれている場合、デプロイメント内の各オブジェクトは CDI を使用して注入できます。
@Injectアノテーションを使用して、Bean の任意の部分にオブジェクトを注入します。クラスのインスタンスを取得するには、bean 内でフィールドに@Injectアノテーションを付けます。例11.6
TextTranslatorインスタンスをTranslateControllerに挿入しますpublic class TranslateController { @Inject TextTranslator textTranslator; ...public class TranslateController { @Inject TextTranslator textTranslator; ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注入されたオブジェクトのメソッドを使用する
注入されたオブジェクトのメソッドを直接使用できます。TextTranslatorにメソッドがあると仮定しますtranslate。例11.7 注入されたオブジェクトのメソッドを使用する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Bean のコンストラクターでインジェクションを使用します。
ファクトリーやサービスロケーターを使用して作成する代わりに、Bean のコンストラクターへオブジェクトをインジェクトできます。例11.8 Bean のコンストラクターでインジェクションを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Instance(<T>)インターフェースを使用してインスタンスをプログラムにより取得します。Bean 型でパラメーター化されると、Instanceインターフェースは TextTranslator のインスタンスを返すことができます。例11.9 プログラムでインスタンスを取得する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果:
オブジェクトを Bean にインジェクトすると、Bean は全オブジェクトのメソッドとプロパティーを使用できるようになります。Bean のコンストラクターにインジェクトするときに、インジェクションがすでに存在するインスタンスを参照する場合以外は、Bean のコンストラクターが呼び出されるとインジェクトされたオブジェクトのインスタンスが作成されます。たとえば、セッションの存続期間内にセッションスコープの Bean をインジェクトしても、新しいインスタンスは作成されません。
11.2.5. コンテキスト、スコープ、および依存関係 リンクのコピーリンクがクリップボードにコピーされました!
11.2.5.1. コンテキストおよびスコープ リンクのコピーリンクがクリップボードにコピーされました!
@RequestScoped、@SessionScoped、および @ConversationScope です。
11.2.5.2. 利用可能なコンテキスト リンクのコピーリンクがクリップボードにコピーされました!
| コンテキスト | Description |
|---|---|
| @Dependent | Bean は、参照を保持する Bean のライフサイクルにバインドされます。 |
| @ApplicationScoped | アプリケーションのライフサイクルにバインドされます。 |
| @RequestScoped | リクエストのライフサイクルにバインドされます。 |
| @SessionScoped | セッションのライフサイクルにバインドされます。 |
| @ConversationScoped | 会話のライフサイクルにバインドされます。会話スコープは、リクエストの長さとセッションの間であり、アプリケーションによって制御されます。 |
| カスタムスコープ | 上記のコンテキストで対応できない場合は、カスタムスコープを定義できます。 |
11.2.6. Bean ライフサイクル リンクのコピーリンクがクリップボードにコピーされました!
11.2.6.1. Bean のライフサイクルを管理する リンクのコピーリンクがクリップボードにコピーされました!
概要
このタスクは、リクエストの残存期間の間 Bean を保存する方法を示しています。他の複数のスコープが存在し、独自のスコープを定義できます。
@Dependent です。つまり、bean のライフサイクルは、参照を保持する bean のライフサイクルに依存します。詳細は、「コンテキストおよびスコープ」 を参照してください。
手順11.4 Bean ライフサイクルの管理
目的のスコープに対応するスコープで Bean にアノテーションを付けます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Bean が JSF ビューで使用されると、Bean は状態を保持します。
<h:form> <h:inputText value="#{greeter.city}"/> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form><h:form> <h:inputText value="#{greeter.city}"/> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果:
Bean は、指定するスコープに関連するコンテキストに保存され、スコープが適用される限り存続します。
11.2.6.2. プロデューサーメソッドの使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
このタスクでは、プロデューサーメソッドを使用して、インジェクション用の Bean ではないさまざまなオブジェクトを生成する方法を示します。
例11.10 デプロイ後のポリモーフィズムを可能にするために、代替の代わりにプロデューサーメソッドを使用します
@Preferredこの例のアノテーションは修飾子アノテーションです。修飾子の詳細については、以下を参照してください。「予選について」。
@Inject @Preferred PaymentStrategy paymentStrategy;
@Inject @Preferred PaymentStrategy paymentStrategy;
例11.11 プロデューサーメソッドにスコープを割り当てます
@Dependent。スコープを Bean に割り当てた場合、スコープは適切なコンテキストにバインドされます。この例のプロデューサーメソッドは、1 つのセッションあたり一度だけ呼び出されます。
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
...
}
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
...
}
例11.12 プロデューサーメソッド内でインジェクションを使用する
結果
プロデューサーメソッドを使用して、Bean ではないオブジェクトをインジェクトし、コードを動的に変更できます。
11.2.7. 名前付き Bean と代替 Bean リンクのコピーリンクがクリップボードにコピーされました!
11.2.7.1. 名前付き Bean について リンクのコピーリンクがクリップボードにコピーされました!
@Named アノテーションを使用して名前が付けられます。Bean に名前を付けると、Java Server Faces (JSF) で直接使用できます。
@Named アノテーションは、bean 名である任意のパラメーターを取ります。このパラメーターを省略すると、小文字の Bean 名が名前として使用されます。
11.2.7.2. 名前付き Bean の使用 リンクのコピーリンクがクリップボードにコピーされました!
@Namedアノテーションを使用して名前を Bean に割り当てます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Bean 名自体はオプションです。省略した場合、Bean はクラス名にちなんで名付けられ、最初の文字は大文字になりません。上記の例では、デフォルト名はgreeterBeanになります。JSF ビューで名前付き Bean を使用します。
<h:form> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form><h:form> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果:
名前付き Bean は、最小限のコーディングで、JSF ビューのコントロールにアクションとして割り当てられます。
11.2.7.3. 代替 Bean について リンクのコピーリンクがクリップボードにコピーされました!
例11.13 代替案の定義
beans.xml ファイルを編集することにより、特定の Bean アーカイブに対して有効になります。
11.2.7.4. 代替を用いたインジェクションのオーバーライド リンクのコピーリンクがクリップボードにコピーされました!
概要
代替 Bean を使用すると、既存の Bean をオーバーライドできます。これらは、同じ役割を満たすクラスをプラグインする方法として考慮できますが、動作が異なります。代替の Bean はデフォルトで無効になります。このタスクは、代替を指定し、有効にする方法を示しています。
手順11.5 インジェクションのオーバーライド
TranslatingWelcome クラスがすでにあることを前提としています。ただし、これを "mock" TranslatingWelcome クラスでオーバーライドするとします。これは、実際の Translator Bean を使用できないテストデプロイメントのケースに該当します。
代替を定義します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 代替案を代用してください。
置換実装をアクティベートするために、完全修飾クラス名をMETA-INF/beans.xmlまたはWEB-INF/beans.xmlファイルに追加します。<beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans><beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
元の実装の代わりに代替実装が使用されます。
11.2.8. ステレオタイプ リンクのコピーリンクがクリップボードにコピーされました!
11.2.8.1. ステレオタイプについて リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトのスコープ。
- インターセプターバインディングのセット。
- ステレオタイプを持つすべての Bean には、デフォルトの BeanEL 名があります
- ステレオタイプを持つすべての Bean は代替です
@Named アノテーションを持つ場合、配置された bean はデフォルトの bean 名を持ちます。この bean は、@Named アノテーションが bean で直接指定された場合に、この名前をオーバーライドできます。名前付き Bean の詳細については、を参照してください。「名前付き Bean について」。
11.2.8.2. ステレオタイプの使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
ステレオタイプを使用しないと、アノテーションが煩雑になる可能性があります。このタスクは、ステレオタイプを使用して煩雑さを軽減し、コードを効率化する方法を示しています。ステレオタイプとは何かについての詳細は、を参照してください。「ステレオタイプについて」。
例11.14 注釈が乱雑
手順11.6 ステレオタイプの定義および使用
ステレオタイプを定義します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ステレオタイプを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果:
ステレオタイプは、コードを合理化および簡素化します。
11.2.9. オブザーバーメソッド リンクのコピーリンクがクリップボードにコピーされました!
11.2.9.1. オブザーバーメソッドについて リンクのコピーリンクがクリップボードにコピーされました!
11.2.9.2. トランザクションオブザーバー リンクのコピーリンクがクリップボードにコピーされました!
public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdateEvent event) { ... }
public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdateEvent event) { ... }
- IN_PROGRESS: デフォルトではオブザーバーは即座に呼び出されます。
- AFTER_SUCCESS: トランザクションが正常に完了する場合のみ、オブザーバーはトランザクションの完了フェーズの後に呼び出されます。
- AFTER_FAILURE: トランザクションの完了に失敗する場合のみ、オブザーバーはトランザクションの完了フェーズの後に呼び出されます。
- AFTER_COMPLETION: オブザーバーはトランザクションの完了フェーズの後に呼び出されます。
- BEFORE_COMPLETION: オブザーバーはトランザクションの完了フェーズの前に呼び出されます。
11.2.9.3. イベントの発生と確認 リンクのコピーリンクがクリップボードにコピーされました!
例11.15 イベントを開始する
例11.16 修飾子を使用してイベントを発生させる
例11.17 イベントを観察する
@Observes アノテーションを使用します。
例11.18 資格のあるイベントを観察する
11.2.10. インターセプター リンクのコピーリンクがクリップボードにコピーされました!
11.2.10.1. インターセプターについて リンクのコピーリンクがクリップボードにコピーされました!
インターセプションポイント
- ビジネスメソッドの傍受
- ビジネスメソッドインターセプターは、Bean のクライアントによる Bean のメソッドの呼び出しに適用されます。
- ライフサイクルコールバックインターセプト
- ライフサイクルコールバックインターセプターは、コンテナーによるライフサイクルコールバックの呼び出しに適用されます。
- タイムアウトメソッドのインターセプト
- タイムアウトメソッドインターセプターは、コンテナーによる EJB タイムアウトメソッドの呼び出しに適用されます。
11.2.10.2. CDI とのインターセプターの使用 リンクのコピーリンクがクリップボードにコピーされました!
例11.19 CDI のないインターセプター
- Bean は、インターセプター実装を直接指定する必要があります。
- アプリケーションの各 Bean は、インターセプターの完全なセットを適切な順序で指定する必要があります。この場合、アプリケーション全体でインターセプターを追加または削除するには時間がかかり、エラーが発生する傾向があります。
手順11.7 CDI とのインターセプターの使用
インターセプターバインディングタイプを定義します。
@InterceptorBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Secure {}@InterceptorBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Secure {}Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプター実装をマーク付けします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ビジネスコードでインターセプターを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow META-INF/beans.xmlまたはWEB-INF/beans.xmlファイルに追加して、デプロイメントでインターセプターを有効にします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプターは、リストされた順序で適用されます。
結果:
CDI は、インターセプターコードを簡素化し、ビジネスコードへの適用を容易にします。
11.2.11. デコレータについて リンクのコピーリンクがクリップボードにコピーされました!
@Decorator。CDI アプリケーションでデコレーターを呼び出すには、beans.xml ファイルで指定する必要があります。
例11.20 デコレータの例
@Delegate インジェクションポイントが 1 つ必要になります。
11.2.12. ポータブル拡張機能について リンクのコピーリンクがクリップボードにコピーされました!
- ビジネスプロセス管理エンジンとの統合。
- Spring、Seam、GWT、Wicket などのサードパーティーフレームワークとの統合。
- CDI プログラミングモデルに基づく新しいテクノロジー。
- 独自の Bean、インターセプター、およびデコレーターをコンテナーに提供します。
- 依存関係注入サービスを使用した独自のオブジェクトへの依存関係のインジェクション。
- カスタムスコープのコンテキスト実装を提供します。
- アノテーションベースのメタデータを別のソースからのメタデータで拡大またはオーバーライドします。
11.2.13. Bean プロキシー リンクのコピーリンクがクリップボードにコピーされました!
11.2.13.1. Bean プロキシーについて リンクのコピーリンクがクリップボードにコピーされました!
コンテナーでプロキシーできない Java タイプ
- パラメーターのない非プライベートコンストラクターを持たないクラス
- 宣言されたクラス
finalまたは持っているfinal方法 - アレイおよびプリミティブ型。
11.2.13.2. インジェクションでのプロキシーの使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
各 bean のライフサイクルが異なる場合に、インジェクションにプロキシーが使用されます。プロキシーは起動時に作成されたbean のサブクラスで、bean クラスのプライベートメソッド以外のメソッドをすべて上書きします。プロキシーは実際の bean インスタンスへ呼び出しを転送します。
PaymentProcessorインスタンスは直接注入されませんShop。代わりに、プロキシーが注入され、processPayment()メソッドが呼び出されると、プロキシーは現在のPaymentProcessorBean インスタンスを呼び出し、processPayment()その上でメソッド。
例11.21 プロキシーインジェクション
第12章 Java Transaction API (JTA) リンクのコピーリンクがクリップボードにコピーされました!
12.1. 概要 リンクのコピーリンクがクリップボードにコピーされました!
12.1.1. Java Transactions API(JTA) の概要 リンクのコピーリンクがクリップボードにコピーされました!
はじめに
これらのトピックは、Java Transactions API(JTA) の基本的な理解を提供します。
12.2. トランザクションの概念 リンクのコピーリンクがクリップボードにコピーされました!
12.2.1. トランザクション リンクのコピーリンクがクリップボードにコピーされました!
12.2.2. トランザクションの ACID プロパティー リンクのコピーリンクがクリップボードにコピーされました!
Atomicity)、一貫性 (Consistency)、独立性 (Isolation)、永続性 (Durability) の略語です。通常、この用語はデータベースやトランザクション操作において使用されます。
ACID の定義
- 原子性 (Atomicity)
- トランザクションの原子性を保つには、すべてのトランザクションメンバーが同じ決定を行う必要があります。これらのメンバーはコミットまたはロールバックを行います。原子性が保たれない場合の結果はヒューリスティックな結果と呼ばれます。
- 一貫性
- 一貫性とは、データベーススキーマの観点から、データベースに書き込まれたデータが有効なデータであることを保証するという意味です。データベースあるいは他のデータソースは常に一貫した状態でなければなりません。一貫性のない状態の例には、操作が中断される前にデータの半分が書き込まれてしまったフィールドなどがあります。すべてのデータが書き込まれた場合や、書き込みが完了しなかった時に書き込みがロールバックされた場合に、一貫した状態となります。
- 分離
- 独立性とは、トランザクションのスコープ外のプロセスがデータを変更できないように、トランザクションで操作されたデータが変更前にロックされる必要があることを意味します。
- 持続性 (Durability)
- 持続性とは、トランザクションのメンバーがコミットするよう指示されてから外部で問題が発生した場合に、問題が解決されるとすべてのメンバーがトランザクションを継続してコミットできることを意味します。このような問題には、ハードウェア、ソフトウェア、ネットワーク、またはその他の関与するシステムが関連することがあります。
12.2.3. トラザクションコーディネーターまたはトランザクションマネージャー リンクのコピーリンクがクリップボードにコピーされました!
12.2.4. トランザクションの参加者 リンクのコピーリンクがクリップボードにコピーされました!
12.2.5. Java Transactions API(JTA) について リンクのコピーリンクがクリップボードにコピーされました!
12.2.6. Java Transaction Service (JTS) リンクのコピーリンクがクリップボードにコピーされました!
12.2.7. XA データソースおよび XA トランザクション リンクのコピーリンクがクリップボードにコピーされました!
12.2.8. XA リカバリー リンクのコピーリンクがクリップボードにコピーされました!
12.2.9. 2 フェーズコミットプロトコル リンクのコピーリンクがクリップボードにコピーされました!
フェーズ 1
最初のフェーズでは、トランザクションをコミットできるか、あるいはロールバックする必要があるかをトランザクションの参加者がトランザクションコーディネーターに通知します。
フェーズ 2
2 番目のフェーズでは、トランザクションコーディネーターがトランザクション全体をコミットするか、またはロールバックするかを決定します。いずれの参加者もコミットできない場合、トランザクションはロールバックしなければなりません。それ以外の場合、トランザクションはコミットできます。コーディネーターは何を行うかをリソースに指示し、トランザクションはその完了時にコーディネーターに通知します。この時点で、トランザクションは完了します。
12.2.10. トランザクションタイムアウト リンクのコピーリンクがクリップボードにコピーされました!
12.2.11. 分散トランザクション リンクのコピーリンクがクリップボードにコピーされました!
12.2.12. ORB 移植性 API リンクのコピーリンクがクリップボードにコピーされました!
ORB ポータビリティ API クラス
com.arjuna.orbportability.orbcom.arjuna.orbportability.oa
12.2.13. ネストされたトランザクションについて リンクのコピーリンクがクリップボードにコピーされました!
ネストされたトランザクションの利点
- 誤った隔離
- サブトランザクションがロールバックする場合、おそらくそれが使用しているオブジェクトが失敗したために、囲んでいるトランザクションはロールバックする必要はありません。
- モジュール性
- 新しいトランザクションの開始時にトランザクションがすでに呼び出しに関連付けられている場合、新しいトランザクションはその中にネストされます。したがって、オブジェクトにトランザクションが必要であることがわかっている場合は、オブジェクト内にトランザクションを作成できます。オブジェクトのメソッドがクライアントトランザクションなしで呼び出された場合、オブジェクトのトランザクションは最上位になります。それ以外の場合は、クライアントのトランザクションのスコープ内にネストされます。同様に、クライアントはオブジェクトがトランザクションであるかどうかを知る必要はありません。独自のトランザクションを開始できます。
12.2.14. XML トランザクションサービス リンクのコピーリンクがクリップボードにコピーされました!
12.2.14.1. XTS によって使用されるプロトコルの概要 リンクのコピーリンクがクリップボードにコピーされました!
12.2.14.2. Web Services-Atomic Transaction (WS-AT) プロセス リンクのコピーリンクがクリップボードにコピーされました!
アトミックトランザクション (AT) プロセス
- AT を開始する際、クライアントは最初に WS-T をサポートする WS-C Activation Coordinator Web サービスを見つけます。
- クライアントはコーディネーション型として指定 http://schemas.xmlsoap.org/ws/2004/10/wsat して WS-C
CreateCoordinationContextメッセージをサービスに送信します。 - クライアントは適切な WS-T コンテキストをアクティベーションサービスから受け取ります。
CreateCoordinationContextメッセージの応答であるトランザクションコンテキストのCoordinationType要素は WS-AT 名前空間 http://schemas.xmlsoap.org/ws/2004/10/wsat に設定されます。また、参加者を登録できるアトミックトランザクションコーディネーターエンドポイントである WS-C Registration Service への参照も含まれます。- クライアントは通常、続いて Web サービスの呼び出しを行い、Web サービスによるすべての変更をコミットまたはロールバックしてトランザクションを完了します。完了できるようにするには、エンドポイントがコーディネーションコンテキストで返された登録サービスに登録メッセージを送信し、クライアントを完了プロトコルの参加者として登録する必要があります。
- クライアントを登録したら、クライアントアプリケーションは Web サービスと対話してビジネスレベルの作業を達成します。クライアントは、ビジネス Web サービスが呼び出されるごとに、トランザクションコンテキストを SOAP ヘッダーブロックの挿入し、各呼び出しがトランザクションによって暗黙的にスコープ付けされます。WS-AT 対応 Web サービスをサポートするツールキットは、SOAP ヘッダーブロックで見つかったコンテキストをバックエンド操作と関連付ける機能を提供します。これにより、Web サービスによる変更がクライアントと同じトランザクションの範囲内で行われるようにし、トランザクションコーディネーターによるコミットまたはロールバックの対象になるようにします。
- 必要なアプリケーションの作業がすべて完了したら、クライアントはサービス状態の変更を永続する目的でトランザクションを終了することができます。完了参加者は、トランザクションをコミットまたはロールバックするようコーディネーターに指示します。コミットまたはロールバック操作が完了すると、トランザクションの結果を示すために状態が参加者に返されます。
12.2.14.3. Web Services-Business Activity (WS-BA) プロセス リンクのコピーリンクがクリップボードにコピーされました!
WS-BA プロセス
- サービスは作業をするよう要求されます。
- これらのサービスに作業を元に戻す機能があるのであれば、BA が後でその作業の取り消しを決定した場合に備えて BA に通知します。WS-BA に障害が発生した場合は、元に戻す undo 動作を実行するようサービスに指示することができます。
12.2.14.4. トランザクションブリッジングの概要 リンクのコピーリンクがクリップボードにコピーされました!
txbridge は双方向のリンクを提供し、トランザクションのいずれの型も、別の型と使用するよう設計されているビジネスロジックを含めることができます。ブリッジによって使用される技術は、介入とプロトコルマッピングの組み合わせです。
org.jboss.jbossts.txbridgeおよびそのサブパッケージ。これは、クラスの 2 つのセットによって構成され、セットごとに各方向のブリッジング用になります。
12.3. トランザクションの最適化 リンクのコピーリンクがクリップボードにコピーされました!
12.3.1. トランザクション最適化の概要 リンクのコピーリンクがクリップボードにコピーされました!
はじめに
JBoss EAP 6 のトランザクションサブシステムには、アプリケーションで利用できるいくつかの最適化が含まれています。
12.3.2. 1 フェーズコミット (1PC) の LRCO 最適化 リンクのコピーリンクがクリップボードにコピーされました!
12.3.2.1. Commit Markable Resource (CMR) リンクのコピーリンクがクリップボードにコピーされました!
概要
Commit Markable Resource (CMR) インターフェイスを介してリソースマネージャーへのアクセスを設定すると、1PC リソースマネージャーを 2PC トランザクションに確実に参加させることができます。これは、非 XA リソースを完全にリカバリー可能にする LRCO アルゴリズムの実装です。
- 2PC を準備する
- LRCO をコミットします。
- tx ログを書き込む
- 2PC をコミットする
exception-sorter パラメーターを使用します。JBoss EAP 『管理および設定ガイド』 に記載されているデータソース設定例に従うことができます。
制約
トランザクションには、CMR リソースを 1 つだけ含めることができます。
前提条件
次の SQL が機能するテーブルを作成する必要があります。
SELECT xid,actionuid FROM _tableName_ WHERE transactionManagerID IN (String[]) DELETE FROM _tableName_ WHERE xid IN (byte[[]]) INSERT INTO _tableName_ (xid, transactionManagerID, actionuid) VALUES (byte[],String,byte[])
SELECT xid,actionuid FROM _tableName_ WHERE transactionManagerID IN (String[])
DELETE FROM _tableName_ WHERE xid IN (byte[[]])
INSERT INTO _tableName_ (xid, transactionManagerID, actionuid) VALUES (byte[],String,byte[])
例12.1 SQL クエリーのいくつかの例
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE TABLE xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28)) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid VARCHAR(255) for bit data not null, transactionManagerID varchar(64), actionuid VARCHAR(255) for bit data not null) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid VARCHAR(255) for bit data not null, transactionManagerID
varchar(64), actionuid VARCHAR(255) for bit data not null)
CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28)) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid bytea, transactionManagerID varchar(64), actionuid bytea) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid bytea, transactionManagerID varchar(64), actionuid bytea)
CREATE UNIQUE INDEX index_xid ON xids (xid)
リソースマネージャーを CMR として有効にする
デフォルトでは、CMR 機能はデータソースに対して無効になっています。有効にするには、データソースの設定を作成または変更し、connectable 属性を true に設定する必要があります。サーバー xml 設定ファイルの datasources セクションの設定エントリーの例は次のとおりです。
<datasource enabled="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" jta="true" use-java-context="true" spy="false" use-ccm="true" connectable="true"/>
<datasource enabled="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" jta="true" use-java-context="true" spy="false" use-ccm="true" connectable="true"/>
/subsystem=datasources/data-source=ConnectableDS:add(enabled="true", jndi-name="java:jboss/datasources/ConnectableDS", jta="true", use-java-context="true", spy="false", use-ccm="true", connectable="true", connection-url="validConnectionURL", exception-sorter="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter", driver-name="h2")
/subsystem=datasources/data-source=ConnectableDS:add(enabled="true", jndi-name="java:jboss/datasources/ConnectableDS", jta="true", use-java-context="true", spy="false", use-ccm="true", connectable="true", connection-url="validConnectionURL", exception-sorter="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter", driver-name="h2")
新しい CMR 機能を使用するために既存のリソースを更新
新しい CMR 機能を使用するために既存のリソースを更新するだけでよい場合は、接続可能な属性を変更するだけです。
/subsystem=datasources/data-source=ConnectableDS:write-attribute(name=connectable,value=true)
/subsystem=datasources/data-source=ConnectableDS:write-attribute(name=connectable,value=true)
CMR 対応のデータソースの特定
トランザクションサブシステムは、以下に示すように、トランザクションサブシステム設定セクションへのエントリーを通じて CMR 対応のデータソースを識別します。
12.3.3. 推定中止 (presumed-abort) の最適化 リンクのコピーリンクがクリップボードにコピーされました!
12.3.4. 読み取り専用の最適化 リンクのコピーリンクがクリップボードにコピーされました!
12.4. トランザクションの結果 リンクのコピーリンクがクリップボードにコピーされました!
12.4.1. トランザクションの結果 リンクのコピーリンクがクリップボードにコピーされました!
- ロールバック
- トランザクションの参加者のいずれかがコミットできなかったり、トランザクションコーディネーターが参加者にコミットを指示できない場合は、トランザクションがロールバックされます。詳細は、「トランザクションのロールバックについて」 を参照してください。
- Commit
- トランザクションの参加者すべてがコミットできる場合、トランザクションコーディネーターはコミットの実行を指示します。詳細は、「トランザクションのコミット」 を参照してください。
- ヒューリスティックな結果
- トランザクションの参加者の一部がコミットし、他の参加者がロールバックした場合をヒューリスティックな結果と呼びます。ヒューリスティックな結果には、人間の介入が必要になります。詳細は、「ヒューリスティックな結果」 を参照してください。
12.4.2. トランザクションのコミット リンクのコピーリンクがクリップボードにコピーされました!
12.4.3. トランザクションのロールバックについて リンクのコピーリンクがクリップボードにコピーされました!
12.4.4. ヒューリスティックな結果 リンクのコピーリンクがクリップボードにコピーされました!
- ヒューリスティックロールバック
- 一部またはすべての参加者が一方的にトランザクションをロールバックしたため、コミット操作が失敗しました。
- ヒューリスティックコミット
- 参加者のすべてが一方的にコミットしたため、ロールバック操作に失敗します。たとえば、コーディネーターが正常にトランザクションを準備したにも関わらず、ログ更新の失敗などでコーディネーター側で障害が発生したため、ロールバックの実行を決定した場合などに発生します。暫定的に、参加者はコミットすることを決定することができます。
- ヒューリスティック混合
- 一部の参加者がコミットし、その他の参加者はロールバックした状態です。
- ヒューリスティックハザード
- 一部の更新の結果は不明です。既知のものについては、すべてコミットされているか、すべてロールバックされています。
12.4.5. JBoss Transactions エラーと例外 リンクのコピーリンクがクリップボードにコピーされました!
UserTransaction クラスのメソッドによって発生する例外の詳細については、『UserTransaction API』 仕様 (http://docs.oracle.com/javaee/6/api/javax/transaction/UserTransaction.html) を参照してください。
12.5. JTA トランザクションの概要 リンクのコピーリンクがクリップボードにコピーされました!
12.5.1. Java Transactions API(JTA) について リンクのコピーリンクがクリップボードにコピーされました!
12.5.2. JTA トランザクションのライフサイクル リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションは新しいトランザクションを開始します。
トランザクションを開始するために、アプリケーションは JNDI から (EJB の場合はアノテーションから)UserTransactionクラスのインスタンスを取得します。UserTransactionインターフェースには、トップレベルのトランザクションを開始、コミット、およびロールバックするメソッドが含まれています。新規作成されたトランザクションは、そのトランザクションを呼び出すスレッドと自動的に関連付けされます。ネストされたトランザクションは JTA ではサポートされないため、すべてのトランザクションがトップレベルのトランザクションとなります。UserTransactionを呼び出します。begin()アノテーションを使用すると、EJB メソッドが呼び出されたときにトランザクションが開始されます (TransactionAttribute ルールによって駆動されます)。この時点以降に使用されたリソースは、このトランザクションと関連付けられます。2 つ以上のリソースが登録された場合、トランザクションは XA トランザクションになり、コミット時に 2 フェーズコミットプロトコルに参加します。注記UserTransactionオブジェクトは、BMT トランザクションにのみ使用されます。CMT では、UserTransaction オブジェクトは許可されていません。アプリケーションが状態を変更します。
次のステップでは、アプリケーションがその作業を実行し、その状態を変更します。アプリケーションはコミットまたはロールバックの実行を決定します。
アプリケーションの状態の変更が完了すると、アプリケーションはコミットするか、またはロールバックするかを決定します。UserTransactionのいずれかの適切なメソッドを呼び出します。commit()またはUserTransaction。rollback()。トランザクションマネージャーは、そのレコードからトランザクションを削除します。
コミットまたはロールバックが完了すると、トランザクションマネージャーはレコードをクリーンアップし、トランザクションに関する情報をトランザクションログから削除します。
障害回復
障害回復は自動的に行われます。リソース、トランザクションの参加者、またはアプリケーションサーバーが使用できなくなった場合は、障害が解決され、リソースが再度使用できるようになったときにトランザクションマネージャーがリカバリーを実行します。
12.6. トランザクションサブシステムの設定 リンクのコピーリンクがクリップボードにコピーされました!
12.6.1. トランザクション設定の概要 リンクのコピーリンクがクリップボードにコピーされました!
はじめに
次の手順は、JBoss EAP 6 のトランザクションサブシステムを設定する方法を示しています。
12.6.2. トランザクションデータソースの設定 リンクのコピーリンクがクリップボードにコピーされました!
12.6.2.1. XA Datasource の設定 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
管理コンソールへのログイン
新しいデータソースを追加します。
JBoss EAP 6 に新しいデータソースを追加します。上部の XA データソース タブをクリックします。注記JBoss EAP 6 に新しいデータソースを追加する方法については、Red Hat Customer Portal の 『管理および設定ガイド』 の 『管理インターフェイスを使用した XA データソースの作成』 セクションを参照してください。必要に応じて他のプロパティーを設定します。
すべてのデータソースパラメーターは、「データソースのパラメーター」。
結果
XA Datasource が設定され、使用する準備ができます。
12.6.2.2. 管理インターフェースによる非 XA データソースの作成 リンクのコピーリンクがクリップボードにコピーされました!
概要
ここでは、管理コンソールまたは管理 CLI のいずれかを使用して非 XA データソースを作成する手順について取り上げます。
前提条件
- JBoss EAP 6 サーバーが稼働している必要があります。
手順12.1 管理 CLI または管理コンソールのいずれかを使用したデータソースの作成
管理 CLI
- CLI ツールを起動し、サーバーに接続します。
- 次の管理 CLI コマンドを実行して、非 XA データソースを作成し、必要に応じて変数を設定します。注記DRIVER_NAME の値は、JDBC ドライバー JAR にある
/META-INF/services/java.sql.Driverファイルにリストされているクラスの数によって異なります。クラスが 1 つしかない場合、値は JAR の名前です。複数のクラスがある場合、値は JAR の名前 + driverClassName + "_" + majorVersion + "_"+minorVersion です。そうしないと、次のエラーがログに記録されます。JBAS014775: New missing/unsatisfied dependencies
JBAS014775: New missing/unsatisfied dependenciesCopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、MySQL 5.1.31 ドライバーに必要な DRIVER_NAME 値は、mysql-connector-java-5.1.31-bin.jarcom.mysql.jdbc.Driver_5_1です。data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --connection-url=CONNECTION_URL
data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --connection-url=CONNECTION_URLCopy to Clipboard Copied! Toggle word wrap Toggle overflow - データソースを有効にします。
data-source enable --name=DATASOURCE_NAME
data-source enable --name=DATASOURCE_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
管理コンソール
- 管理コンソールへログインします。
管理コンソールの データソース パネルに移動します
- コンソール上部の Configuration タブを選択します。
- ドメインモードの場合は、左上のドロップダウンボックスからプロファイルを選択します。
- コンソールの左側にある メニューを展開し、 メニューを展開します。
- コンソールの左側にあるメニューから を選択します。
新しいデータソースを作成します。
- データソース パネルの上部にある をクリックします。
- データソースの 作成 ウィザードに新しいデータソース属性を入力し、 ボタンに進みます。
- データソースの作成 ウィザードに JDBC ドライバーの詳細を入力し、 へをクリックして続行します。
- データソースの作成 ウィザードで接続設定を入力します。
- ボタンをクリックして、データソースへの接続をテストし、設定が正しいことを確認します。
- をクリックして終了します
結果
非 XA データソースがサーバーに追加されました。これで、standalone.xml ファイルまたは domain.xml ファイルのいずれか、および管理インターフェイスに表示されます。
12.6.2.3. JTA Transaction API を使用するようデータソースを設定 リンクのコピーリンクがクリップボードにコピーされました!
概要
ここでは、データソースで Java Transaction API (JTA) を有効にする方法を説明します。
前提条件
このタスクを続行するには、次の条件を満たしている必要があります。
- データベースまたはその他のリソースは、JavaTransactionAPI をサポートしている必要があります。疑わしい場合は、データベースまたはその他のリソースのドキュメントを参照してください。
- データソースを作成します。「管理インターフェースによる非 XA データソースの作成」 を参照してください。
- JBoss EAP 6 を停止します。
- テキストエディターで設定ファイルを直接編集できる権限を持たなければなりません。
手順12.2 Java Transaction API を使用するようデータソースを設定
テキストエディターで設定ファイルを開きます。
JBoss EAP 6 を管理対象ドメインまたはスタンドアロンサーバーで実行するかによって、設定ファイルの場所は異なります。管理対象ドメイン
管理対象ドメインのデフォルトの設定ファイルは、Red Hat Enterprise Linux の場合はEAP_HOME/domain/configuration/domain.xml にあり、Microsoft Windows の場合はEAP_HOME\domain \ configuration\domain.xmlにあります。スタンドアロンサーバー
スタンドアロンサーバーのデフォルトの設定ファイルは、Red Hat Enterprise Linux の場合はEAP_HOME/standalone/configuration/standalone.xml にあり、Microsoft Windows の場合はEAP_HOME\Standalone \ configuration\standalone.xmlにあります。
データソースに対応する
<datasource>タグを見つけます。データソースのjndi-name属性は、作成時に指定した属性に設定されます。たとえば、ExampleDS データソースは次のようになります。<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">Copy to Clipboard Copied! Toggle word wrap Toggle overflow jta属性をtrueに設定します。前の手順で表示されたように、<datasource>タグの内容に次を追加します。jta= "true"特定のユースケース (読み取り専用データソースの定義など) がない限り、Red Hat はデフォルト値のjta=trueをオーバーライドすることをお勧めしません。この設定は、データソースが Java Transaction API を尊重し、JCA 実装による接続の追跡を改善できることを示しています。設定を保存します。
設定ファイルを保存しテキストエディターを終了します。JBoss EAP 6 を起動します。
JBoss EAP 6 サーバーを再起動します。
結果
JBoss EAP 6 が起動し、データソースが Java Transaction API を使用するように設定されます。
12.6.2.4. データベース接続検証設定の指定 リンクのコピーリンクがクリップボードにコピーされました!
概要
データベースのメンテナンス、ネットワークの問題、またはその他の障害により、JBoss EAP 6 からデータベースへの接続が失われることがあります。サーバー設定ファイルの <datasource> セクション内の <validation> 要素を使用して、データベース接続の検証を有効にします。以下の手順に従って、JBoss EAP 6 でデータベース接続の検証を有効にするようにデータソース設定を設定します。
手順12.3 データベース接続検証設定の指定
検証方法の選択
以下のいずれかの検証方法を選択します。<validate-on-match>true</validate-on-match>
<validate-on-match>オプションがtrueに設定されている場合は、データ接続が、次の手順で指定された検証メカニズムを使用して接続プールからチェックアウトされるたびに検証されます。接続が有効でない場合は、警告がログに書き込まれ、プール内の次の接続が取得されます。このプロセスは、有効な接続が見つかるまで続行します。プール内の各接続を繰り返し処理しない場合は、<use-fast-fail>オプションを使用できます。有効な接続がプールにない場合は、新しい接続が作成されます。接続の作成に失敗すると、例外が要求元アプリケーションに返されます。この設定により、最も早いリカバリーが実現されますが、データベースへの負荷が最も大きくなります。ただし、これは、パフォーマンスを気にする必要がない場合は最も安全な方法です。<background-validation>true</background-validation>
<background-validation>オプションがtrueに設定されている場合、これを<background-validation-millis>値と組み合わせて使用して、バックグラウンド検証を実行する頻度を決定します。<background-validation-millis>パラメーターのデフォルト値は 0 ミリ秒です。これは、デフォルトで無効になっていることを意味します。この値は<idle-timeout-minutes>設定とは違う値に設定してください。これは、特定のシステムに最適な<background-validation-millis>値を決定するためのバランスを取る行為です。値が小さいほどプールの検証頻度が高くなり、より迅速に無効な接続がプールから削除されます。ただし、値が小さいほど、より多くのデータベースリソースが必要になります。値が大きいほど接続検証チェックの頻度が低くなり、データベースリソースの使用量が減りますが、無効な接続が検出されない期間が長くなります。
注記<validate-on-match>オプションがtrueに設定されている場合、<background-validation>オプションはfalseに設定する必要があります。その逆も同様です。<background-validation>オプションがtrueに設定されている場合、<validate-on-match>オプションはfalseに設定する必要があります。検証メカニズムの選択
以下のいずれかの検証メカニズムを選択します。<valid-connection-checker> クラス名を指定します
これは、使用中の特定の RDBMS に最適化されているため、推奨されるメカニズムです。JBoss EAP 6 は以下の接続チェッカーを提供します。- org.jboss.jca.adapters.jdbc.extensions.db2.DB2ValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLReplicationValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.novendor.JDBC4ValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.novendor.NullValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseValidConnectionChecker
<check-valid-connection-sql> に SQL を指定します
接続を検証するために使用する SQL ステートメントを提供します。以下は、Oracle 用接続を検証するために SQL ステートメントをどのように指定するかの例です。MySQL または PostgreSQL の場合は、以下の SQL ステートメントを指定する必要があります。<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <check-valid-connection-sql>select 1</check-valid-connection-sql>
<check-valid-connection-sql>select 1</check-valid-connection-sql>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
<exception-sorter> クラス名を設定します。
例外が致命的とマークされた場合、接続はトランザクションに参加していてもすぐに閉じられます。致命的な接続例外を適切に検出およびクリーンアップするには、例外ソータークラスオプションを使用します。JBoss EAP 6 は、以下の例外ソーターを提供します。- org.jboss.jca.adapters.jdbc.extensions.db2.DB2ExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.informix.InformixExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.novendor.NullExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter
12.6.2.5. データソースのパラメーター リンクのコピーリンクがクリップボードにコピーされました!
| パラメーター | 説明 |
|---|---|
| jndi-name | データソースの一意の JNDI 名。 |
| pool-name | データソースの管理プール名。 |
| enabled | データソースが有効かどうかを指定します。 |
| use-java-context |
データソースをグローバルの JNDI にバインドするかどうかを指定します。
|
| spy |
JDBC レイヤーで
spy 機能を有効にします。この機能は、データソースへの JDBC トラフィックをすべてログに記録します。ロギングカテゴリーの jboss.jdbc.spy も logging サブシステムのログレベルである DEBUG に設定する必要があることに注意してください。
|
| use-ccm | キャッシュ接続マネージャーを有効にします。 |
| new-connection-sql | 接続プールに接続が追加された時に実行する SQL ステートメント。 |
| transaction-isolation |
次のいずれかになります。
|
| url-selector-strategy-class-name | インターフェイスを実装するクラスorg.jboss.jca.adapters.jdbc.URLSelectorStrategy。 |
| security |
セキュリティー設定である子要素が含まれています。表12.6「セキュリティーパラメーター」を参照してください。
|
| 検証 |
検証設定である子要素が含まれます。表12.7「検証パラメーター」を参照してください。
|
| timeout |
タイムアウト設定である子要素が含まれています。表12.8「タイムアウトパラメーター」を参照してください。
|
| statement |
ステートメント設定である子要素が含まれます。表12.9「ステートメントのパラメーター」を参照してください。
|
| パラメーター | Description |
|---|---|
| jta | XA 以外のデータソースの JTA 統合を有効にします。XA データソースには適用されません。 |
| connection-url | JDBC ドライバーの接続 URL。 |
| driver-class | JDBC ドライバークラスの完全修飾名。 |
| connection-property |
メソッドに渡される任意の接続プロパティー
Driver.connect(url,props)。各接続プロパティーは、文字列の名前と値のペアを指定します。プロパティー名は名前に由来し、値は要素の内容に由来します。
|
| pool |
プーリング設定である子要素が含まれます。表12.4「非 XA および XA データソースに共通のプールパラメーター」を参照してください。
|
| url-delimiter |
高可用性 (HA) クラスター化されたデータベースの connection-url にある URL の区切り文字。
|
| パラメーター | Description |
|---|---|
| xa-datasource-property |
実装クラス
XADataSource に割り当てるプロパティー。名前 = 値 で指定します。セッターメソッドが存在する場合は、次の形式でsetName、プロパティーは、次の形式で setter メソッドを呼び出すことによって設定されます。setName(value)。
|
| xa-datasource-class |
実装クラスの完全修飾名
javax.sql.XADataSource。
|
| driver |
JDBC ドライバーを含むクラ出力ダーモジュールへの一意の参照。受け入れられる形式は driverName # majorVersion です。minorVersion。
|
| xa-pool |
プーリング設定である子要素が含まれます。表12.4「非 XA および XA データソースに共通のプールパラメーター」 および 表12.5「XA プールパラメーター」 を参照してください。
|
| recovery |
リカバリ設定である子要素が含まれています。表12.10「リカバリーパラメーター」を参照してください。
|
| パラメーター | Description |
|---|---|
| min-pool-size | プールが保持する最小接続数 |
| max-pool-size | プールが保持可能な最大接続数 |
| prefill | 接続プールを事前に入力するかどうか。デフォルトは false です。 |
| use-strict-min | min-pool-size に達した後、アイドル接続スキャンがそれ以降の接続を閉じるためのマーキングを厳密に停止する必要があるかどうか。デフォルト値は false です。 |
| flush-strategy |
エラーが発生した場合にプールがフラッシュされるかどうか。有効な値は以下のとおりです。
デフォルトは
FailingConnectionOnly です。
|
| allow-multiple-users | 複数のユーザーが getConnection(user, password) メソッドを使いデータソースへアクセスするかどうか、および内部プールタイプがこの動作に対応するかを指定します。 |
| パラメーター | Description |
|---|---|
| is-same-rm-override | javax.transaction.xa.XAResource.isSameRM(XAResource) クラスが true または false を返すかどうか。 |
| interleaving | XA 接続ファクトリーのインターリービングを有効にするかどうかを指定します。 |
| no-tx-separate-pools |
コンテキストごとに個別のサブプールを作成するかどうか。これは、JTA トランザクションの内部と外部の両方で XA 接続を使用できない Oracle データソースに必要です。
このオプションを使用すると、実際のプールがつ作成されるため、合計プールサイズが
max-pool-size の倍になります。
|
| pad-xid | Xid のパディングを行うかどうかを指定します。 |
| wrap-xa-resource |
XAResource をラップするかどうか
org.jboss.tm.XAResourceWrapper実例。
|
| パラメーター | Description |
|---|---|
| user-name | 新規接続の作成に使うユーザー名 |
| password | 新規接続の作成に使うパスワード |
| security-domain | 認証処理を行う JAAS security-manager の名前を含みます。この名前は、JAAS ログイン設定の application-policy/name 属性に相関します。 |
| reauth-plugin | 物理接続の再認証に使う再認証プラグインを定義します。 |
| パラメーター | Description |
|---|---|
| valid-connection-checker |
インターフェイスの実装
org.jboss.jca.adaptors.jdbc.ValidConnectionCheckerこれはSQLException.isValidConnection(Connection e)接続を検証するメソッド。接続が破棄されると例外が発生します。これは、パラメーター check-valid-connection-sql が存在する場合、それをオーバーライドします。
|
| check-valid-connection-sql | プール接続の妥当性を確認する SQL ステートメント。これは、管理対象接続がプールから取得されて使用されるときに呼び出される場合があります。 |
| validate-on-match |
接続ファクトリーが指定のセットに対して管理された接続に一致させようとした時に接続レベルの検証を実行するかどうかを示します。
一致検証に true を指定することは、通常、background-validation に true を指定することと組み合わせて実行されません。クライアントが使用前に接続を検証する必要がある場合は、Validate-on-match が必要です。このパラメーターはデフォルトで false です)。
|
| background-validation |
接続がバックグラウンドスレッドで検証されることを指定します。バックグラウンド検証は、
validate-on-match で 使用しない場合のパフォーマンスの最適化です。validate-on-match が true の場合、background-validation を使用すると、冗長なチェックが発生する可能性があります。バックグラウンド検証では、使用するためにクライアントに不正な接続が提供される可能性があります (検証スキャンの時点からクライアントに渡される前までの間に接続が不良になる) ため、クライアントアプリケーションはこの可能性を考慮する必要があります。
|
| background-validation-millis | バックグラウンド検証を実行する期間 (ミリ秒単位)。 |
| use-fast-fail |
true の場合、接続が無効であれば最初に接続を割り当てしようとした時点で失敗します。デフォルトは
false です。
|
| stale-connection-checker |
のインスタンス
org.jboss.jca.adapters.jdbc.StaleConnectionCheckerブール値を提供しますisStaleConnection(SQLException e)方法。このメソッドが true を返す場合、例外はorg.jboss.jca.adapters.jdbc.StaleConnectionException、のサブクラスですSQLException。
|
| exception-sorter |
のインスタンス
org.jboss.jca.adapters.jdbc.ExceptionSorterブール値を提供しますisExceptionFatal(SQLException e)方法。このメソッドは、例外がのすべてのインスタンスにブロードキャストされるかどうかを検証しますjavax.resource.spi.ConnectionEventListenerconnectionErrorOccurred メッセージとして。
|
| パラメーター | Description |
|---|---|
| use-try-lock | 用途tryLock()それ以外のlock()。ロックが使用できない場合に即座に失敗するのではなく、タイムアウトする前に設定された秒数間ロックの取得を試みます。デフォルトは 60 秒です。例として、5 分のタイムアウトを設定するには、<use-try-lock>300</use-try-lock>。 |
| blocking-timeout-millis | 接続の待機中にブロックする最大時間 (ミリ秒単位)。この時間を超えると、例外が出力されます。これは、接続の許可を待っている間のみブロックし、新しい接続の作成に時間がかかる場合でも例外を出力しません。デフォルトは 30000、つまり 30 秒です。 |
| idle-timeout-minutes |
アイドル状態の接続が閉じられるまでの最大時間 (分単位)。指定がない場合、デフォルトは
30 分になります。実際の最大時間は、idleRemover スキャン時間によって異なります。これは、プールの最小の idle-timeout-minutes の半分です。
|
| set-tx-query-timeout |
トランザクションがタイムアウトするまでの残り時間を基にクエリーのタイムアウトを設定するかどうかを指定します。トランザクションが存在しない場合は、設定されたクエリータイムアウトが使用されます。デフォルトは
false です。
|
| query-timeout | クエリーのタイムアウト (秒単位)。デフォルトではタイムアウトはありません。 |
| allocation-retry | 例外を出力する前に接続の割り当てを再試行する回数。デフォルトは 0 で、初回の割り当て失敗で例外が発生します。 |
| allocation-retry-wait-millis |
接続の割り当てを再試行する前に待機する時間 (ミリ秒単位)。デフォルトは 5000、つまり 5 秒です。
|
| xa-resource-timeout |
ゼロ以外の場合、この値はメソッドに渡されます
XAResource.setTransactionTimeout。
|
| パラメーター | Description |
|---|---|
| track-statements |
接続がプールへ返され、ステートメントが準備済みステートメントキャッシュへ返された時に、閉じられていないステートメントをチェックするかどうか。false の場合、ステートメントは追跡されません。
|
| prepared-statement-cache-size | LRU (Least Recently Used) キャッシュにある接続毎の準備済みステートメントの数。 |
| share-prepared-statements |
アプリケーションに提供されたラッパーがアプリケーションコードによって閉じられたときに、JBoss EAP が基盤の物理ステートメントを閉じたり終了せずに、キャッシュするかどうか。デフォルトは
false です。
|
| パラメーター | Description |
|---|---|
| recover-credential | リカバリーに使用するユーザー名とパスワードのペア、あるいはセキュリティードメイン。 |
| recover-plugin |
の実装
org.jboss.jca.core.spi.recoveryRecoveryPluginクラス、リカバリに使用されます。
|
12.6.3. トランザクションログ リンクのコピーリンクがクリップボードにコピーされました!
12.6.3.1. トランザクションログメッセージ リンクのコピーリンクがクリップボードにコピーされました!
DEBUGトランザクションロガーのログレベル。詳細なデバッグについては、TRACEログレベル。参照する「トランザクションサブシステムのログ設定」トランザクションロガーの設定についての情報。
TRACE ログレベルでログを記録するよう設定すると、トランザクションマネージャー は多くのロギング情報を生成できます。最も一般的なメッセージの一部は次のとおりです。このリストは包括的ではないため、これら以外のメッセージが表示される場合があります。
| トランザクションの開始 |
トランザクションが開始されると、次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.BasicAction::Begin:1342
tsLogger.logger.trace("BasicAction::Begin() for action-id "+ get_uid());
|
| トランザクションのコミット |
トランザクションがコミットすると、次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.BasicAction::End:1342
tsLogger.logger.trace("BasicAction::End() for action-id "+ get_uid());
|
| トランザクションのロールバック |
トランザクションがロールバックすると、次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.BasicAction::Abort:1575
tsLogger.logger.trace("BasicAction::Abort() for action-id "+ get_uid());
|
| トランザクションのタイムアウト |
トランザクションがタイムアウトすると、次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.TransactionReaper::doCancellations:349
tsLogger.logger.trace("Reaper Worker " + Thread.currentThread() + " attempting to cancel " + e._control.get_uid());
この結果、上記のように同じスレッドがトランザクションをロールバックすることが示されます。
|
12.6.3.2. トランザクションサブシステムのログ設定 リンクのコピーリンクがクリップボードにコピーされました!
概要
この手順を使用して、JBoss EAP 6 の他のログ設定とは関係なく、トランザクションに関してログに記録される情報の量を制御します。主な手順は、Web ベースの管理コンソールでこれを行う方法を示しています。その後、管理 CLI コマンドが実行されます。
手順12.4 管理コンソールを使用したトランザクションロガーの設定
ログ設定領域に移動します。
管理コンソールで、Configuration タブをクリックします。管理対象ドメインを使用する場合は、左上の プロファイル 選択ボックスから、設定するサーバープロファイルを選択します。コア メニューを展開し、ログ を選択します。編集します
com.arjuna属性。Log Categories タブを選択します。選択するcom.arjuna詳細 セクションで 編集 をクリックします。ここで、クラス固有のログ情報を追加できます。Thecom.arjunaクラスはすでに存在しています。ログレベルと、親ハンドラーを使用するかどうかを変更できます。- ログレベル
- ログレベルはデフォルトで
WARNです。トランザクションは大量のログ出力を生成する可能性があるため、標準のログレベルの意味はトランザクションロガーではわずかに異なります。一般に、選択したレベルよりも低い重大度のレベルでタグ付けされたメッセージは破棄されます。トランザクションログのレベル (詳細度の高い順)
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
- FAILURE
- 親ハンドラーの使用
- ロガーがその出力を親ロガーに送信する必要があるかどうか。デフォルトの動作は
trueです。
- 変更は直ちに反映されます。
12.6.3.3. トランザクションの参照と管理 リンクのコピーリンクがクリップボードにコピーされました!
log-store と呼ばれるリソースとして公開します。と呼ばれる API 操作probeトランザクションログを読み取り、ログごとにノードを作成します。あなたは呼び出すことができますprobeコマンドを手動で更新する必要があるときはいつでもlog-store。トランザクションログが即座に表示され非表示になるのは、正常な挙動です。
例12.2 ログストアの更新
default を使用するサーバーグループに対してログストアを更新します。スタンドアローンサーバーの場合は、コマンドから profile=default を削除します。
/profile=default/subsystem=transactions/log-store=log-store/:probe
/profile=default/subsystem=transactions/log-store=log-store/:probe
例12.3 準備済みトランザクションすべての表示
ls /profile=default/subsystem=transactions/log-store=log-store/transactions
ls /profile=default/subsystem=transactions/log-store=log-store/transactions
トランザクションの管理
- トランザクションの属性を表示します。
- JNDI 名、EIS 製品名とバージョン、またはそのステータスなどのトランザクションに関する情報を表示するには、
:read-resourceCLI コマンド。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resource
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resourceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - トランザクションの参加者を表示します。
- 各トランザクションログには、という子要素が含まれています
participants。使用read-resourceこの要素に対する CLI コマンドを使用して、トランザクションの参加者を確認します。参加者は JNDI 名によって識別されます。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resource
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resourceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 結果は以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここに表示される結果ステータスはHEURISTIC状態であり、回復の資格があります。詳細は、トランザクションをリカバリーします。 を参照してください。特別な場合では、ログに対応するトランザクションレコードがないオーファンレコード (XAResourceRecords) をオブジェクトストアに作成できます。たとえば、準備済みの XA リソースが TM の記録前にクラッシュし、ドメイン管理 API はアクセス不可能である場合などです。このようなレコードにアクセスするには、管理オプションexpose-all-logsをtrueに設定する必要があります。このオプションは管理モデルには保存されず、サーバーが再起動されるとfalseに戻ります。/profile=default/subsystem=transactions/log-store=log-store:write-attribute(name=expose-all-logs, value=true)
/profile=default/subsystem=transactions/log-store=log-store:write-attribute(name=expose-all-logs, value=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - トランザクションを削除します。
- 各トランザクションログは、トランザクションを表すトランザクションログを削除する
:delete操作をサポートします。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:delete
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:deleteCopy to Clipboard Copied! Toggle word wrap Toggle overflow - トランザクションをリカバリーします。
- 各トランザクション参加者は、
:recoverCLI コマンド。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recover
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow ヒューリスティックなトランザクションと参加者のリカバリー
- トランザクションのステータスが
HEURISTICの場合、リカバリ操作は状態をPREPAREに変更し、リカバリをトリガーします。 - トランザクションの参加者の 1 人がヒューリスティックである場合、リカバリ操作は再生を試みます
commit手術。成功すると、参加者はトランザクションログから削除されます。これを確認するには、:probeの操作log-store参加者がリストされていないことを確認します。最後の参加者が削除されると、トランザクションも削除されます。
- リカバリーが必要なトランザクションの状態を更新します。
- トランザクションをリカバリーする必要がある場合は、リカバリーを試行する前に
:refreshCLI コマンドを使用して、トランザクションのリカバリーが必要であるかを確認できます。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:refresh
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:refreshCopy to Clipboard Copied! Toggle word wrap Toggle overflow
トランザクション統計情報の表示
トランザクションマネージャーの統計が有効になっている場合は、トランザクションマネージャーとトランザクションサブシステムに関する統計を表示できます。見る「トランザクションマネージャーの設定」TransactionManager 統計を有効にする方法については。
| 統計 | 説明 | CLI コマンド |
|---|---|---|
| 合計 |
このサーバー上でトランザクションマネージャーにより処理されるトランザクションの合計数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-transactions,include-defaults=true)
|
| Committed |
このサーバー上でトランザクションマネージャーにより処理されるコミット済みトランザクションの数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-committed-transactions,include-defaults=true)
|
| 強制終了 |
このサーバー上でトランザクションマネージャーにより処理されるアボートされたトランザクションの数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-aborted-transactions,include-defaults=true)
|
| Timed Out |
このサーバー上でトランザクションマネージャーにより処理されるタイムアウトのトランザクションの数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-timed-out-transactions,include-defaults=true)
|
| Heuristics |
管理コンソールでは使用できません。ヒューリスティック状態のトランザクションの数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-heuristics,include-defaults=true)
|
| フライト状態のトランザクション |
管理コンソールでは使用できません。開始済みであるが終了されていないトランザクション数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-inflight-transactions,include-defaults=true)
|
| 障害の原因 - アプリケーション |
障害の原因がアプリケーションであった失敗トランザクションの数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-application-rollbacks,include-defaults=true)
|
| 障害の原因 - リソース |
障害の原因がリソースであった失敗トランザクションの数。
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-resource-rollbacks,include-defaults=true)
|
| 参加者 ID |
参加者の ID。
| /host=master/server=server-one/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-children-names(child-type=participants)
|
| トランザクションすべてのリスト |
トランザクションの完全リスト。
| /host=master/server=server-one/subsystem=transactions/log-store=log-store:read-children-names(child-type=transactions)
|
12.7. JTA トランザクションを使用する リンクのコピーリンクがクリップボードにコピーされました!
12.7.1. トランザクション JTA タスクの概要 リンクのコピーリンクがクリップボードにコピーされました!
はじめに
次の手順は、アプリケーションでトランザクションを使用する必要がある場合に役に立ちます。
12.7.2. トランザクションの制御 リンクのコピーリンクがクリップボードにコピーされました!
はじめに
この手順のリストでは、JTS API または JTS API を使用するアプリケーションでトランザクションを制御するさまざまな方法を概説します。
12.7.3. トランザクションの開始 リンクのコピーリンクがクリップボードにコピーされました!
UserTransactionのインスタンスを取得します。@TransactionManagement(TransactionManagementType.BEAN)アノテーションを用いると、JNDI、インジェクション、または EJB のコンテキスト EJB が Bean 管理のトランザクションを使用する場合) を使用してインスタンスを取得できます 。JNDI
new InitialContext().lookup("java:comp/UserTransaction")new InitialContext().lookup("java:comp/UserTransaction")Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注入
@Resource UserTransaction userTransaction;
@Resource UserTransaction userTransaction;Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテキスト
- ステートレス/ステートフル Bean の場合
@Resource SessionContext ctx; ctx.getUserTransaction();
@Resource SessionContext ctx; ctx.getUserTransaction();Copy to Clipboard Copied! Toggle word wrap Toggle overflow - メッセージ駆動型 Bean の場合
@Resource MessageDrivenContext ctx; ctx.getUserTransaction()
@Resource MessageDrivenContext ctx; ctx.getUserTransaction()Copy to Clipboard Copied! Toggle word wrap Toggle overflow
UserTransactionを呼び出します。begin()データソースに接続した後。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
JTSAPI を使用して既存のトランザクションに参加します。
EJB (CMT または BMT のいずれかと使用) の利点の 1 つは、コンテナーがトランザクション処理の内部をすべて管理することです。 そのため、ユーザーは EAP コンテナー間の XA トランザクションまたはトランザクションディストリビューションの一部であるトランザクションを処理する必要がありません。
結果:
トランザクションが開始します。トランザクションをコミットまたはロールバックするまで、データソースの使用はすべてトランザクションになります。
12.7.4. Nested Transactions リンクのコピーリンクがクリップボードにコピーされました!
12.7.5. トランザクションのコミット リンクのコピーリンクがクリップボードにコピーされました!
要件
トランザクションは、コミットする前に開始する必要があります。トランザクションの開始方法については、を参照してください。「トランザクションの開始」。
電話する
commit()UserTransactionのメソッド。あなたが電話するときcommit()UserTransactionのメソッドである場合、トランザクションマネージャーはトランザクションのコミットを試みます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow CMT (Container Managed Transaction) を使用する場合は、手動でコミットする必要はありません。
Bean がコンテナー管理トランザクションを使用するよう設定すると、コンテナーはコードで設定したアノテーションに基づいてトランザクションライフサイクルを管理します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
データソースがコミットされ、トランザクションが終了します。 そうでない場合は、例外が発生します。
12.7.6. トランザクションのロールバック リンクのコピーリンクがクリップボードにコピーされました!
要件
トランザクションは、ロールバックする前に開始する必要があります。トランザクションの開始方法については、を参照してください。「トランザクションの開始」。
電話する
rollback()UserTransactionのメソッド。あなたが電話するときrollback()UserTransactionのメソッドである場合、トランザクションマネージャーはトランザクションをロールバックし、データを以前の状態に戻そうとします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow CMT (Container Managed Transaction) を使用する場合は、トランザクションを手動でロールバックする必要はありません。
Bean がコンテナー管理トランザクションを使用するよう設定すると、コンテナーはコードで設定したアノテーションに基づいてトランザクションライフサイクルを管理します。注記CMT のロールバックは RuntimeException が発生すると実行されます。setRollbackOnlyメソッドを明示的に呼び出してロールバックを発生させることもできます。または、アプリケーション例外の@ApplicationException(rollback=true) を使用してロールバックできます。
結果
トランザクションは、トランザクションマネージャーによってロールバックされます。
12.7.7. トランザクションにおけるヒューリスティックな結果の処理方法 リンクのコピーリンクがクリップボードにコピーされました!
手順12.5 トランザクションにおけるヒューリスティックな結果の処理方法
原因を確認する
トランザクションのヒューリスティックな結果の最大の原因は、リソースマネージャーがコミットまたはロールバックの実行を約束したにも関わらず、約束を守らなかったことにあります。原因としては、サードパーティーコンポーネント、サードパーティーコンポーネントと JBoss EAP 6 間の統合レイヤー、または JBoss EAP 6 自体の問題が考えられます。ヒューリスティックなエラーの最も一般的な 2 つの原因は、環境での一時的な障害と、リソースマネージャー対応時のコーディングエラーです。環境の一時的な障害を修正する
通常、環境内で一時的な障害が発生した場合は、ヒューリスティックなエラーを発見する前に気づくはずです。ネットワークの停止、ハードウェア障害、データベース障害、電源異常などが考えられます。テスト環境でヒューリスティックな結果を経験した場合、ストレステスト中に、環境の弱点に関する情報が提供されます。ヒューリスティックトランザクションは回復されませんJBoss EAP 6 は、障害時に非ヒューリスティック状態であったトランザクションを自動的に回復しますが、ヒューリスティックトランザクションの回復は試みません。リソースマネージャーベンダーに連絡する
環境に明白な障害が発生していない場合や、ヒューリスティックな結果を簡単に再現できる場合は、おそらくコーディングエラーです。サードパーティーベンダーに連絡して、解決策が利用可能かどうかを確認してください。問題が JBoss EAP 6 自体のトランザクションマネージャーにあると思われる場合は、Red Hat グローバルサポートサービスに連絡してください。テスト環境で、ログを削除して JBoss EAP 6 を再起動します。
テスト環境である場合や、データの整合性を気にしない場合は、トランザクションログを削除して JBoss EAP 6 を再起動すると、ヒューリスティックな結果はなくなります。トランザクションログは、デフォルトでは、スタンドアロンサーバーの場合は EAP_HOME/Standalone/data/tx-object-store/に、管理対象ドメインの場合はEAP_HOME/domain/servers/SERVER_NAME/data/tx-object-storeにあります。管理対象ドメインの場合、SERVER_NAME は、サーバーグループに参加している個々のサーバー名を示します。注記トラザクションログの場所は、使用中のオブジェクトストアや、object-store-relative-toおよびobject-store-pathパラメーターに設定された値にも左右されます。ファイルシステムログ (標準のシャドウログや HornetQ ログなど) の場合、デフォルトの方向の場所が使用されますが、JDBC オブジェクトストアを使用する場合、トランザクションログはデータベースに保存されます。手作業で結果を解決する
トランザクションの結果を手動で解決するプロセスは、障害の正確な状況に大きく依存します。通常、次の手順を実行して、状況に適用する必要があります。- 関係しているリソースマネージャーを特定します。
- トランザクションマネージャーとリソースマネージャーの状態を調べます。
- 関係するコンポーネントの 1 つまたは複数で、ログの消去とデータの照合を手動で強制します。
これらの手順を実行する方法の詳細は、このドキュメントの範囲外です。
12.7.8. トランザクションタイムアウト リンクのコピーリンクがクリップボードにコピーされました!
12.7.8.1. トランザクションタイムアウト リンクのコピーリンクがクリップボードにコピーされました!
12.7.8.2. トランザクションマネージャーの設定 リンクのコピーリンクがクリップボードにコピーされました!
default、次の方法で手順とコマンドを変更する必要がある場合があります。
例のコマンドに関する注意点
- 管理コンソールの場合、
defaultプロファイルは、コンソールに最初にログインしたときに選択されるプロファイルです。別のプロファイルでトランザクションマネージャーの設定を変更する必要がある場合は、代わりにプロファイルを選択してくださいdefault、各命令で。同様に、プロファイルをdefaultサンプル CLI コマンドのプロファイル。 - スタンドアロンサーバーを使用する場合、プロファイルは 1 つだけ存在します。特定のプロファイルを選択するための指示は無視してください。CLI コマンドで、
/profile=defaultサンプルコマンドの一部。
transactionsサブシステムを有効にする必要があります。これはデフォルトで有効になっており、他の多くのサブシステムが正しく機能するために必要であるため、無効になる可能性はほとんどありません。
管理コンソールを使用した TM の設定
Web ベースの管理コンソールを使用して TM を設定するには、画面上部の 設定 タブを選択します。管理対象ドメインを使用している場合は、左上の プロファイル 選択ボックスから正しいプロファイルを選択してください。コンテナー メニューを展開し、トランザクション を選択します。
管理 CLI を使用した TM の設定
管理 CLI では、一連のコマンドを使用して TM を設定できます。コマンドはすべてで始まります/profile=default/subsystem=transactions/プロファイル付きの管理対象ドメインの場合default、また/subsystem=transactionsスタンドアロンサーバーの場合。
| オプション | 説明 | CLI コマンド |
|---|---|---|
|
統計の有効化 (Enable Statistics)
|
トランザクション統計を有効にするかどうか。これらの統計は、ランタイム タブの サブシステムメトリック セクションの管理コンソールで表示できます。
| /profile=default/subsystem=transactions/:write-attribute(name=enable-statistics,value=true)
|
|
Enable TSM Status
|
アウトオブプロセスのリカバリーに使用される TSM (トランザクションステータスマネージャー) サービスを有効にするかどうか。アウトオブプロセスリカバリマネージャーを実行して、別のプロセスから ActionStatusService に接続することはサポートされていません (通常はメモリー内で接続されます)。
|
この設定オプションはサポートされていません。
|
|
デフォルトのタイムアウト (Default Timeout)
|
デフォルトのトランザクションタイムアウトです。デフォルトでは
300 秒に設定されています。トランザクションごとにプログラムで上書きできます。
| /profile=default/subsystem=transactions/:write-attribute(name=default-timeout,value=300)
|
|
オブジェクトストアパス (Object Store Path)
|
TM オブジェクトストアがデータを格納する相対または絶対ファイルシステムパス。デフォルトでは、
object-store-relative-toパラメーターの値。
| /profile=default/subsystem=transactions/:write-attribute(name=object-store-path,value=tx-object-store)
|
|
オブジェクトストアパスに相対的 (Object Store Path Relative To)
|
ドメインモデルのグローバルなパス設定を参照します。デフォルト値は、JBoss EAP 6 のデータディレクトリーで、
jboss.server.data.dir プロパティーの値です。デフォルトは、管理対象ドメインの場合は EAP_HOME/domain/data/、スタンドアロンサーバーインスタンスの場合は EAP_HOME/standalone/data/ です。オブジェクトストアの値object-store-pathTM 属性は、このパスに関連しています。
| /profile=default/subsystem=transactions/:write-attribute(name=object-store-relative-to,value=jboss.server.data.dir)
|
|
ソケットバインディング
|
ソケットベースのメカニズムが使用されている場合に、トランザクションマネージャーが回復およびトランザクション ID の生成に使用するソケットバインディングの名前を指定します。参照する
process-id-socket-max-ports一意の識別子の生成の詳細については。ソケットバインディングは、管理コンソールの サーバー タブでサーバーグループごとに指定されます。
| /profile=default/subsystem=transactions/:write-attribute(name=socket-binding,value=txn-recovery-environment)
|
|
Status Socket Binding
|
トランザクションステータスマネージャーに使用するソケットバインディングを指定します。
|
この設定オプションはサポートされていません。
|
|
リカバリーリスナー (Recovery Listener)
|
トランザクションリカバリーのプロセスがネットワークソケットをリッスンするかどうかを指定します。デフォルトは
false です。
| /profile=default/subsystem=transactions/:write-attribute(name=recovery-listener,value=false)
|
| オプション | 説明 | CLI コマンド |
|---|---|---|
|
jts
|
Java Transaction Service (JTS) トランザクションを使用するかどうかを指定します。デフォルト値は
false で、JTA トランザクションのみを使用します。
| /profile=default/subsystem=transactions/:write-attribute(name=jts,value=false)
|
|
node-identifier
|
トランザクションマネージャーのノード識別子。このオプションは以下の場合に必要になります。
node-identifier は一意である必要があります。複数のノードが同じリソースマネージャーと対話したり、トランザクションオブジェクトストアを共有したりするため、node-identifier は JTA に対しても一意である必要があります。
| /profile=default/subsystem=transactions/:write-attribute(name=node-identifier,value=1)
|
|
process-id-socket-max-ports
|
トランザクションマネージャーは、各トランザクションログに対し一意の識別子を作成します。一意の識別子を生成するメカニズムは 2 種類あります。 ソケットベースのメカニズムとプロセスのプロセス識別子をベースにしたメカニズムです。
ソケットベースの識別子の場合、あるソケットを開くと、そのポート番号が識別子に使用されます。ポートがすでに使用されている場合は、空きのポートが見つかるまで次のポートがプローブされます。The
process-id-socket-max-portsTM が失敗する前に試行するソケットの最大数を表します。デフォルト値は 10 です。
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-socket-max-ports,value=10)
|
|
process-id-uuid
| true に設定すると、プロセス識別子を使用して各トランザクションに一意の識別子が作成されます。そうでない場合は、ソケットベースのメカニズムが使用されます。デフォルトは true です。詳細は、process-id-socket-max-ports を参照してください。有効にするprocess-id-socket-binding、設定process-id-uuidにfalse。
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-uuid,value=true)
|
|
process-id-socket-binding
|
トランザクションマネージャーがソケットベースのプロセス id を使用する必要がある場合に使用するソケットバインディング設定の名前。になります
undefinedもしもprocess-id-uuidはtrue;それ以外の場合は設定する必要があります。
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-socket-binding,value=true)
|
|
use-hornetq-store
|
トランザクションログには、ファイルベースのストレージではなく、HornetQ のジャーナルストレージメカニズムを使用します。デフォルトでは無効になっていますが、I/O パフォーマンスが改善されます。別々のトランザクションマネージャーで JTS トランザクションを使用することは推奨されません。このオプションの変更を反映するには shutdown コマンドを使用してサーバーを再起動する必要があります。
| /profile=default/subsystem=transactions/:write-attribute(name=use-hornetq-store,value=false)
|
12.7.9. JTA トランザクションのエラー処理 リンクのコピーリンクがクリップボードにコピーされました!
12.7.9.1. トランザクションエラーの処理 リンクのコピーリンクがクリップボードにコピーされました!
トランザクションがタイムアウトになったが、ビジネスロジックスレッドが認識しませんでした。
多くの場合、このようなエラーは、Hibernate がレイジーロードのデータベース接続を取得できない場合に発生します。頻繁に発生する場合は、タイムアウト値を増加できます。「トランザクションマネージャーの設定」 を参照してください。
トランザクションはすでにスレッドで実行されているか、NotSupportedException例外
The NotSupportedException例外は通常、JTA トランザクションをネストしようとしたことを示しますが、これはサポートされていません。トランザクションをネストしようとしないときは、多くの場合、スレッドプールタスクで別のトランザクションが開始されますが、トランザクションを中断または終了せずにタスクが終了します。
UserTransaction、これを自動的に処理します。その場合、フレームワークに問題がある可能性があります。
TransactionManagerまた Transactionメソッドを直接使用する場合は、トランザクションをコミットまたはロールバックするときに次の動作に注意してください。コードで TransactionManager メソッドを使用してトランザクションを制御する場合は、トランザクションをコミットまたはロールバックすると、現在のスレッドからトランザクションの関連付けが解除されます。ただし、コードで Transaction メソッドを使用する場合は、トランザクションが実行されているスレッドと関連付けられていないことがあり、スレッドプールに返す前に手動でスレッドからトランザクションの関連付けを解除する必要があります。
2 番目のローカルリソースを登録することはできません。
このエラーは、2 番目の非 XA リソースをトランザクションに登録しようとした場合に、発生します。1 つのトランザクションで複数のリソースが必要な場合、それらのリソースは XA である必要があります。
12.8. ORB 設定 リンクのコピーリンクがクリップボードにコピーされました!
12.8.1. Common Object Request Broker Architecture (CORBA) リンクのコピーリンクがクリップボードにコピーされました!
12.8.2. JTS トランザクション用 ORB の設定 リンクのコピーリンクがクリップボードにコピーされました!
手順12.6 管理コンソールを使用した ORB の設定
プロファイル設定の表示
管理コンソールの上部から 設定 を選択します。管理対象ドメインを使用する場合は、左上の選択ボックスから フル または フルヘクタールの プロファイルを選択します。イニシャライザ の設定を変更する
サブシステム メニューを展開します。コンテナー メニューを展開し、JacORB を選択します。メイン画面に表示されるフォームで、初期化 タブを選択し、編集 ボタンをクリックします。Security の値をon に設定して、セキュリティーインターセプターを有効にします。JTS の ORB を有効にするには、Transaction Interceptors の値をデフォルトの仕様ではなく、onに設定します。ヘルプが必要ですか? を参照してください。これらの値の詳細な説明については、フォームのリンクを参照してください。値の編集が終了したら、保存 をクリックします。高度な ORB 設定
高度な設定オプションについては、フォームの他のセクションを参照してください。各セクションには ヘルプが必要ですか? パラメーターに関する詳細情報へのリンク。
管理 CLI を使用して ORB を設定
管理 CLI を使用して ORB を設定できます。次のコマンドは、管理コンソールの初期化子を上記の手順と同じ値に設定します。これは、JTS と使用するために行う ORB の最低限の設定です。
/profile=full 部分を省略してください。
例12.4 セキュリティーインターセプターの有効化
/profile=full/subsystem=jacorb/:write-attribute(name=security,value=on)
/profile=full/subsystem=jacorb/:write-attribute(name=security,value=on)
例12.5 JacORB サブシステムでのトラザクションの有効化
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
例12.6 トランザクションサブシステムでの JTS の有効化
/profile=full/subsystem=transactions:write-attribute(name=jts,value=true)
/profile=full/subsystem=transactions:write-attribute(name=jts,value=true)
12.9. トランザクションに関するリファレンス リンクのコピーリンクがクリップボードにコピーされました!
12.9.1. JBoss Transactions エラーと例外 リンクのコピーリンクがクリップボードにコピーされました!
UserTransaction クラスのメソッドによって発生する例外の詳細については、『UserTransaction API』 仕様 (http://docs.oracle.com/javaee/6/api/javax/transaction/UserTransaction.html) を参照してください。
12.9.2. JTA トランザクションの例 リンクのコピーリンクがクリップボードにコピーされました!
例12.7 JTA トランザクションの例
12.9.3. JBossTransactionsJTA の API ドキュメント リンクのコピーリンクがクリップボードにコピーされました!
12.9.4. XA リカバリープロセスの制限 リンクのコピーリンクがクリップボードにコピーされました!
- トランザクションログが正常にコミットされたトランザクションから消去されないことがあります。
XAResourceのコミットメソッドが正常に完了し、トランザクションをコミットした後、コーディネーターがログをアップデートできるようになる前に JBoss EAP サーバーがクラッシュした場合、サーバーの再起動時に以下の警告メッセージが表示されることがあります。これは、リカバリー時に JBoss トランザクションマネージャー はログのトランザクション参加者を確認し、コミットを再試行しようとするからです。最終的に、JBoss Transaction Manager はリソースがコミットされていると想定し、コミットを再試行しなくなります。このような場合、トランザクションはコミットされデータの損失はないため、警告を無視しても問題ありません。ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecord
ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 警告を防ぐには、com.arjuna.ats.jta.xaAssumeRecoveryCompleteプロパティー値をtrueに設定します。このプロパティーは、登録されたXAResourceRecoveryインスタンスから新しいXAResourceインスタンスが見つからないとチェックされます。trueに設定すると、リカバリーで、以前のコミットの試行が成功したと見なされ、これ以上リカバリーを試行しなくてもインスタンスをログから削除できます。このプロパティーはグローバルであり、適切に使用しないとXAResourceインスタンスがコミットされていない状態のままになるため、注意して使用する必要があります。- XAResource.prepare() の最後にサーバーがクラッシュすると、JTS トランザクションに対するロールバックは呼び出されません。
XAResourceの完了後に JBoss EAP サーバーがクラッシュした場合prepare()メソッド呼び出しでは、参加しているすべての XAResources が準備済み状態でロックされ、サーバーの再起動時にその状態が維持されます。トランザクションがタイムアウトするか、DBA が手動でリソースをロールバックしてトランザクションをクリアするまで、トランザクションはロールバックされず、リソースはロックされたままになります。ログ。- 周期リカバリーはコミットされたトランザクションで発生する可能性があります。
- サーバーに過剰な負荷がかかっている場合、サーバーログには以下の警告メッセージとそれに続くスタックトレースが含まれる場合があります。
ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAException
ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAExceptionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 負荷が大きい場合、トランザクションにかかる処理時間が周期的リカバリープロセスのアクティビティーと重なることがあります。周期的リカバリープロセスは進行中のトランザクションを検出し、ロールバックを開始しようとしますが、トランザクションは完了するまで続行されます。周期的リカバリーはロールバックの開始に失敗し、ロールバックの失敗がサーバーログに記録されます。この問題の根本的な原因は、今後のリリースで修正される予定ですが、現時点では回避方法を使用できます。を設定して、リカバリプロセスの 2 つのフェーズ間の間隔を増やします。com.arjuna.ats.jta.orphanSafetyIntervalプロパティーをデフォルト値の 10000 ミリ秒よりも高い値に設定します。40000 ミリ秒の値が推奨されます。これで問題が解決するわけではなく、発生する可能性が低くなり、警告メッセージがログに表示されることに注意してください。
第13章 Hibernate リンクのコピーリンクがクリップボードにコピーされました!
13.1. Hibernate Core リンクのコピーリンクがクリップボードにコピーされました!
13.2. Java 永続 API (JPA) リンクのコピーリンクがクリップボードにコピーされました!
13.2.1. JPA について リンクのコピーリンクがクリップボードにコピーされました!
bean-validation、greeter、および kitchensink クイックスタートを参照してください。「クイックスタートにアクセスする」。
13.2.2. Hibernate EntityManager リンクのコピーリンクがクリップボードにコピーされました!
13.2.3. はじめに リンクのコピーリンクがクリップボードにコピーされました!
13.2.3.1. Red Hat JBossDeveloperStudio で JPA プロジェクトを作成します リンクのコピーリンクがクリップボードにコピーされました!
概要
この例では、Red Hat JBossDeveloperStudio で JPA プロジェクトを作成するために必要な手順について説明します。
手順13.1 Red Hat JBossDeveloperStudio で JPA プロジェクトを作成します
- Red Hat JBoss Developer Studio ウィンドウ + → をクリックします。リストで JPA を見つけ、展開し、JPA Project を選択します。以下のダイアログが表示されます。
- プロジェクト名を入力します。
- Target runtime を選択します。使用可能なターゲットランタイムがない場合は、次の手順に従って新しいサーバーとランタイムを定義します。「Define New Server を使用して JBossEAP サーバーを追加します」。
- JPA version (JPA バージョン) で 2.1 が選択されていることを確認します。
- Configuration (設定) で Basic JPA Configuration (基本的な JPA 設定) を選択します。
- をクリックします。
- 要求されたら、このタイプのプロジェクトを JPA パースペクティブウインドウに関連付けるかどうかを選択します。
13.2.3.2. Red Hat JBossDeveloperStudio で永続性設定ファイルを作成します リンクのコピーリンクがクリップボードにコピーされました!
概要
このトピックでは、Red Hat JBossDeveloperStudio を使用して Java プロジェクトで persistence.xml ファイルを作成するプロセスについて説明します。
手順13.2 新しい永続性設定ファイルを作成および設定します。
- Red Hat JBossDeveloperStudio で EJB3.x プロジェクトを開きます。
- Project Explorer (プロジェクトエクスプローラー) パネルでプロジェクトルートディレクトリーを右クリックします。
- → を選択します。
- XML フォルダーから XML File (XML ファイル) を選択し、 をクリックします。
- 親ディレクトリーとして
ejbModule/META-INFフォルダーを選択します。 - ファイルの名前を
persistence.xmlと指定し、 をクリックします。 - Create XML file from an XML schema file (XML スキーマファイルから XML ファイルを作成) を選択し、 をクリックします。
- Select XML Catalog entry (XML カタログエントリーを選択) リストから http://java.sun.com/xml/ns/persistence/persistence_2.0.xsd を選択し、 をクリックします。
- をクリックしてファイルを作成します。
- 結果:
13.2.3.3. 例: 永続設定ファイル リンクのコピーリンクがクリップボードにコピーされました!
例13.1 persistence.xml
13.2.3.4. Red Hat JBossDeveloperStudio で Hibernate 設定ファイルを作成します リンクのコピーリンクがクリップボードにコピーされました!
概要
このトピックでは、Red Hat JBossDeveloperStudio を使用して Java プロジェクトで hibernate.cfg.xml ファイルを作成するプロセスについて説明します。
手順13.3 新しい Hibernate 設定ファイルを作成する
- Red Hat JBossDeveloperStudio で Java プロジェクトを開きます。
- Project Explorer (プロジェクトエクスプローラー) パネルでプロジェクトルートディレクトリーを右クリックします。
- → を選択します。
- Hibernate フォルダーから Hibernate 設定ファイル を選択し、 をクリックします。
src/ディレクトリーを選択し、 をクリックします。- 以下を設定します。
- セッションファクトリー名
- データベース方言
- Driver class
- 接続 URL
- ユーザ名
- パスワード
- をクリックしてファイルを作成します。
- 結果:
13.2.3.5. Hibernate 設定ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
例13.2 hibernate.cfg.xml
13.2.4. 設定 リンクのコピーリンクがクリップボードにコピーされました!
13.2.4.1. Hibernate 設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | Description |
|---|---|
| hibernate.dialect |
Hibernate
org.hibernate. metaect.Dialect のクラス名。Hibernate が特定の関係データベース向けに最適化された SQL を生成できるようにします。
ほとんどの場合、Hibernate は JDBC ドライバーによって返される
JDBC metadata に基づいて適切な org.hibernate. metaect.Dialect 実装を選択できます。
|
| hibernate.show_sql |
ブール値。すべての SQL ステートメントをコンソールに書き込みます。これは、ログカテゴリー
org.hibernate.SQL を debug に設定する代わりになります。
|
| hibernate.format_sql |
ブール値。pretty print で、ログとコンソールに SQL を出力します。
|
| hibernate.default_schema |
生成された SQL で指定のスキーマ/テーブルスペースを持つ修飾されていないテーブル名。
|
| hibernate.default_catalog |
生成された SQL で指定のカタログと修飾されていないテーブル名を修飾します。
|
| hibernate.session_factory_name |
その
org.hibernate.SessionFactory 作成後、JNDI でこの名前に自動的にバインドされます。たとえば、jndi/composite/name です。
|
| hibernate.max_fetch_depth |
単独の関連 (one-to-one、many-to-one) の外部結合フェッチツリーの最大深さを設定します。
0 は、デフォルトの外部ジョインフェッチを無効にします。推奨の値は 0 から 3 の間です。
|
| hibernate.default_batch_fetch_size |
関連付けの Hibernate バッチフェッチのデフォルトサイズを設定します。推奨される値は
4、8、16です。
|
| hibernate.default_entity_mode |
この
SessionFactoryか ら開かれたすべてのセッションに対するエンティティー表現のデフォルトモードを設定します。値には dynamic-map、dom4j、pojo が含まれます。
|
| hibernate.order_updates |
ブール値。Hibernate は、更新する製品のプライマリーキーの値で SQL 更新の順序を強制します。これにより、非常に同時になるシステムでは、トランザクションのデッドロックが少なくなります。
|
| hibernate.generate_statistics |
ブール値。有効にすると、Hibernate はパフォーマンスチューニングに役立つ統計を収集します。
|
| hibernate.use_identifier_rollback |
ブール値。有効な場合、オブジェクトが削除されると、生成された識別子プロパティーがデフォルト値にリセットされます。
|
| hibernate.use_sql_comments |
ブール値。有効にすると、Hibernate はデバッグを容易にするため、SQL 内でコメントを生成します。デフォルト値は
false です。
|
| hibernate.id.new_generator_mappings |
ブール値。
@GeneratedValue を使用する場合、このプロパティーには関係があります。これは、新しい IdentifierGenerator 実装が javax.persistence.GenerationType.AUTO、javax.persistence.GenerationType.TABLE および javax.persistence.GenerationType.SEQUENCE に使用されるかどうかを示します。デフォルト値は true です。
|
| hibernate.ejb.naming_strategy |
を選択します
org.hibernate.cfg.NamingStrategyHibernateEntityManager を使用する場合の実装。このクラスは非推奨であり、このプロパティーは下位互換性のためにのみ提供されています。このプロパティーは、と一緒に使用しないでくださいhibernate.ejb.naming_strategy_delegator。
アプリケーションが EntityManager を使用しない場合は、以下の手順に従って NamingStrategy: Hibernate Reference Documentation - Implementing a Naming Strategy を設定します。
|
| hibernate.ejb.naming_strategy_delegator |
指定します
org.hibernate.cfg.naming.NamingStrategyDelegatorHibernateEntityManager を使用する場合のデータベースオブジェクトとスキーマ要素の実装。このプロパティーには、次の可能な値があります。
注記
このプロパティーは、と一緒に使用しないでください hibernate.ejb.naming_strategy。の一時的な代替品ですorg.hibernate.cfg.NamingStrategyその制限に対処するため。両方を置き換える Hibernate5.0 のより包括的なソリューションが計画されていますorg.hibernate.cfg.NamingStrategyとorg.hibernate.cfg.naming.NamingStrategyDelegator。
アプリケーションが EntityManager を使用しない場合は、以下の手順に従って NamingStrategy: Hibernate Reference Documentation - Implementing a Naming Strategy を設定します。
|
hibernate.id.new_generator_mappings の場合、新しいアプリケーションでは、デフォルト値である true のままにしてください。Hibernate 3.3.x を使用した既存のアプリケーションは、シーケンスオブジェクトまたはテーブルベースのジェネレーターを使用し、後方互換性を維持するために false に変更する必要がある場合があります。
13.2.4.2. Hibernate JDBC および接続プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | Description |
|---|---|
| hibernate.jdbc.fetch_size |
JDBC フェッチサイズを決定するゼロ以外の値 (
Statement.setFetchSize()を呼び出します)。
|
| hibernate.jdbc.batch_size |
ゼロ以外の値は、Hibernate による JDBC2 バッチ更新の使用を有効にします。推奨される値は
5 から 30 の間です。
|
| hibernate.jdbc.batch_versioned_data |
ブール値。JDBC ドライバーが
executeBatch() から正しい行数を返す場合は、このプロパティーを true に設定します。その後、Hibernate は、自動的にバージョン付けされたデータにバッチ処理を使用します。デフォルト値は false です。
|
| hibernate.jdbc.factory_class |
カスタムを選択
org.hibernate.jdbc.Batcher.ほとんどのアプリケーションでは、この設定プロパティーは必要ありません。
|
| hibernate.jdbc.use_scrollable_resultset |
ブール値。Hibernate による JDBC2 のスクロール可能な結果セットの使用を有効にします。このプロパティーは、ユーザー指定の JDBC 接続を使用する場合にのみ必要です。Hibernate は接続メタデータを使用します。
|
| hibernate.jdbc.use_streams_for_binary |
ブール値。これはシステムレベルのプロパティーです。
binary または serializable を JDBC に書き込む際や、JDBC から読み込む際には、ストリームを使用します。
|
| hibernate.jdbc.use_get_generated_keys |
ブール値。JDBC3 の
PreparedStatement.getGeneratedKeys() を使用して、挿入後にネイティブに生成されたキーを取得できます。JDBC3+ ドライバーおよび JRE1.4+ が必要です。JDBC ドライバーに、Hibernate 識別子ジェネレーターの問題がある場合は false に設定します。デフォルトでは、接続メタデータを使用してドライバー機能を判断しようとします。
|
| hibernate.connection.provider_class |
カスタムのクラス名
org.hibernate.connection.ConnectionProvider これは、Hibernate への JDBC 接続を提供します。
|
| hibernate.connection.isolation |
JDBC トランザクション分離レベルを設定します。Check
java.sql.Connection ただし、ほとんどのデータベースはすべての分離レベルをサポートしているわけではなく、一部のデータベースは追加の非標準分離を定義していることに注意してください。標準値は 1、2、4、8 です。
|
| hibernate.connection.autocommit |
ブール値。このプロパティーの使用は推奨されません。JDBC プールされた接続の自動コミットを有効にします。
|
| hibernate.connection.release_mode |
Hibernate が JDBC 接続を解放するタイミングを指定します。デフォルトでは、明示的にセッションが閉じられるか、または切断されるまで JDBC 接続が保持されます。デフォルト値
auto は JTA および CMT トランザクションストラテジーに after_statement を選択し、JDBC トランザクションストラテジーに after_transaction を選択します。
使用可能な値は
auto (デフォルト)、on_close、after_transaction、after_statement です。
この設定は、
SessionFactory.openSession によって返される Session にのみ影響します。SessionFactory.getCurrentSession から取得した Session の場合、使用するために設定された CurrentSessionContext 実装はその Session の接続リリースモードを制御します。
|
| hibernate.connection.<propertyName> |
JDBC プロパティーを <propertyName> から
DriverManager.getConnection() に渡します。
|
| hibernate.jndi.<propertyName> |
<propertyName> プロパティーを
InitialContextFactory に渡します。
|
13.2.4.3. Hibernate キャッシュプロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
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="..") は、このデフォルトを上書きするのに使用されます。
|
13.2.4.4. Hibernate トランザクションプロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
hibernate.transaction.factory_class |
Hibernate
Transaction API で使用するための TransactionFactory のクラス名。デフォルトは JDBCTransactionFactory
|
jta.UserTransaction |
アプリケーションサーバーから JTA
UserTransaction を取得するために JTATransactionFactory によって使用される JNDI 名。
|
hibernate.transaction.manager_lookup_class | TransactionManagerLookup のクラス名。これは、JVM レベルキャッシングが有効な場合や、JTA 環境で hilo ジェネレーターを使用する場合に必要です。
|
hibernate.transaction.flush_before_completion |
ブール値。有効にすると、トランザクションの完了前のフェーズでセッションが自動的にフラッシュされます。組み込みおよび自動セッションコンテキスト管理が推奨されます。
|
hibernate.transaction.auto_close_session |
ブール値。有効にすると、トランザクションの完了フェーズ中にセッションが自動的に閉じられます。組み込みおよび自動セッションコンテキスト管理が推奨されます。
|
13.2.4.5. その他の Hibernate プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
hibernate.current_session_context_class |
「現在」の
Session セッションのスコープ設定にカスタムストラテジーを指定します。値には、jta、thread、managed、custom.Class が含まれます。
|
hibernate.query.factory_class |
HQL パーサー実装 (
org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory または org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory) を選択します。
|
hibernate.query.substitutions |
Hibernate クエリーのトークンから SQL トークン (トークンは関数またはリテラル名) にマップするために使用されます。たとえば、
hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC。
|
hibernate.hbm2ddl.auto | SessionFactory の作成時にスキーマをデータベースに自動的に検証またはエクスポートします。Create-drop で SessionFactory を明示的に閉じると、データベーススキーマがドロップされます。プロパティー値のオプションはvalidate、update、create、create-drop です。
|
hibernate.hbm2ddl.import_files | SessionFactory の作成時に実行される SQL Mission ステートメントが含まれるオプションのファイルのコンマ区切りの名前です。これは、テストまたはデモンストレーションに役立ちます。たとえば、AIA ステートメントを追加すると、デプロイ時にデータベースが最小限のデータセットでデータが投入されます。値の例は /humans.sql,/dogs.sql です。
ファイルの順序は重要です。以下のファイルのステートメントの前に特定ファイルのステートメントが実行されるためです。これらのステートメントは、たとえば
hibernate.hbm2ddl.auto がcreate or create-drop に設定されている場合にのみ実行されます。
|
hibernate.hbm2ddl.import_files_sql_extractor |
カスタムのクラス名
ImportSqlCommandExtractor.デフォルトは、ビルトインの SingleLineSqlCommandExtractor です。これは、各インポートファイルから単一の SQL ステートメントを抽出する専用パーサーを実装する際に便利です。Hibernate は、複数の行 (各ステートメントの最後で必須のセミコロン) に散在する命令/コメントおよび引用符で囲まれた文字列をサポートする、複数の MultipleLinesSqlCommandExtractor も提供します。
|
hibernate.bytecode.use_reflection_optimizer |
ブール値。これはシステムレベルのプロパティーで、
hibernate.cfg.xml ファイルで設定することはできません。ランタイムの反映の代わりにバイトコード操作の使用を有効にします。リフレクションはトラブルシューティング時に役に立つことがあります。Hibernate には常に cglib または javassist のいずれかが必要です。
|
hibernate.bytecode.provider |
javassist または cglib は、バイト操作エンジンとして使用できます。デフォルトは
javassist です。プロパティー値は javassist または cglib のいずれかです
|
13.2.4.6. HibernateSQL ダイアレクト リンクのコピーリンクがクリップボードにコピーされました!
hibernate.dialect プロパティーは、アプリケーションデータベースの適切な org.hibernate. denialect.Dialect サブクラスに設定する必要があります。ダイアレクトが指定されている場合、Hibernate は他のプロパティーの一部に対して適切なデフォルトを使用します。これは、手動で指定する必要がないことを意味します。
| RDBMS | ダイアレクト |
|---|---|
| DB2 | org.hibernate.dialect.DB2Dialect |
| DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
| DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
| Adobird | org.hibernate.dialect.FirebirdDialect |
| FrontBase | org.hibernate.dialect.FrontbaseDialect |
| H2 Database | org.hibernate.dialect.H2Dialect |
| HypersonicSQL | org.hibernate.dialect.HSQLDialect |
| Informix | org.hibernate.dialect.InformixDialect |
| Ingres | org.hibernate.dialect.IngresDialect |
| Interbase | org.hibernate.dialect.InterbaseDialect |
| Mckoi SQL | org.hibernate.dialect.MckoiDialect |
| Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
| Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
| Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
| Microsoft SQL Server 2012 | org.hibernate.dialect.SQLServer2008Dialect |
| MySQL5 | org.hibernate.dialect.MySQL5Dialect |
| InnoDB を使用した MySQL5 | org.hibernate.dialect.MySQL5InnoDBDialect |
| MyISAM を使用した MySQL | org.hibernate.dialect.MySQLMyISAMDialect |
| Oracle (すべてのバージョン) | org.hibernate.dialect.OracleDialect |
| Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
| Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
| Oracle 11g | org.hibernate.dialect.Oracle10gDialect |
| Pointbase | org.hibernate.dialect.PointbaseDialect |
| PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
| PostgreSQL 9.2 | org.hibernate.dialect.PostgreSQL82Dialect |
| Postgres Plus Advanced Server | org.hibernate.dialect.PostgresPlusDialect |
| Progress | org.hibernate.dialect.ProgressDialect |
| SAP DB | org.hibernate.dialect.SAPDBDialect |
| Sybase | org.hibernate.dialect.SybaseASE15Dialect |
| Sybase 15.7 | org.hibernate.dialect.SybaseASE157Dialect |
| Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
13.2.5. 2 次キャッシュ リンクのコピーリンクがクリップボードにコピーされました!
13.2.5.1. 2 次キャッシュ リンクのコピーリンクがクリップボードにコピーされました!
- Web セッションのクラスタリング
- ステートフルセッション Bean のクラスタリング
- SSO クラスタリング
- Hibernate 2 次キャッシュ
13.2.5.2. Hibernate の 2 次キャッシュの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順13.4 hibernate.cfg.xml ファイルを作成および編集します
hibernate.cfg.xml ファイルを作成します
デプロイメントのクラスパスにhibernate.cfg.xmlを作成します。詳細については、を参照してください。「Red Hat JBossDeveloperStudio で Hibernate 設定ファイルを作成します」。- これらの XML 行をアプリケーションの
hibernate.cfg.xmlファイルに追加します。XML は <session-factory> タグ内にある必要があります。<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property>Copy to Clipboard Copied! Toggle word wrap Toggle overflow hibernate.cfg.xmlファイルの <session-factory> セクションに次のいずれかを追加します。Infinispan CacheManager が JNDI にバインドされている場合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Infinispan CacheManager がスタンドアロンの場合:
<property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.InfinispanRegionFactory </property><property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.InfinispanRegionFactory </property>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
Infinispan は、Hibernate の第 2 レベルのキャッシュとして設定されます。
13.3. Hibernate アノテーション リンクのコピーリンクがクリップボードにコピーされました!
13.3.1. Hibernate アノテーション リンクのコピーリンクがクリップボードにコピーされました!
| Annotation | Description |
|---|---|
| AccessType | プロパティーアクセスタイプ。 |
| すべて | 複数のエンティティータイプを参照するトール関連付けを定義します。一致したエンティティータイプのマッチングは、メタデータの識別子コラムを使用して行われます。このようなマッピングはマージのみにする必要があります。 |
| AnyMetaDef | @Any および @ManyToAny メタデータを定義します。 |
| AnyMedaDefs | @Any および @ManyToAny のメタデータセットを定義します。エンティティーレベルまたはパッケージレベルで定義できます。 |
| BatchSize | SQL 読み込みのバッチサイズ。 |
| Cache | キャッシュストラテジーをルートエンティティーまたはコレクションに追加します。 |
| Cascade | 関連付けにカスケードストラテジーを適用します。 |
| Check | クラス、プロパティー、またはコレクションレベルで定義できる任意の SQL チェック制約。 |
| Columns | 列のアレイをサポートします。コンポーネントのユーザータイプマッピングに便利です。 |
| ColumnTransformer | 値をコラムから読み取り、コラムに書き込むために使用するカスタムの SQL 式。クエリーとともにオブジェクトの直接読み込み/保存に使用します。書き込み式には、値に対して 1 つの '?' プレースホルダーが必ず含まれている必要があります。 |
| ColumnTransformers | @ColumnTransformer の複数のアノテーション複数のコラムがこの動作を使用している場合に便利です。 |
| DiscriminatorFormula | ルートエンティティーに配置されるイデンティターの式。 |
| DiscriminatorOptions | Hibernate 固有の識別子プロパティーを表示するオプションのアノテーションです。 |
| エンティティー | Hibernate 機能でエンティティーを拡張します。 |
| Fetch | 指定の関連付けに使用されるフェッチストラテジーを定義します。 |
| FetchProfile | フェッチストラテジープロファイルを定義します。 |
| FetchProfiles | @FetchProfile の複数形のアノテーション。 |
| フィルター | フィルターをエンティティーまたはコレクションのターゲットエンティティーに追加します。 |
| FilterDef | フィルター定義。 |
| FilterDefs | フィルター定義の配列。 |
| FilterJoinTable | フィルターを結合テーブルコレクションに追加します。 |
| FilterJoinTables | 複数の @FilterJoinTable をコレクションに追加します。 |
| フィルター | 複数の @Filter を追加します。 |
| Formula | 大半の場所で、@Column の代わりとして使用するために使用されます。式は有効な SQL フラグメントである必要があります。 |
| Generated | このアノテーション付きプロパティーはデータベースによって生成されます。 |
| GenericGenerator | タイプ解除された方法で、あらゆる Hibernate generator を記述するジェネレーターアノテーション。 |
| GenericGenerators | 汎用ジェネレーター定義のアレイ。 |
| Immutable |
エンティティーまたはコレクションにイミュータブルとしてマークを付けます。アノテーションがないということは、要素が変更されたことを意味します。
イミュータブルなエンティティーはアプリケーションによって更新されない可能性があります。イミュータブルなエンティティーの更新は無視されますが、例外は発生しません。
@Immutable をコレクションに配置すると、コレクションがイミュータブルな状態になり、コレクションへの追加および削除は許可されません。この場合、HibernateException が発生します。
|
| Index | データベースインデックスを定義します。 |
| JoinFormula | 大半の場所で、@JoinColumn の代わりとして使用するために使用されます。式は有効な SQL フラグメントである必要があります。 |
| LazyCollection | コレクションのレイジーステータスを定義します。 |
| LazyToOne | ToOne 関連づけのレイジーステータスを定義します (OneToOne または ManyToOne)。 |
| Loader | Hibernate デフォルトの FIND メソッドを上書きします。 |
| ManyToAny | 異なるエンティティータイプを参照する ToMany 関連付けを定義します。一致したエンティティータイプのマッチングは、メタデータの識別子コラムを使用して行われます。このようなマッピングはマージのみにする必要があります。 |
| MapKeyType | 永続マップのキーのタイプを定義します。 |
| MetaValue | 特定のエンティティータイプに関連付けられた識別子の値を表します。 |
| NamedNativeQueries | NamedNativeQueries を拡張して、Hibernate NamedNativeQuery オブジェクトを保持します。 |
| NamedNativeQuery | Hibernate 機能を使用した NamedNativeQuery の拡張 |
| NamedQueries | NamedQuery を拡張して Hibernate NamedQuery オブジェクトを保持します。 |
| NamedQuery | Hibernate 機能を使用して NamedQuery を拡張します。 |
| NaturalId | プロパティーがエンティティーの純粋な ID の一部であることを指定します。 |
| NotFound | 要素が関連上に見つからない場合に行うアクション。 |
| OnDelete | コレクション、アレイ、および結合されたサブクラスの削除で使用するストラテジー。現在、セカンダリーテーブルの OnDelete はサポートされていません。 |
| OptimisticLock | アノテーションが付けられたプロパティーの変更によってエンティティーバージョンの増分がトリガーされるかどうか。アノテーションが存在しない場合は、プロパティーが楽観的ロックストラテジーに関与します (デフォルト)。 |
| OptimisticLocking | エンティティーに適用される楽観的ロックのスタイルを定義するために使用されます。階層では、ルートエンティティーでのみ有効です。 |
| OrderBy | SQL 順序付け (HQL の順序ではなく) を使用してコレクションを順序付けます。 |
| ParamDef | パラメーター定義。 |
| パラメーター | キー/値のパターン。 |
| Parent | プロパティーを所有者 (通常は所有するエンティティー) へのポインターとして参照します。 |
| Persister | カスタム永続機能を指定します。 |
| Polymorphism | ポリモーフィズム Hibernate のタイプを定義するために使用されます。 |
| Proxy | 特定のクラスのレイジーおよびプロキシー設定。 |
| RowId | Hibernate の ROWID マッピング機能のサポート。 |
| Sort | コレクションのソート (Java レベルのソート)。 |
| Source | Version および timestamp version プロパティーと併せてのオプションのアノテーションです。アノテーションの値で、タイムスタンプの生成先が決まります。 |
| SQLDelete | Hibernate デフォルトの DELETE メソッドを上書きします。 |
| SQLDeleteAll | Hibernate のデフォルト DELETE ALL メソッドを上書きします。 |
| SQLInsert | Hibernate のデフォルト INSERT INTO メソッドを上書きします。 |
| SQLUpdate | Hibernate デフォルトの UPDATE メソッドを上書きします。 |
| Subselect | イミュータブルで読み取り専用のエンティティーを指定の SQL サブ選択式にマッピングします。 |
| Synchronization | 自動フラッシュが正しく実行され、派生エンティティーに対するクエリーが古いデータを返さないようにします。大半は Subselect とともに使用されます。 |
| テーブル | プライマリーまたはセカンダリーのテーブルに情報を補完します。 |
| Tables | Table の複数形のアノテーション。 |
| Target | 明示的なターゲットを定義し、反映および汎用的な解決を回避します。 |
| Tuplizer | エンティティーまたはコンポーネントの tuplizer を定義します。 |
| Tuplizers | エンティティーまたはコンポーネントの一連の tuplizer を定義します。 |
| タイプ | Hibernate タイプ。 |
| TypeDef | Hibernate タイプ定義。 |
| TypeDefs | Hibernate タイプ定義の配列。 |
| Where | コレクションのエンティティーまたはターゲットエンティティーに追加する要素。レシピは SQL で記述されます。 |
| WhereJoinTable | コレクションジョインテーブルに追加する部分。レシピは SQL で記述されます。 |
13.4. Hibernate Query 言語 リンクのコピーリンクがクリップボードにコピーされました!
13.4.1. Hibernate Query 言語について リンクのコピーリンクがクリップボードにコピーされました!
13.4.2. HQL ステートメント リンクのコピーリンクがクリップボードにコピーされました!
SELECT、UPDATE、DELETE、および INSERT ステートメントを使用できます。HQL INSERT ステートメントには、JPQL に相当するものはありません。
UPDATE または DELETE ステートメントがいつ実行されるかについては注意が必要です。
| ステートメント | Description |
|---|---|
SELECT |
HQL における
SELECT ステートメントの BNF は以下のとおりです。
最も単純な
HQLSELECT ステートメントの形式は次のとおりです。
from com.acme.Cat
|
UDPATE | HQL の UPDATE ステートメントの BNF は JPQL と同じです。 |
DELETE | HQL の DELETE ステートメントの BNF は JPQL と同じです。 |
13.4.3. INSERT ステートメントについて リンクのコピーリンクがクリップボードにコピーされました!
INSERT ステートメントを定義する機能を追加します。これと同等の JPQL はありません。HQLINSERT ステートメントの BNF は次のとおりです。
insert_statement ::= insert_clause select_statement insert_clause ::= INSERT INTO entity_name (attribute_list) attribute_list ::= state_field[, state_field ]*
insert_statement ::= insert_clause select_statement
insert_clause ::= INSERT INTO entity_name (attribute_list)
attribute_list ::= state_field[, state_field ]*
tribute_list は、SQL INSERT ステートメントの column specification に似ています。マッピングされた継承に関連するエンティティーでは、名前付きエンティティーに直接定義された属性のみが attribute_list で使用できます。スーパークラスプロパティーは許可されておらず、サブクラスプロパティーは意味を成しません。つまり、INSERT ステートメントは本質的にはポリモーフィックではありません。
select_statement には、有効な HQL 選択クエリーを使用できます。この場合、戻り値のタイプは挿入で想定されるタイプと一致する必要があります。現在、これは、チェックによるデータベースへの再参照を許可するのではなく、クエリーのコンパイル時に確認されます。これにより、equal ではなく equivalent である Hibernate タイプ間で問題が発生する可能性があります。たとえば、これは org.hibernate.type.DateType としてマップされた属性と org.hibernate.type.TimestampType として定義された属性の間でミスマッチの問題を引き起こす可能性があります。
id 属性には、insert ステートメントに 2 つのオプションを付与します。attribute_list で id プロパティーを明示的に指定することができます。この場合、その値は、対応する select 式から取得されるか、または生成された値が使用される場合は attribute_list から省略されます。後者のオプションは、データベースで (in the database) で動作する ID ジェネレーターを使用している場合にのみ利用できます。メモリー内 (in memory) タイプジェネレーターでこのオプションを使用しようとすると、解析中に例外が発生します。
attribute_list に属性を指定できます。この場合、その値は対応する select 式から取得されます。あるいは、attribute_list から除外できます。その場合は、対応する select 式によって定義される seed value が使用されます。 org.hibernate.type.VersionType 使用されている。
例13.3 INSERT クエリーステートメント
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..."; int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
13.4.4. FROM 句について リンクのコピーリンクがクリップボードにコピーされました!
FROM 句は、残りのクエリーで使用できるオブジェクトモデルタイプのスコープを定義します。また、残りのクエリーで使用できるすべての識別変数も定義します。
13.4.5. WITH 句について リンクのコピーリンクがクリップボードにコピーされました!
WITH 句を定義します。これは HQL に固有です。JPQL はこの機能を定義していません。
例13.4 条項 付き
select distinct c
from Customer c
left join c.orders o
with o.value > 5000.00
select distinct c
from Customer c
left join c.orders o
with o.value > 5000.00
with 句 の条件が生成された SQL の on 句の 一部になり、HQL/JPQL 条件が生成された SQL。この特定の例の違いは、おそらくそれほど重要ではありません。より複雑なクエリーでは 、with 句 が必要になる場合があります。
13.4.6. 一括更新、挿入、削除について リンクのコピーリンクがクリップボードにコピーされました!
FROM キーワードおよび WHERE Clause はオプションです。
例13.5 一括更新ステートメント
例13.6 一括削除ステートメント
int 値は、オペレーションの影響を受けた、データベース内のエンティティーの数を示します。
oldName という名前の企業用の Company テーブルだけでなく、結合したテーブルに対しても削除が実行されます。したがって、社員テーブルと双方向の多対多リレーションシップを持つ会社テーブルでは、前述の例の実行が成功すると、対応する結合テーブル Company_Employee から 行が失われることになります。
int deletedEntries 値には、この操作によって影響を受けるすべての行の数 (結合テーブルの行を含む) が含まれます。
例13.7 一括挿入ステートメント
id 属性の値を指定しない場合、基礎となるデータベースが自動生成キーをサポートする限り、識別子が生成されます。この一括挿入操作の戻り値は、データベースで実際に作成されたエントリー数です。
13.4.7. コレクションメンバーの参照について リンクのコピーリンクがクリップボードにコピーされました!
例13.8 コレクションの参照
o は実際には、Customer#orders 関連付けの要素タイプであるオブジェクトモデルタイプ Order を参照します。
IN 構文を使用してコレクションの関連付けジョインを指定する代替構文も示しています。両方の形式は同じです。アプリケーションの選択を選択するのは、単に好みの問題です。
13.4.8. 修飾パス式について リンクのコピーリンクがクリップボードにコピーされました!
| 式 | Description |
|---|---|
VALUE |
コレクション値を参照します。修飾子を指定しないのと同じです。意図を明示的に表示するのに役立ちます。いずれかのタイプのコレクションと値の参照に有効です。
|
INDEX |
HQL ルールによると、これはマップとリストの両方で有効です。
javax.persistence.OrderColumn マップキーまたはリスト位置 (別名 OrderColumn 値) を参照するための注釈。ただし、JPQL はこれを List ケースで使用するために予約し、MAP ケースに KEY を追加します。JPA プロバイダーの移植性に関心のあるアプリケーションは、この区別を認識する必要があります。
|
KEY |
Maps にのみ有効です。マップのキーを参照します。キー自体がエンティティーである場合は、さらに移動することができます。
|
ENTRY |
Maps にのみ有効です。マップの論理を参照します
java.util.Map.Entry タプル (キーと値の組み合わせ)。ENTRY はターミナルパスとしてのみ有効で、選択でのみ有効です。
|
例13.9 適格なコレクションの参照
13.4.9. スカラー関数について リンクのコピーリンクがクリップボードにコピーされました!
13.4.10. HQL の標準化機能 リンクのコピーリンクがクリップボードにコピーされました!
| 関数 | 説明 |
|---|---|
BIT_LENGTH |
バイナリーデータの長さを返します。
|
CAST |
SQL キャストを実行します。cast ターゲットは、使用する Hibernate マッピングタイプに名前を付ける必要があります。
|
EXTRACT |
Datetime 値に対して SQL の抽出を実行します。抽出により、日時の一部 (たとえば、年) が抽出されます。以下の省略形式を参照してください。
|
SECOND |
2 つ目を抽出するための省略された抽出形式。
|
MINUTE |
分を抽出するための省略された抽出形式。
|
HOUR |
時を抽出するための省略された抽出形式。
|
DAY |
日を抽出するための省略された抽出形式。
|
MONTH |
月を抽出するための省略された抽出形式。
|
YEAR |
年を抽出するための省略された抽出形式。
|
STR |
値を文字データとしてキャストするための省略形式。
|
addSqlFunctionorg.hibernate.cfg.Configuration のメソッド
13.4.11. 連結操作 リンクのコピーリンクがクリップボードにコピーされました!
CONCAT) 関数のサポートのほかに連結演算子を定義します。これは JPQL では定義されないため、移植可能なアプリケーションは使用しないでください。連結演算子は、SQL 連結演算子 (||) から取得されます。
例13.10 連結操作例
select 'Mr. ' || c.name.first || ' ' || c.name.last from Customer c where c.gender = Gender.MALE
select 'Mr. ' || c.name.first || ' ' || c.name.last
from Customer c
where c.gender = Gender.MALE
13.4.12. 動的インスタンス化について リンクのコピーリンクがクリップボードにコピーされました!
例13.11 動的インスタンス化の例 - コンストラクター
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
例13.12 動的インスタンス化の例 - リスト
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
例13.13 動的インスタンス化の例 - マップ
13.4.13. HQL 述語について リンクのコピーリンクがクリップボードにコピーされました!
TRUE または FALSE に解決されます。ただし、NULL が関係するブール値比較は一般的に UNKNOWN に解決します。
HQL の述語
- ヌルネス述語
- null の値を確認してください。基本的な属性参照、エンティティーの参照、およびパラメーターに適用できます。さらに HQL を使用すると、コンポーネント/ 組み込み可能なタイプに適用できます。
例13.14 ヌルネスチェックの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 述語と同様
- 文字列値に対して、同様の比較を実行します。構文は以下のとおりです。
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]Copy to Clipboard Copied! Toggle word wrap Toggle overflow セマンティクスは、式のような SQL のことに従います。paattern_valueは、string_expressionで一致を試みるパターンです。SQL と同様に、pattern_valueでは _ と % をワイルドカードとして使用できます。意味は同じです。_ は任意の 1 文字に一致します。% は任意の数の文字に一致します。オプションのescape_characterは、pattern_valueの _ と % の特別な意味をエスケープするために使用されるエスケープ文字を指定するために使用されます。これは、_ または % のいずれかを含むパターンを検索する必要がある場合に便利です。例13.15 述語の例のように
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - BETWEEN 演算子
- SQL
BETWEEN式と同様です。値が 2 つの他の値の範囲内にあるかどうかの評価を実行します。すべてのオペランドは、同等の型を持つ必要があります。例13.16 述語の例の間
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.4.14. 関連比較について リンクのコピーリンクがクリップボードにコピーされました!
例13.17 関係比較の例
ALL、ANY、SOME などの修飾子を含めることもできます。some および ANY は同義語です。
ALL 修飾子は、サブくエリーの結果のすべての値に対して比較が true の場合に true に解決します。これは、値が空の場合は false に解決します。
例13.18 ALL サブクエリー比較修飾子の例
ANY/SOME 修飾子は、サブクエリーの結果の値のいずれかの比較が true の場合に true に解決します。これは、値が空の場合は false に解決します。
13.4.15. IN 述語について リンクのコピーリンクがクリップボードにコピーされました!
IN 述語は、特定の値が値の一覧にあることを確認します。構文は次のとおりです。
single_valued_expression のタイプと single_valued_list の個別の値は一致している必要があります。JPQL は、有効なタイプを文字列、数値、日付、時間、タイムスタンプ、および列挙タイプに制限します。JPQL では、single_valued_expression は以下のみを参照できます。
- 「状態フィールド」(state fields) は、単純な属性の用語です。具体的には、関連付けおよびコンポーネント/組み込み属性が除外されます。
- エンティティー型式。
single_valued_expression はより幅広い式タイプを参照することができます。1 価の関連づけが許可されています。コンポーネント/組み込み属性も同様です。ただし、この機能は基盤のデータベースのタプルのサポートレベルまたは「ロー値のコンストラクター構文」 (row value constructor syntax) によって異なります。さらに、HQL では値のタイプは制限されませんが、アプリケーション開発者は、基盤のデータベースベンダーに基づいてサポートが制限される可能性があることに注意する必要があります。これは、通常 JPQL の制限のためです。
constructor_expression およびcollection_valued_input_parameter では、値の一覧は空にすることはできません。少なくとも 1 つの値が含まれている必要があります。
例13.19 述語の例では
13.4.16. HQL の順序について リンクのコピーリンクがクリップボードにコピーされました!
ORDER BY は、結果の順序付けに使用される選択した値を指定するために使用されます。順序単位で有効とみなされる式のタイプには、以下が含まれます。
- ステートフィールド
- コンポーネント/組み込み可能な属性
- 算術演算、関数などのスカラー式。
- 前の式タイプに対して select 句で宣言された識別変数。
ASC (昇順) または DESC (下記) で修飾できます。
例13.20 注文例
13.5. Hibernate サービス リンクのコピーリンクがクリップボードにコピーされました!
13.5.1. Hibernate サービスについて リンクのコピーリンクがクリップボードにコピーされました!
13.5.2. サービス契約について リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.service.Service のマーカーインターフェースを実装することです。Hibernate は、基本的なタイプの安全のためにこの内部で使用します。
org.hibernate.service.spi.Startable および org.hibernate.service.spi.Stoppable インターフェースを実装し、開始および停止の通知を受信することもできます。別のオプションのサービスコントラクトは org.hibernate.service.spi.Manageable で、JMX 統合が有効になっていると、JMX でサービスが管理可能であるとマークされます。
13.5.3. サービス依存関係の種類 リンクのコピーリンクがクリップボードにコピーされました!
- @
org.hibernate.service.spi.InjectService - 単一のパラメーターを受け入れ、@
InjectServiceでアノテーションが付けられたサービス実装クラスのメソッドは 、別のサービスの挿入を要求していると見なされます。デフォルトでは、method パラメーターのタイプは、インジェクトされるサービスロールになることが想定されます。パラメーターのタイプがサービスロールと異なる場合は、InjectServiceのserviceRole属性を使用してロールに明示的な名前を付ける必要があります。デフォルトでは、インジェクトされたサービスは必須とみなされ、名前付き依存サービスがないと、起動に失敗します。インジェクションするサービスがオプションの場合、InjectServiceのrequired属性はfalseと宣言する必要があります (デフォルトはtrue)。 org.hibernate.service.spi.ServiceRegistryAwareService- 次のアプローチは、単一の
injectServicesメソッドを宣言する、オプションのサービスインターフェースorg.hibernate.service.spi.ServiceRegistryAwareServiceをサービスが実装するプルアプローチです。Hibernate は起動時に、org.hibernate.service.ServiceRegistry自体をこのインターフェースを実装するサービスに挿入します。その後、ServiceRegistry参照を使用して必要な追加サービスを見つけることができます。
13.5.4. ServiceRegistry リンクのコピーリンクがクリップボードにコピーされました!
13.5.4.1. ServiceRegistry について リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.service.ServiceRegistry インターフェースです。サービスレジストリーの主な目的は、サービスへのアクセスを保持し、管理し、提供することです。
org.hibernate.service.ServiceRegistryBuilder を使用して org.hibernate.service.ServiceRegistry インスタンスをビルドします。
例13.21 ServiceRegistryBuilder を使用して ServiceRegistry を作成します
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry );
ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry );
ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();
13.5.5. カスタムサービス リンクのコピーリンクがクリップボードにコピーされました!
13.5.5.1. カスタムサービスについて リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.service.ServiceRegistry を構築すると、不変とみなされます。このサービス自体は再設定を受け入れる可能性がありますが、ここでの不変性はサービスの追加/置き換えを意味します。そのため、org.hibernate.service.ServiceRegistryBuilder で利用できる別のロールは、これから生成される org.hibernate.service.ServiceRegistry に含まれるサービスの調整を許可することです。
org.hibernate.service.ServiceRegistryBuilder に指示する方法は 2 つあります。
org.hibernate.service.spi.BasicServiceInitiatorクラスを実装し、サービスクラスのオンデマンド構築を制御し、addInitiatorメソッドを使用してorg.hibernate.service.ServiceRegistryBuilderに追加します。- サービスクラスをインスタンス化し、それを介して
org.hibernate.service.ServiceRegistryBuilderに追加するだけです。addService方法。
例13.22 ServiceRegistryBuilder を使用して、既存のサービスをカスタムサービスに置き換える
13.5.6. ブートストラップレジストリー リンクのコピーリンクがクリップボードにコピーされました!
13.5.6.1. Boot-strap レジストリーについて リンクのコピーリンクがクリップボードにコピーされました!
ClassLoaderService です。これは最適な例です。設定ファイルを解決するにも、クラス読み込みサービス (リソース検索) へのアクセスが必要です。これは、通常の使用時の (親ではなく) ルートレジストリーです。
org.hibernate.service.BootstrapServiceRegistryBuilder クラスを使用して作成されます。
13.5.6.2. BootstrapServiceRegistryBuilder の使用 リンクのコピーリンクがクリップボードにコピーされました!
例13.23 BootstrapServiceRegistryBuilder の使用
13.5.6.3. BootstrapRegistry サービス リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.service.classloading.spi.ClassLoaderService
- アプリケーションクラスを検索する機能
- インテグレーションクラスを検索する機能
- リソース (プロパティーファイル、xml ファイルなど) を見つける機能
java.util.ServiceLoaderをロードする機能
org.hibernate.integrator.spi.IntegratorService
Javajava.util.ServiceLoader 機能を活用します。 org.hibernate.service.classloading.spi.ClassLoaderService の実装を発見するために org.hibernate.integrator.spi.Integrator contract.
/META-INF/services/org.hibernate.integrator.spi.Integrator という名前のファイルを定義し、これをクラスパスで利用できるようにします。
java.util.ServiceLoader メカニズムによって使用されます。これは、1 行ずつ org.hibernate.integrator.spi.Integrator インターフェースを実装するクラスの完全修飾名を一覧表示します。
13.5.7. SessionFactory レジストリー リンクのコピーリンクがクリップボードにコピーされました!
13.5.7.1. SessionFactory レジストリー リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.SessionFactory、このグループのサービスのインスタンスは、明示的に単一に属します org.hibernate.SessionFactory.
org.hibernate.SessionFactory 開始されます。この特別なレジストリーは org.hibernate.service.spi.SessionFactoryServiceRegistry
13.5.7.2. SessionFactory サービス リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.event.service.spi.EventListenerRegistry
- Description
- イベントリスナーを管理するためのサービスです。
- イニシエーター
org.hibernate.event.service.internal.EventListenerServiceInitiator- 実装
org.hibernate.event.service.internal.EventListenerRegistryImpl
13.5.8. インテグレーター リンクのコピーリンクがクリップボードにコピーされました!
13.5.8.1. インテグレーター リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.integrator.spi.Integrator 開発者が機能する SessionFactory を構築するプロセスにフックできるようにするための簡単な手段を提供することを目的としています。その org.hibernate.integrator.spi.Integrator インターフェイスは、対象となる 2 つのメソッドを定義します。integrate構築プロセスにフックすることができます。disintegrateシャットダウンする SessionFactory にフックすることができます。
org.hibernate.integrator.spi.Integrator、のオーバーロードされた形式integrate受け入れる org.hibernate.metamodel.source.MetadataImplementor org.hibernate.cfg.Configuration の代わりに。このフォームは、5.0 で完了する予定の新しいメタモデルコードで使用することを目的としています。
13.5.8.2. インテグレーターのユースケース リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.integrator.spi.Integrator 現在、イベントリスナーの登録とサービスの提供を行っています (を参照)。 org.hibernate.integrator.spi.ServiceContributingIntegrator).5.0 では、オブジェクトモデルとリレーショナルモデル間のマッピングを記述するメタモデルを変更できるように拡張する予定です。
例13.24 イベントリスナーの登録
13.6. Bean Validation リンクのコピーリンクがクリップボードにコピーされました!
13.6.1. Bean Validation リンクのコピーリンクがクリップボードにコピーされました!
bean-validationクイックスタートの例:「クイックスタートにアクセスする」。
13.6.2. Hibernate Validator リンクのコピーリンクがクリップボードにコピーされました!
13.6.3. バリデーション制約 リンクのコピーリンクがクリップボードにコピーされました!
13.6.3.1. バリデーション制約 リンクのコピーリンクがクリップボードにコピーされました!
13.6.3.2. Red Hat JBossDeveloperStudio で制約アノテーションを作成する リンクのコピーリンクがクリップボードにコピーされました!
概要
このタスクでは、Java アプリケーション内で使用するために Red Hat JBossDeveloperStudio で制約アノテーションを作成するプロセスについて説明します。
手順13.5 制約注釈を作成する
- Red Hat JBossDeveloperStudio で Java プロジェクトを開きます。
データセットを作成する
制約アノテーションには、許容値を定義するデータセットが必要です。- プロジェクトエクスプローラ パネルでプロジェクトルートフォルダーを右クリックします。
- → 選択します。
- 次の要素を設定します。
- パッケージ:
- 名前:
- ボタンをクリックして、必要なインターフェイスを追加します。
- をクリックしてファイルを作成します。
- データセットに値のセットを追加し、 をクリックします。
例13.25 データセットの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注釈ファイルを作成する
新しい Java クラスを作成します。- 制約注釈を設定し、 をクリックします。
例13.26 制約注釈ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 結果
- 可能な値のセットを含むカスタム制約アノテーションが作成され、Java プロジェクトで使用できるようになりました。
13.6.3.3. Hibernate Validator の制約 リンクのコピーリンクがクリップボードにコピーされました!
| Annotation | に適用する | ランタイムチェック | Hibernate Metadata の影響 |
|---|---|---|---|
| @Length(min=, max=) | プロパティー (文字列) | 文字列の長さが指定の範囲と一致するかを確認します。 | カラムの長さを最大に設定します。 |
| @Max(value=) | プロパティー (数値または数値の文字列表現) | 値が最大値以下であるかを確認します。 | カラムに check 制約を追加します。 |
| @Min(value=) | プロパティー (数値または数値の文字列表現) | 値が最小値以上であるかを確認します。 | カラムに check 制約を追加します。 |
| @NotNull | プロパティー | 値が null でないかを確認します。 | カラムが null でないかを確認します。 |
| @NotEmpty | プロパティー | 文字列が null あるいは空でないかを確認します。接続が null あるいは空でないかを確認します。 | 列が null ではありません (文字列の場合)。 |
| @Past | プロパティー (日付またはカレンダー) | 過去の日付であるかを確認します。 | カラムに check 制約を追加します。 |
| @Future | プロパティー (日付またはカレンダー) | 未来の日付であるかを確認します。 | なし。 |
| @Pattern(regex="regexp", flag=) or @Patterns( {@Pattern(...)} ) | プロパティー (文字列) | プロパティーが一致フラグを指定して正規表現と一致するかどうかを確認します (java.util.regex.Pattern を参照)。 | なし。 |
| @Range(min=, max=) | プロパティー (数値または数値の文字列表現) | 値が最小値と最大値 (含まれている) の間にあるかどうかを確認します。 | カラムに check 制約を追加します。 |
| @Size(min=, max=) | プロパティー (配列、コレクション、マップ) | 要素のサイズが最小から最大 (含まれている) の間にあるかどうかを確認します。 | なし。 |
| @AssertFalse | プロパティー | メソッドが false と評価することを確認します (アノテーションでなくコードで制約が表現されている場合に便利です)。 | なし。 |
| @AssertTrue | プロパティー | メソッドが true と評価することを確認します (アノテーションでなくコードで制約が表現されている場合に便利です)。 | なし。 |
| @Valid | プロパティー (オブジェクト) | 紐付けされたオブジェクトに再帰的にバリデーションを実行します。オブジェクトがコレクションかアレイの場合は、要素は再帰的に検証されます。また、オブジェクトがマップの場合、値要素が再帰的に検証されます。 | なし。 |
| プロパティー (文字列) | 文字列がメールアドレスの仕様に準拠するかどうかを確認します。 | なし。 | |
| @CreditCardNumber | プロパティー (文字列) | 文字列が正規の形式のクレジットカード番号であるかどうかを確認します (Luhn アルゴリズムの派生)。 | なし。 |
| @Digits(integerDigits=1) | プロパティー (数値または数値の文字列表現) | プロパティーが integerDigits までの整数部と、fractionalDigits までの小数部を持つ数字であるかを確認します。 | カラムの精度とスケールを定義します。 |
| @EAN | プロパティー (文字列) | 文字列が正しくフォーマットされた EAN あるいは UPC-A コードであるかを確認します。 | なし。 |
13.6.4. 設定 リンクのコピーリンクがクリップボードにコピーされました!
13.6.4.1. 例: バリデーション設定ファイル リンクのコピーリンクがクリップボードにコピーされました!
例13.27 validation.xml
13.7. エンバーズ リンクのコピーリンクがクリップボードにコピーされました!
13.7.1. Hibernate Envers について リンクのコピーリンクがクリップボードにコピーされました!
@Audited アノテーションが付けられたエンティティーに対して作成されています。これは、エンティティーに加えられた変更の履歴が保存されます。その後、データを取得し、クエリーできます。
- JPA 仕様で定義されているすべてのマッピングの監査
- JPA 仕様を拡張するすべての Hibernate マッピングの監査
- ネイティブ Hibernate API を使用する、または、これによってマッピングされるエンティティーの監査
- リビジョンエンティティーを使用した各リビジョンのデータのログ記録、また
- 履歴データのクエリー
13.7.2. 永続クラスの監査について リンクのコピーリンクがクリップボードにコピーされました!
@Audited注釈。アノテーションがクラスに適用されると、エンティティーの改訂履歴を保存するテーブルが作成されます。
13.7.3. 監査ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
13.7.3.1. 監査ストラテジーについて リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトの監査ストラテジー
- このストラテジーは、開始リビジョンとともに監査データの保存を永続化します。監査されたテーブルで挿入、更新、削除される行ごとに、有効性の開始リビジョンとともに、監査テーブルに 1 つ以上の行を挿入します。監査テーブルの行は、挿入後には更新されません。監査情報のクエリーはサブクエリーを使用して、監査テーブルの適用可能な行を選択します。これはスピードが遅く、インデックス作成が困難です。
- 有効性監査ストラテジー
- このストラテジーは、監査上の開始リビジョンと最後のリビジョンを保存します。監査されたテーブルで挿入、更新、削除される行ごとに、有効性の開始リビジョンとともに、監査テーブルに 1 つ以上の行を挿入します。同時に、以前の監査行 (利用可能な場合) の終了リビジョンフィールドは、このリビジョンに設定されます。監査情報のクエリーは、サブクエリーの代わりに、 between start と end revision の間で使用できます。つまり、追加の更新により、監査情報の永続化は多少遅くなりますが、監査情報の取得はかなり速くなります。これは、インデックスを追加して改善することもできます。
13.7.3.2. 監査ストラテジーの設定 リンクのコピーリンクがクリップボードにコピーされました!
概要
JBoss EAP 6 でサポートされる監査戦略には、デフォルトと妥当性の監査戦略の 2 つがあります。このタスクでは、アプリケーションの監査戦略を定義するために必要な手順について説明します。
手順13.6 監査戦略を定義する
- を設定します
org.hibernate.envers.audit_strategyアプリケーションのpersistence.xmlファイルのプロパティー。プロパティーがpersistence.xmlファイルで設定されていない場合は、デフォルトの監査ストラテジーが使用されます。例13.28 デフォルトの監査ストラテジーの設定
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.DefaultAuditStrategy"/>
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.DefaultAuditStrategy"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例13.29 有効性監査ストラテジーの設定
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.7.4. エンティティー監査の開始 リンクのコピーリンクがクリップボードにコピーされました!
13.7.4.1. JPA エンティティーへの監査サポートの追加 リンクのコピーリンクがクリップボードにコピーされました!
手順13.7 JPA エンティティーへの監査サポートの追加
- デプロイメントに適した利用可能な監査パラメーターを設定します: 「Envers パラメーターの設定」
- 監査する JPA エンティティーを開きます。
- をインポートします
org.hibernate.envers.Auditedインターフェイス。 - 監査する各フィールドまたはプロパティーに
@Auditedアノテーションを適用するか、クラス全体に対して 1 度適用します。例13.30 2 つのフィールドを監査する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例13.31 クラス全体を監査する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
JPA エンティティーは監査用に設定されています。履歴の変更を保存するために、Entity_AUD というテーブルが作成されます。
13.7.5. 設定 リンクのコピーリンクがクリップボードにコピーされました!
13.7.5.1. Envers パラメーターの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順13.8 Envers パラメーターの設定
- アプリケーションの
persistence.xmlファイルを開きます。 - 必要に応じて Envers プロパティーを追加、削除、または設定します。利用可能なプロパティーのリストについては、を参照してください。「Envers 設定プロパティー」。
例13.32 例: Envers パラメーター
- 結果
- アプリケーション内のすべての JPA エンティティーに対して監査が設定されています。
13.7.5.2. ランタイム時の監査の有効化または無効化 リンクのコピーリンクがクリップボードにコピーされました!
概要
このタスクでは、実行時にエンティティーバージョンの監査を有効/無効にするために必要な設定手順について説明します。
手順13.9 監査の有効化/無効化
AuditEventListenerクラスをサブクラス化します。- Hibernate イベントで呼び出される以下のメソッドを上書きします。
- onPostInsert
- onPostUpdate
- onPostDelete
- onPreUpdateCollection
- onPreRemoveCollection
- onPostRecreateCollection
- イベントのリスナーとしてサブクラスを指定します。
- 変更を監査する必要があるかどうかを判断します。
- 変更を監査する必要がある場合には、スーパークラスに呼び出しを渡します。
13.7.5.3. 条件監査の設定 リンクのコピーリンクがクリップボードにコピーされました!
概要
Hibernate Envers は、一連のイベントリスナーを使用して、さまざまな Hibernate イベントに対する応答で監査データを永続化します。Envers jar がクラスパスにある場合、これらのリスナーは自動的に登録されます。このタスクでは、Envers イベントリスナーの一部をオーバーライドすることにより、条件付き監査を実装するために必要な手順について説明します。
手順13.10 条件監査の実装
persistence.xmlファイルでhibernate.listeners.envers.autoRegisterを false に設定します。- 上書きされる各イベントリスナーをサブクラス化します。条件付き監査ロジックをサブクラスに配置し、監査を実行する必要がある場合は super メソッドを呼び出します。
org.hibernate.envers.event.EnversIntegratorに類似した、org.hibernate.integrator.spi.Integratorのカスタム実装を作成します。デフォルトのクラスではなく、ステップ 2 で作成したイベントリスナーサブクラスを使用します。META-INF/services/org.hibernate.integrator.spi.Integratorファイルを jar に追加します。このファイルには、インターフェースを実装するクラスの完全修飾名が含まれている必要があります。
結果
条件付き監査が設定され、デフォルトの Envers イベントリスナーがオーバーライドされます。
13.7.5.4. Envers 設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | デフォルト値 | 説明 |
|---|---|---|
|
org.hibernate.envers.audit_table_prefix
| |
監査されたエンティティーの名前の前に付加される文字列。監査情報を保持するエンティティーの名前を作成します。
|
|
org.hibernate.envers.audit_table_suffix
|
_AUD
|
監査されたエンティティーの名前に付加される文字列。監査情報を保持するエンティティーの名前を作成します。たとえば、テーブル名が
Person のエンティティーが監査されると、Envers は、履歴データを格納する Person_AUD と呼ばれるテーブルを生成します。
|
|
org.hibernate.envers.revision_field_name
|
REV
|
改訂番号を保持する監査エンティティーのフィールド名。
|
|
org.hibernate.envers.revision_type_field_name
|
REVTYPE
|
改訂の種類を保持する監査エンティティーのフィールド名。可能なリビジョンの現在のタイプは、
add、mod、および del です。
|
|
org.hibernate.envers.revision_on_collection_change
|
true
|
このプロパティーは、所有の変更のない関係フィールドがある場合にリビジョンを生成するかどうかを決定します。これは、一対多数の関係のコレクションであるか、または一対一の関係で
mappedBy 属性を使用するフィールドになります。
|
|
org.hibernate.envers.do_not_audit_optimistic_locking_field
|
true
|
true の場合、(
@Version でアノテーション付けされた) 楽観的ロックに使用されるプロパティーは自動的に監査から除外されます。
|
|
org.hibernate.envers.store_data_at_delete
|
false
|
このプロパティーは、ID のみではなく、エンティティーデータを削除するときに、エンティティーデータをリビジョンに保存するかどうかを定義します。その他のすべてのプロパティーは null とマークされます。通常、データは最後から 2 番目のバージョンにあるため、これは必須ではありません。ただし時折、最後のリビジョンでアクセスすることが簡単で、より効率的になる場合があります。ただし、これは、削除前に含まれるエンティティーのデータが 2 回保存されることを意味します。
|
|
org.hibernate.envers.default_schema
|
null (通常のテーブルと同じ)
|
監査テーブルに使用されるデフォルトのスキーマ名。
@AuditTable(schema="...") アノテーションを使用して上書き可能。これがない場合、スキーマは通常のテーブルのスキーマと同じになります。
|
|
org.hibernate.envers.default_catalog
|
null (通常のテーブルと同じ)
|
監査テーブルに使用するデフォルトのカタログ名。
@AuditTable(catalog="...") アノテーションを使用して上書き可能。存在しない場合、カタログは通常のテーブルのカタログと同じになります。
|
|
org.hibernate.envers.audit_strategy
|
org.hibernate.envers.strategy.DefaultAuditStrategy
|
このプロパティーは、監査データの永続化時に使用する必要のある監査ストラテジーを定義します。デフォルトでは、エンティティーが変更されたリビジョンのみが保存されます。または、
org.hibernate.envers.strategy.ValidityAuditStrategyでは、開始リビジョンと終了リビジョンの両方を保存します。これらを組み合わせて、監査行が有効であったタイミングを定義します。
|
|
org.hibernate.envers.audit_strategy_validity_end_rev_field_name
|
REVEND
|
監査エンティティーで終了リビジョン番号を保持するコラムの名前。このプロパティーは、妥当な監査ストラテジーが使用される場合にのみ有効です。
|
|
org.hibernate.envers.audit_strategy_validity_store_revend_timestamp
|
false
|
このプロパティーは、終了リビジョン自体に加えて、データが最後に有効であった終了リビジョンのタイムスタンプも保存すべきかどうかを定義します。これは、テーブルパーティションを使用して、リレーショナルデータベースから古い監査レコードをパージする場合に便利です。パーティショニングには、テーブルに存在するコラムが必要です。このプロパティーは
ValidityAuditStrategy が使用される場合にのみ評価されます。
|
|
org.hibernate.envers.audit_strategy_validity_revend_timestamp_field_name
|
REVEND_TSTMP
|
データがまだ有効であった時点での終了リビジョンのタイムスタンプのコラム名。
ValidityAuditStrategy が使用されている場合にのみ使用され、 org.hibernate.envers.audit_strategy_validity_store_revend_timestamptrue と評価されます。
|
13.7.6. クエリー リンクのコピーリンクがクリップボードにコピーされました!
13.7.6.1. 監査情報を取得する リンクのコピーリンクがクリップボードにコピーされました!
概要
Hibernate Enver は、クエリーを介して監査情報を取得する機能を提供します。このトピックでは、これらのクエリーの例を示します。
live データに対するクエリーよりもはるかに遅くなります。
例13.33 所定リビジョンでのクラスのエンティティーのクエリー
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditEntity ファクトリークラスを使用して指定できます。以下のクエリーは、name プロパティーが John と同等のエンティティーのみを選択します。
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
例13.34 所定クラスエンティティーが変更されるクエリーリビジョン
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
AuditEntity.revisionNumber()- 監査済みエンティティーが変更されたリビジョン番号の制約、展開、および順序を指定します。
AuditEntity.revisionProperty(propertyName)- 監査済みエンティティーが変更されたリビジョンに対応する、リビジョンエンティティーのプロパティーに対する制約、調整および順序付けを指定します。
AuditEntity.revisionType()- リビジョンのタイプ (ADD、MOD、DEL) へのアクセスを提供します。
MyEntityクラス、entityIdリビジョン番号 42 以降、ID が変更されました:
actualDate の値が指定の値よりも大きくなるリビジョンを選択しますが、可能な限り小さくなります。
minimize() および maximize() のメソッドは基準を返します。これは、制約を追加でき、 maximized/minimized プロパティーを持つエンティティーによって満たされる必要があります。
selectEntitiesOnly- このパラメーターは、明示的な子が設定されていない場合のみ有効です。true の場合、クエリーの結果は、指定された制約を満たすリビジョンで変更されたエンティティーのリストになります。false の場合、結果は 3 つの要素の配列のリストになります。最初の要素は変更されたエンティティーインスタンスになります。次は、リビジョンデータを含むエンティティーです。カスタムエンティティーが使用されていない場合、
DefaultRevisionEntityのインスタンスになります。3 番目の要素アレイはリビジョンのタイプ (ADD、MOD、DEL) になります。 selectDeletedEntities- このパラメーターは、エンティティーが削除されたリビジョンを結果に含める必要があるかどうかを指定します。true の場合、エンティティーにはリビジョンタイプ
DELが指定され、id を除くすべてのフィールドの値はnullになります。
例13.35 所定プロパティーを変更するエンティティーのクエリーの修正
MyEntity指定された ID を使用します。actualDateプロパティーが変更されました。
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true)
.add(AuditEntity.id().eq(id));
.add(AuditEntity.property("actualDate").hasChanged())
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true)
.add(AuditEntity.id().eq(id));
.add(AuditEntity.property("actualDate").hasChanged())
hasChanged条件は、追加の基準と組み合わせることができます。以下のクエリーは、revisionNumber の生成時に MyEntity の水平スライスを返します。変更されたリビジョンに限定されますprop1、だがしかしprop2。
AuditQuery query = getAuditReader().createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
AuditQuery query = getAuditReader().createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
MyEntitiesRevisionNumber で 変更 されましたprop1変更され、prop2手つかず。
forEntitiesModifiedAtRevisionクエリー:
AuditQuery query = getAuditReader().createQuery()
.forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
AuditQuery query = getAuditReader().createQuery()
.forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
例13.36 指定リビジョンでのクエリーエンティティーの変更
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
.getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
.getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
org.hibernate.envers.CrossTypeRevisionChangesReader:
List<Object> findEntities(Number)- 指定のリビジョンで変更された (追加、更新、削除された) すべての監査済みエンティティーのスナップショットを返します。
n+1SQL クエリーを実行します。nは、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。 List<Object> findEntities(Number, RevisionType)- 変更タイプでフィルターされた特定のリビジョンで変更 (追加、更新、または削除) されたすべての監査済みエンティティーのスナップショットを返します。
n+1SQL クエリーを実行します。nは、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。 Map<RevisionType, List<Object>> findEntitiesGroupByRevisionType(Number)- 変更操作 (追加、更新、削除など) ごとにグループ化されたエンティティースナップショットのリストを含むマップを返します。
3n+1SQL クエリーを実行します。nは、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。
13.8. パフォーマンスチューニング リンクのコピーリンクがクリップボードにコピーされました!
13.8.1. 他のバッチロードアルゴリズム リンクのコピーリンクがクリップボードにコピーされました!
- クラス当たりのレベルHibernate がクラス当たりのレベルでデータを読み込む場合は、クエリーの実行時にロードする関連付けのバッチサイズが必要になります。たとえば、ランタイム時に、セッションに 30 個のインスタンスの
carオブジェクトがロードされているとします。各carオブジェクトはownerオブジェクトに属します。すべてのcarオブジェクトを繰り返し処理し、所有者を要求する場合、lazy読み込みでは、Hibernate は所有者ごとに 30 個の select ステートメントを発行します。これはパフォーマンスのボトルネックです。代わりに、Hibernate に対して、クエリーを経由する前に所有者の次のバッチのデータを事前に読み込むように指示することもできます。ownerオブジェクトがクエリーされると、Hibernate は同じ SELECT ステートメントで多くのこれらのオブジェクトをクエリーします。事前にクエリーするownerオブジェクトの数は、設定時に指定されたbatch-sizeパラメーターによって異なります。<class name="owner" batch-size="10"></class>
<class name="owner" batch-size="10"></class>Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、Hibernate は、後で必要と予想される 10 個以上のownerオブジェクトをクエリーするようになります。ユーザーがクエリーを実行するとownerのcar A、ownerのcar Bバッチロードの一部としてすでにロードされている可能性があります。ユーザーがデータベースに移動 (および SELECT ステートメントを実行) する代わりに、実際にcar Bのownerが必要な場合は、現在のセッションから値を取得できます。batch-sizeパラメーターに加えて、Hibernate 4.2.0 ではバッチロードのパフォーマンスを強化する新しい設定項目が導入されました。設定アイテムは呼び出されますBatch Fetch Style設定であり、hibernate.batch_fetch_styleパラメーターで指定されます。LEGACY、PADDED、DYNAMIC といった異なるバッチフェッチスタイルがサポートされています。使用するスタイルを指定するには、org.hibernate.cfg.AvailableSettings#BATCH_FETCH_STYLE。- レガシー: レガシースタイルの読み込みでは、に基づいて事前に作成されたバッチサイズのセット
ArrayHelper.getBatchSizes(int)利用されます。バッチは、既存のバッチ可能な識別子の数からの次に小さな事前ビルドされたバッチサイズを使用してロードされます。上記の例を続けて、batch-size30 に設定すると、事前に作成されたバッチサイズは 30、15、10、9、8、7、..、1 になります。ロード 29 識別子のバッチ処理を試みると、15、10、および 4 のバッチが発生します。対応する SQL クエリーは 3 つあり、各クエリーはデータベースから 15、10、および 4 の所有者 (owner) を読み込みます。 - PADDED - PADDED は、バッチローディングの LEGACY スタイルに似ています。依然として事前ビルドされたバッチサイズを使用していますが、次に大きなバッチサイズを使用し、追加の識別子プレースホルダーをパディングします。上記の例と同様に、30 個の owner オブジェクトを初期化する場合、データベースに対してクエリーが実行されるのは 1 つのみとなります。ただし、29 個の owner オブジェクトが初期化される場合でも、Hibernate は依然としてバッチサイズ 30 の SQL select ステートメントのみを実行し、識別子が連続する追加スペースがパディングされます。
- Dynamic - バッチサイズの制限に準拠していますが、このスタイルのバッチロードは、実際に読み込まれるオブジェクト数を使用して SQL SELECT ステートメントを動的に構築します。たとえば、owner オブジェクトが 30 個で、最大バッチサイズが 30 の場合、30 個の owner オブジェクトを取得する呼び出しは、1 つの SQL SELECT ステートメントになります。35 個を取得する呼び出しは、バッチサイズ 30 と 5 の 2 つの SQL ステートメントになります。Hibernate は、必要な数である 5 を維持するために 第 2 の SQL ステートメントを動的に変更します。また、バッチサイズは制限の 30 のままに保持します。これは、PADDED バージョンとは異なります。第 2 の SQL は PADDED されません。LEGACY スタイルとは異なり、第 2 の SQL ステートメントには固定サイズがなく、次の SQL は動的に作成されます。クエリーが 30 個の識別子を下回る場合、このスタイルは要求された識別子の数のみを動的に読み込みます。
- コレクション当たりのレベルHibernate では、上記の各クラス当たりのセクションにリストされているバッチフェッチサイズとスタイルを採用するロードコレクションのバッチ処理も可能です。前のセクションで使用した例を戻すには、各
ownerオブジェクトが所有するすべてのcarオブジェクトをロードする必要があることを考慮してください。10 個のownerオブジェクトが現行セッションでロードされ、すべての owner で 反復すると、10 個の SELECT ステートメントが生成されます (getCars()メソッドへの呼び出しごと)。Owner のマッピングで cars コレクションのバッチフェッチを有効にすると、Hibernate は以下のようにこれらのコレクションの事前フェッチを実行できます。<class name="Owner"><set name="cars" batch-size="5"></set></class>
<class name="Owner"><set name="cars" batch-size="5"></set></class>Copy to Clipboard Copied! Toggle word wrap Toggle overflow したがって、バッチサイズが 5 で、レガシーバッチスタイルを使用して 10 のコレクションをロードする場合、Hibernate は 2 つの SELECT ステートメントを実行し、それぞれが 5 のコレクションを取得することになります。
13.8.2. 変更不可のデータのオブジェクト参照の 2 次レベルのキャッシング リンクのコピーリンクがクリップボードにコピーされました!
hibernate.cache.use_reference_entriesにtrue。デフォルトでは、hibernate.cache.use_reference_entriesに設定されていますfalse。
hibernate.cache.use_reference_entriesに設定されていますtrue、関連付けのない不変のデータオブジェクトは、第 2 レベルのキャッシュにコピーされず、そのオブジェクトへの参照のみが保存されます。
hibernate.cache.use_reference_entriesに設定されていますtrue、関連付けのある不変のデータオブジェクトは、引き続き第 2 レベルのキャッシュに深くコピーされます。
第14章 Hibernate Search リンクのコピーリンクがクリップボードにコピーされました!
14.1. Hibernate Search の使用 リンクのコピーリンクがクリップボードにコピーされました!
14.1.1. Hibernate Search について リンクのコピーリンクがクリップボードにコピーされました!
14.1.2. Hibernate Search を使用する最初の手順 リンクのコピーリンクがクリップボードにコピーされました!
- Hibernate Search を設定するには、JBoss EAP 『管理および設定ガイド』 の 『設定』 を参照してください。
14.1.3. Maven を使用した Hibernate Search の有効化 リンクのコピーリンクがクリップボードにコピーされました!
hibernate-search-orm 依存関係を追加します。
14.1.4. アノテーションの追加 リンクのコピーリンクがクリップボードにコピーされました!
example.Book および example.Author が含まれ、アプリケーションにフリーテキスト検索機能を追加して、書籍の検索を有効にする場合。
例14.1 Hibernate Search 固有のアノテーションを追加する前のエンティティーブックおよび作成者
Book クラスおよび Author クラスにアノテーションをいくつか追加する必要があります。最初のアノテーション @Indexed は Book にインデックス可能 (indexable) のマークを付けます。デザイン上、Hibernate Search は未認証の ID をインデックスに保存し、特定のエンティティーのインデックスの一意性を確保します。@DocumentId は、この目的に使用するプロパティーをマークし、ほとんどの場合はデータベースのプライマリーキーと同じです。@DocumentId アノテーションは、@Id アノテーションが存在する場合は任意です。
title と subtitle で始まります。両方に、@Field アノテーションを付けます。パラメーター index=Index.YES は、テキストが確実にインデックス化されるようにします。一方、analyze=Analyze.YES は、デフォルトの Lucene アナライザーを使用してテキストが分析されるようにします。通常、分析とは個別の単語に文章を分け、'a' や `the'.などの一般的な単語を除外できる可能性があることを意味します。アナライザーについてもう少し後ほど説明します。@Field で指定する第 3 のパラメーター store=Store.NO は、実際のデータがインデックスに保存されないようにします。このデータがインデックスに保存されているかどうかや、そのデータを検索する機能がないかどうかです。Lucene の観点からは、インデックスが作成されてからデータを保持する必要はありません。これを保存する利点は、projections を介してそれを取得することです (「プロジェクション」 を参照してください)。
Index=Index.YES, analyze=Analyze.YES および store=Store.NO はこれらのパラメーターのデフォルト値であるため、省略できることに注意してください。
@DateBridge です。このアノテーションは、Hibernate Search の組み込みフィールドブリッジのいずれかになります。Lucene インデックスは文字列ベースです。このため、Hibernate Search はインデックス化されたフィールドの値タイプを文字列 (またはその逆) に変換する必要があります。事前定義されたブリッジの範囲が提供されます。これには、java.util.Date を指定の解決が含まれる String に変換する DateBridge が含まれます。詳細は、「ブリッジ」 を参照してください。
@IndexedEmbedded が残ります。 このアノテーションは、所有するエンティティーの一部として、関連付けられたエンティティー (@ ManyToMany、@ * ToOne、@ Embedded、および @ElementCollection) にインデックスを付けるために使用されます。これは、Lucene インデックスドキュメントがオブジェクト関係について不明なフラットデータ構造であるため必要になります。作成者の名前を確実に検索できるようにするには、名前を書籍の一部としてインデックス化する必要があります。@IndexedEmbedded のほかに、インデックスに含める関連エンティティーのフィールドすべてを @Indexed でマークする必要があります。詳細は、「埋め込みおよび関連オブジェクト」 を参照してください。
例14.2 Hibernate Search アノテーションの追加後のエンティティー
14.1.5. インデックス化 リンクのコピーリンクがクリップボードにコピーされました!
例14.3 Hibernate セッションを使用してデータにインデックスを付ける
FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(session); fullTextSession.createIndexer().startAndWait();
FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
例14.4 JPA を使用したデータのインデックス作成
EntityManager em = entityManagerFactory.createEntityManager(); FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em); fullTextEntityManager.createIndexer().startAndWait();
EntityManager em = entityManagerFactory.createEntityManager();
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
/var/lucene/indexes/example.Book に Lucene インデックスが表示されるはずです。Luke でこのインデックスを調べてください。HibernateSearch がどのように機能するかを理解するのに役立ちます。
14.1.6. 検索 リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.Query にクエリーをラップし、Hibernate API から必要な機能を取得します。以下のコードは、インデックスフィールドに対するクエリーを準備します。コードを実行すると、Book の一覧が返されます。
例14.5 Hibernate Search セッションを使用した検索の作成および実行
例14.6 JPA を使用した検索の作成と実行
14.1.7. アナライザー リンクのコピーリンクがクリップボードにコピーされました!
Refactoring: Improving the Design of Existing Code で、refactor、refactors、refactored、refactoring のクエリーに必要だとします。インデックス化および検索を行う際にワードステミングを適用する Lucene でアナライザークラスを選択します。Hibernate Search は、アナライザーを設定するためのいくつかの方法を提供します (を参照)。「デフォルトの Analyzer とクラスによる Analyzer」詳細については):
- 設定ファイルに
analyzerプロパティーを設定します。指定されたクラスがデフォルトのアナライザーになります。 - エンティティーレベルで
アノテーションを設定します。@Analyzer - フィールドレベルで
@アノテーションを設定します。Analyzer
@Analyzer アノテーションとともに @AnalyzerDef アノテーションで定義されているアナライザーを確認します。Solr アナライザーフレームワークとそのファクトリーは、後者のオプションに使用されます。ファクトリークラスの詳細は、Solr JavaDoc を参照するか、Solr Wiki (http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters) の該当するセクションを参照してください。
StandardTokenizerFactory が、LowerCaseFilterFactory と SnowballPorterFilterFactory の 2 つのフィルターファクトリーによって使用されています。トークンライザーは、英数字とハイフンで単語を分割しますが、メールアドレスとインターネットのホスト名は維持します。標準トークンは、これおよびその他の一般的な操作に適しています。小文字フィルターはトークンのすべての文字を小文字に変換し、snowball フィルターは言語固有のステミングを適用します。
例14.7 @AnalyzerDef および Solr Framework を使用した Analyzer の定義および使用
@AnalyzerDef を使用してアナライザーを定義し、@Analyzer を使用してエンティティーおよびプロパティーに適用します。この例では、customanalyzer は定義されますが、エンティティーには適用されません。アナライザーは title および subtitle プロパティーのみに適用されます。アナライザーの定義はグローバルです。エンティティーのアナライザーを定義し、必要に応じて他のエンティティーの定義を再利用します。
14.2. インデックス構造へのエンティティーのマッピング リンクのコピーリンクがクリップボードにコピーされました!
14.2.1. エンティティーのマッピング リンクのコピーリンクがクリップボードにコピーされました!
14.2.1.1. 基本的なマッピング リンクのコピーリンクがクリップボードにコピーされました!
- @Indexed
- @Field
- @NumericField
- @Id
14.2.1.1.1. @Indexed リンクのコピーリンクがクリップボードにコピーされました!
@Indexed アノテーションを付けることで行われます (@Indexed アノテーションが付いていないすべてのエンティティーはインデックスプロセスによって無視されます)。
例14.8 @Indexed を使用してクラスをインデックス可能にする
@Entity
@Indexed
public class Essay {
...
}
@Entity
@Indexed
public class Essay {
...
}
index 属性を指定して、インデックスのデフォルト名を変更できます。
14.2.1.1.2. @Field リンクのコピーリンクがクリップボードにコピーされました!
@Field はプロパティーをインデックスとして宣言し、以下の属性のいずれかを設定してインデックスプロセスの複数の側面を設定できます。
name: プロパティーがどの名前下で、Lucene Document に保存されるべきかを説明します。デフォルト値はプロパティー名です (続く JavaBeans 規則)。store: プロパティーが Lucene インデックスに保存されているかどうかを示します。Store.YESの値 (インデックスに多くの領域が必要ですが projection を許可 「プロジェクション」 を参照) を保存するか、これを圧縮方式Store.COMPRESSで保存、あるいは、Store.NOを回避することができます (デフォルト値)。プロパティーが保存されると、Lucene ドキュメントから元の値を取得できます。これは、要素がインデックス化されるかどうかに関連しません。index: プロパティーがインデックス化されるかどうかを示します。異なる値は、Index.NO(インデックス付けなし、つまりクエリーで見つけることができない)、Index.YES(要素にインデックスが付けられて検索可能) です。デフォルト値はIndex.YESです。Index.NOは、プロパティーの検索が不可能であるものの、利用できる必要がある場合に便利です。注記Index.NOをAnalyze.YESまたはNorms.YESと組み合わせると有用なわけではありません。これは、analyzeとnormsと解析のプロパティーのインデックス作成が必要ないためです。analyze: プロパティーが分析されたかどうか (Analyze.YES) または (Analyze.NO) を判断します。デフォルト値はAnalyze.YESです。注記プロパティーを分析するかどうかは、要素をそのまま0検索する場合と、含まれる単語で検索するかによって異なります。テキストフィールドを分析することは理にかなっていますが、日付フィールドは分析しません。注記ソートに使用されるフィールドは、分析できません。norms: インデックス時間の改善情報を保存する必要があるかどうか (Norms.YES) または (Norms.NO) を示します。これを保存しないと、大量のメモリーを節約できますが、インデックスの時間が改善する情報は提供されません。デフォルト値はNorms.YESです。termVector: 用語と周波数のペア (term-frequency) のコレクションについて説明しています。この属性により、インデックス作成中にドキュメント内にベクターを保存することができます。デフォルト値はTermVector.NOです。この属性の異なる値は次のとおりです。Expand 値 定義 TermVector.YES 各ドキュメントのTerm Vectors を保存します。これにより、同期されたアレイが作成され、これらはドキュメント用語が含まれ、他は用語の周波数が含まれます。 TermVector.NO Term Vector は保存しないでください。 TermVector.WITH_OFFSETS Term Verctor およびトークンオフセット情報を保存します。これは TermVector.YES と同様で、用語の開始および終了オフセット位置情報が含まれます。 TermVector.WITH_POSITIONS Term Verctor およびトークン位置情報を保存します。これは TermVector.YES と同じですが、ドキュメント内の各用語の特徴も含まれます。 TermVector.WITH_POSITION_OFFSETS Term Vector 、トークンの位置、およびオフセット情報を格納します。これは、YES、WITH_OFFSETS、および WITH_POSITIONS の組み合わせです。 indexNullAs: デフォルトの null 値ごとに無視され、インデックスは作成されません。ただし、indexNullAsを使用すると、null値のトークンとして挿入される文字列を指定できます。デフォルトでは、この値はに設定されていますField.DO_NOT_INDEX_NULLそのことを示すnull値にインデックスを付けないでください。この値を次のように設定できますField.DEFAULT_NULL_TOKENデフォルトであることを示すnullトークンを使用する必要があります。このデフォルトのnullトークンは、hibernate.search.default_null_tokenを使用して設定に指定できます。このプロパティーが設定されておらず、指定した場合Field.DEFAULT_NULL_TOKEN文字列 _null_ がデフォルトとして使用されます。注記indexNullAsパラメーターを使用する場合は、検索クエリーで同じトークンを使用してnull値を検索することが重要です。また、この機能は、非分析フィールド () でのみ使用することが推奨されます。analyze=Analyze.NO警告カスタムFieldBridgeまたはTwoWayFieldBridgeを実装する場合、null 値のインデックス作成を処理するのは開発者の責任です (の JavaDocs を参照してください。LuceneOptions.indexNullAs())。
14.2.1.1.3. @NumericField リンクのコピーリンクがクリップボードにコピーされました!
@Field には @NumericField というコンパニオンアノテーションがあり、@Field または @DocumentId と同じスコープで指定できます。このプロパティーは、Integer、Long、Float、および LastName プロパティーに指定できます。インデックスの作成時に、値は Trie 構造を使用してインデックス化されます。プロパティーを数字フィールドとしてインデックス化すると、標準的な @Field プロパティーに対して同じクエリーを実行するよりも、効率的な範囲クエリーとソートが可能になります。@NumericField アノテーションは以下のパラメーターを受け入れます。
| 値 | 定義 |
|---|---|
| forField | (オプション) 数値としてインデックス化される関連 @Field の名前を指定します。@Field 宣言を超えるプロパティーが含まれる場合にのみ必須となります。 |
| precisionStep | (オプション) インデックスに Trie 構造を格納する方法を変更します。precisionStes を小さくすると、ディスク領域の使用率が高くなり、範囲やソートのクエリーが速くなります。値が大きいほど使用領域が少なくなり、クエリーのパフォーマンスは通常の @Fields の範囲のクエリーに近づくことになります。デフォルト値は 4 です。 |
NumericField は、Double、Long、Integer、Float のみをサポートしています。他の数値タイプには Lucene で同様の機能を活用できないため、残りのタイプはデフォルトまたはカスタムの TwoWayFieldBridge で文字列エンコーディングを使用する必要があります。
NumericFieldBridge を使用することができます。
例14.9 カスタム NumericFieldBridge の定義
14.2.1.1.4. @Id リンクのコピーリンクがクリップボードにコピーされました!
id (identifier) プロパティーは、特定のエンティティーのインデックスを一意に保つために Hibernate Search で使用される特別なプロパティーです。設計上、id は保存する必要があり、トークン化しないでください。プロパティーをインデックス識別子としてマークするには、@DocumentId アノテーションを使用します。JPA を使用し、@Id を指定した場合は、@DocumentId を省略できます。選択したエンティティー ID は、ドキュメント識別子として使用されます。
例14.10 インデックス付きプロパティーの指定
id、Abstract、text、grade の 4 つのフィールドでインデックスを定義します。デフォルトでは、JavaBean 仕様にしたがってフィールド名は大文字では表示されないことに注意してください。Grade フィールドは、デフォルトよりも若干精度の高いステップで数字としてアノテーションが付けられます。
14.2.1.2. 複数回のプロパティーのマッピング リンクのコピーリンクがクリップボードにコピーされました!
例14.11 @Fields を使用してプロパティーを複数回マップする
summary は 2 回インデックス化されます。これはトークン化方式の summary、非トークン化方式の summary_forSort で行われます。
14.2.1.3. 埋め込みおよび関連オブジェクト リンクのコピーリンクがクリップボードにコピーされました!
address.city:Atlanta に変換されます)。場所フィールドは、Place インデックスでインデックス化されます。Placement インデックスドキュメントには、クエリー可能な address.id、address.street、address.city フィールドも含まれます。
例14.12 インデックスアソシエーション
@IndexedEmbedded 技術を使用すると、データは Lucene インデックスで非正規化されるため、Hibernate Search は Place オブジェクトのすべての変更と、インデックスを最新の状態に保つため Address オブジェクトの変更を認識する必要があります。Place Lucene ドキュメントが Address の変更時に更新されるようにするには、双方向関係の反対側に @ContainedIn のマークを付けます。
@ContainedIn はエンティティーを参照する関連付けや、組み込み (コレクション) オブジェクトを参照する関連付けで役立ちます。
例14.13 @IndexedEmbedded および @ContainedIn のネスト化された使用方法
@*ToMany, @*ToOne および @Embedded 属性は、@IndexedEmbedded アノテーションを付けることができます。その後、関連クラスの属性が主なエンティティーインデックスに追加されます。例14.13「@IndexedEmbedded および @ContainedIn のネスト化された使用方法」 インデックスには以下のフィールドが含まれます。
- id
- name
- address.street
- address.city
- address.ownedBy_name
propertyName.で、従来のオブジェクトナビゲーション規則に従います。ownedBy プロパティーに示されるように、prefix 属性を使用して上書きできます。
depth プロパティーは、オブジェクトグラフにクラス (インスタンスではない) の cyclic 依存関係が含まれるときに必要になります。たとえば、Owner が Place をポイントする場合です。Hibernate Search は、予想される深さに達すると (またはオブジェクトグラフの境界に到達する)、インデックス化された組み込み属性を含まなくなります。自己参照を持つクラスは、cyclic 依存関係の例です。この例では、depth が 1 に設定されているため、Owner の @IndexedEmbedded 属性は無視されます。
@IndexedEmbedded を使用すると、以下のようなクエリーを表現できます (Lucene のクエリー構文を使用)。
- 名前に JBoss が含まれ、住所の都市がアトランタである場所を返します。Lucene クエリーでは、以下のようになります。
+name:jboss +address.city:atlanta
+name:jboss +address.city:atlantaCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 名前に JBoss が含まれ、所有者の名前に Joe が含まれる場所を返します。Lucene クエリーでは、以下のようになります。
+name:jboss +address.ownedBy_name:joe
+name:jboss +address.ownedBy_name:joeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
@Indexed にすることができます (ただし、必須ではありません)。
@ContainedIn を付ける必要があります (前述の例を参照)。これがない場合、Hibernate Search は関連エンティティーの更新時にルートインデックスを更新することはできません (この例では、関連付けられた Address インスタンスの更新時に Place インデックスドキュメントを更新する必要があります)。
@IndexedEmbedded アノテーションが付けられたオブジェクトタイプは、Hibernate および Hibernate Search によってターゲットに設定されたオブジェクトタイプではない場合があります。これは、インターフェースが実装の代わりに使用される場合にとくに当てはまります。このため、Hibernate Search の対象となるオブジェクトタイプを、targetElementパラメーター。
例14.14 @IndexedEmbedded の targetElementプロパティーの使用
14.2.1.4. 特定のパスへのオブジェクト埋め込みの制限 リンクのコピーリンクがクリップボードにコピーされました!
@IndexedEmbedded アノテーションは属性も提供しますincludePathsの代わりに使用できますdepth、またはそれと組み合わせる。
depth のみを使用すると、埋め込み型のインデックス設定されたフィールドはすべて、同じデプスで再帰的に追加されます。これにより、他のフィールドもすべて追加せずに特定のパスのみを選択することが困難になります。これは必須ではありません。
@IndexedEmbedded の includePaths プロパティーの使用」 のようにパスを明示的に指定する必要がある場合があります。
例14.15 @IndexedEmbedded の includePaths プロパティーの使用
@IndexedEmbedded の includePaths プロパティーの使用」、名前 や名前、および/または 親 の 名前 で 人物 を検索できます。親の surname をインデックス化しないため、親の surname を検索することはできません。ただし、インデックス作成を迅速化し、スペースを節約して、全体的なパフォーマンスを向上させることができます。
@IndexedEmbeddedincludePaths制限された値を指定して通常インデックスを作成 するものに加えて、指定されたパスが含まれますdepth。使用する場合includePaths、そして去るdepth未定義、動作は設定と同等ですdepth= 0: 含まれているパスのみにインデックスが付けられます。
例14.16 @IndexedEmbedded の includePaths プロパティーの使用
@IndexedEmbedded の includePaths プロパティーの使用」、すべての人間の名前と名前の属性にインデックスが付けられます。また、depth 属性が原因で、親の名前と surname (姓) も再帰的に 2 行目にインデックス化されます。人が直接、自身の親、または親の名前で検索することができます。第 2 レベル以外では、姓 (surname) ではなく、もう 1 レベル (名前のみ) をインデックス化します。
id- プライマリーキーとして_hibernate_class- エンティティータイプを保存name- 直接フィールドとしてsurname- 直接フィールドとしてparents.name- デプス 1 の埋め込みフィールドとしてparents.surname- デプス 1 の埋め込みフィールドとしてparents.parents.name: デプス 2 の埋め込みフィールドとしてparents.parents.surname- デプス 2 の埋め込みフィールドとして親.parents.parents.name-によって指定された追加のパスとしてincludePaths。最初のparents.はフィールド名から推測され、残りのパスはincludePathsの属性です。
14.2.2. Boosting リンクのコピーリンクがクリップボードにコピーされました!
14.2.2.1. 静的インデックスの時間の改善 リンクのコピーリンクがクリップボードにコピーされました!
@Boost アノテーションを使用できます。このアノテーションは、@Field 内で使用することも、メソッドまたはクラスレベルで直接指定することもできます。
例14.17 @Boost のさまざまな使用方法
エッセイ が検索リストの一番上に到達する確率は 1.7 倍になります。Thesummaryフィールドは 3.0 になります (2 * 1.5、@Field.boostおよびプロパティーの @Boost は累積的です) より重要ですisbn分野。Thetextフィールドは 1.2 倍重要になりますisbn分野。この説明は、最も厳格な条件では間違っていますが、あらゆる実用的な目的において、実用性に十分に近い点に注意してください。
14.2.2.2. 動的インデックス時間の改善 リンクのコピーリンクがクリップボードにコピーされました!
@Boost アノテーション「静的インデックスの時間の改善」実行時のインデックス付きエンティティーの状態に依存しない静的ブースト係数を定義します。ただし、改善要因がエンティティーの実際の状態に依存する可能性があるユースケースがあります。この場合は、@DynamicBoost アノテーションと付随するカスタム BoostStrategy を使用できます。
例14.18 ダイナミックブーストの例
BoostStrategy インターフェースの実装として VIPBoostStrategy を指定するクラスレベルで定義されます。@DynamicBoost は、クラスまたはフィールドレベルのいずれかで配置できます。アノテーションの配置に応じて、エンティティー全体が defineBoost メソッドに渡されるか、アノテーションが付いたフィールド/プロパティー値のみに渡されます。渡されたオブジェクトを正しいタイプにキャストするのはユーザー自身です。この例では、VIP ユーザーのすべてのインデックス化された値が通常の人の値と同じくらい重要になります。
BoostStrategy 実装は、パブリックの no-arg コンストラクターを定義する必要があります。
@Boost と @DynamicBoost DynamicBoost アノテーションを混在させることができます。定義されたすべてのブースター要素は累積的です。
14.2.3. 分析 リンクのコピーリンクがクリップボードにコピーされました!
Analysis、テキストを 単一の用語 (単語) に変換するプロセスであり、フルテキスト検索エンジンの主な機能として見なされます。Lucene は、Analyzer の概念を使用してこのプロセスを制御します。以下のセクションでは、Hibernate Search がアナライザーを設定するために提供する複数の方法について説明します。
14.2.3.1. デフォルトの Analyzer とクラスによる Analyzer リンクのコピーリンクがクリップボードにコピーされました!
hibernate.search.analyzer プロパティーで設定できます。このプロパティーのデフォルト値は org.apache.lucene.analysis.standard.StandardAnalyzer です。
例14.19 @Analyzer のさまざまな使用方法
EntityAnalyzer を使用して、PropertyAnalyzer と FieldAnalyzer でインデックス化される summary と body を除き トークン化されたプロパティー (name) をインデックス化します。
14.2.3.2. Named Analyzers リンクのコピーリンクがクリップボードにコピーされました!
@Analyzer 宣言の多くで再利用でき、以下で構成されています。
- a name: 定義を参照するために使用される一意な文字列
- a list of char filters: 各文字型フィルターは、トークン化の前に入力文字を事前処理します。文字型フィルターでは、文字の追加、変更、削除ができます。一般的な使用方法として、文字を正規化する方法があります。
- a tokenizer: 入力ストリームを個別の単語にトークン化します。
- a list of filters: 各フィルターは、単語の削除や変更を行い、トークンライザーが提供するストリームに単語を追加することさえあります。
Tokenizer は、文字入力を TokenFilter によってさらに処理されるトークンに変換してトークン処理を開始します。Hibernate Search は Solr Analyzer フレームワークを使用してこのインフラストラクチャーをサポートします。
lucene-snowball jar も含める必要があり、PhoneticFilterFactory には、commons-codecjar が必要です。Hibernate Search のディストリビューションは、lib/optional ディレクトリーにこれらの依存関係を提供します。
@AnalyzerDef と Solr フレームワーク」。まず、文字型フィルターはファクトリーによって定義されます。この例では、マッピング文字型フィルターが使用され、マッピングファイルに指定されたルールに基づいて入力内の文字が置き換えられます。次にトークナイザーを定義します。この例では、標準トークナイザーを使用します。最後に同じように重要に、のフィルターの一覧がファクトリーによって定義されます。この例では、StopFilter フィルターは、専用の用語プロパティーファイルを読み取ります。フィルターはケースを無視することも予想されます。
例14.20 @AnalyzerDef と Solr フレームワーク
@AnalyzerDef アノテーションで定義された順序で適用されます。順序は重要です。
resource_charset パラメーターを追加して明示的に指定できます。
例14.21 特定の文字セットを使用したプロパティーファイルの読み込み
@Analyzer 宣言で再利用できます。例14.22「名前でアナライザーを参照する」。
例14.22 名前でアナライザーを参照する
@AnalyzerDef で宣言された Analyzer インスタンスは、SearchFactory の名前でも利用できます.これは、クエリーを構築する際に非常に便利です。
Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer("customanalyzer");
Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer("customanalyzer");
14.2.3.3. 利用可能なアナライザー リンクのコピーリンクがクリップボードにコピーされました!
| ファクトリー | 説明 | パラメーター | 追加の依存関係 |
|---|---|---|---|
MappingCharFilterFactory | リソースファイルで指定されたマッピングに基づいて、1 文字または複数の文字を 1 文字または複数の文字に置き換えます。 | マッピング: 次の形式を使用して、マッピングを含むリソースファイルを指します。
| none |
HTMLStripCharFilterFactory | HTML 標準のタグを削除し、テキストを保持します。 | none | none |
| ファクトリー | 説明 | パラメーター | 追加の依存関係 |
|---|---|---|---|
StandardTokenizerFactory | Lucene StandardTokenizer の使用 | none | none |
HTMLStripCharFilterFactory | HTML タグを削除し、テキストを保持して StandardTokenizer に渡します。 | none | solr-core |
PatternTokenizerFactory | 指定された正規表現パターンでテキストを区切ります。 | pattern: トークン化に使用する正規表現
group: トークンに抽出するパターングループを示します。
| solr-core |
| ファクトリー | 説明 | パラメーター | 追加の依存関係 |
|---|---|---|---|
StandardFilterFactory | 略語および単語からドットを削除する | none | solr-core |
LowerCaseFilterFactory | すべての単語を小文字にします | none | solr-core |
StopFilterFactory | ストップワードの一覧に一致する単語 (トークン) を削除します。 | words: ストップワードを含むリソースファイルを参照します。
ignoreCase: ストップワードを比較する際に
case が無視される必要がある場合は true、そうでない場合は false を設定します。
| solr-core |
SnowballPorterFilterFactory | 特定の言語で、単語を語根に減らします (例: protect、protects、protection は同じ語根を共有)。このようなフィルターを使用すると、関連する単語を検索できます。 | language: デンマーク語、オランダ語、英語、フィンランド語、フランス語、ドイツ語、イタリア語、ノルウェー語、ポルトガル語、ロシア語、韓国語、スウェーデン語など | solr-core |
ISOLatin1AccentFilterFactory | フランス語などの言語のアクセントを削除する | none | solr-core |
PhoneticFilterFactory | 音声的に類似したトークンをトークンストリームに挿入します | エンコーダー:DoubleMetaphone、Metaphone、Soundex または RefinedSoundex のいずれか
注入:
trueストリームにトークンを追加し、false既存のトークンを置き換えます
maxCodeLength: 生成されるコードの最大長を設定します。Metaphone および DoubleMetaphone エンコーディングでのみサポートされます
| solr-core および commons-codec |
CollationKeyFilterFactory | 各トークンを java.text.CollationKey に変換してから、IndexableBinaryStringTools を使用して CollationKeyを エンコードし、インデックス用語として保存できるようにします。 | カスタム、言語、国、バリアント、強度、分解
詳細については、Lucene の
Collat ionKeyFilterjavadocs を参照してください。
| solr- コア と コモンズ -io |
org.apache.solr.analysis.TokenizerFactory と org.apache.solr.analysis.TokenFilterFactory のすべての実装を確認して、利用可能な実装を確認することが推奨されます。
14.2.3.4. 動的アナライザーの選択 リンクのコピーリンクがクリップボードにコピーされました!
BlogEntry クラスの場合、アナライザーはエントリーの言語プロパティーに依存する可能性があります。このプロパティーによっては、実際のテキストにインデックスを付けるために正しい言語固有のスチーマーを選択する必要があります。
AnalyzerDiscriminator アノテーションが導入されました。例14.23「@AnalyzerDiscriminator の使用法」 このアノテーションの使用法を示します。
例14.23 @AnalyzerDiscriminator の使用法
@AnalyzerDiscriminator を使用するための前提条件は、動的に使用されるすべてのアナライザーが @AnalyzerDef 定義で事前定義されることです 。このような場合、クラスまたはアナライザーを動的に選択するエンティティーの特定のプロパティーに @AnalyzerDiscriminator アノテーションを配置することができます。AnalyzerDiscriminator の impl パラメーターを使用すると、Discriminator インターフェースの具体的な実装を指定できます。このインターフェースの実装は、ユーザー自身が提供する必要があります。実装が必要な唯一の方法は getAnalyzerDefinitionName() で、これは Lucene ドキュメントに追加された各フィールドに対して呼び出されます。インデックスを取得するエンティティーもインターフェースメソッドに渡されます。value パラメーターは、AnalyzerDiscriminator がクラスレベルではなくプロパティーレベルに配置されている場合にのみ設定されます。この場合、値はこのプロパティーの現在の値を表します。
Discriminator インターフェースの実装では、既存のアナライザー定義の名前を返し、デフォルトのアナライザーが上書きされない場合は null を返します。例14.23「@AnalyzerDiscriminator の使用法」 言語パラメーターは @AnalyzerDef で指定された名前に一致する 'de' または 'en' であることを仮定しています 。
14.2.3.5. アナライザーの取得 リンクのコピーリンクがクリップボードにコピーされました!
例14.24 完全テキストクエリーの構築時のスコープ付きテナントの使用
title フィールドでは標準アナライザーが使用され、title_stemmed フィールドには、スチーミングアナライザーが使用されます。検索ファクトリーによって提供されるアナライザーを使用すると、クエリーはターゲットフィールドに応じて適切なアナライザーを使用します。
@AnalyzerDef を介して定義されたアナライザーを、次を使用して定義名で取得することもできます。searchFactory.getAnalyzer(String)。
14.2.4. ブリッジ リンクのコピーリンクがクリップボードにコピーされました!
@Field アノテーションが付けられたエンティティープロパティーはすべて、インデックス化される文字列に変換する必要があります。これまでに言及していない理由は、Hibernate Search のほとんどのプロパティーでは、組み込みブリッジのセットにより翻訳ジョブが実行されるためです。ただし、場合によっては、翻訳プロセスをより細かく制御する必要があります。
14.2.4.1. ビルトインブリッジ リンクのコピーリンクがクリップボードにコピーされました!
- null
- デフォルトごと
null要素はインデックス付けされません。Lucene は null 要素をサポートしません。ただし、状況によっては、null値を表すカスタムトークンを追加すると便利です。詳細は、「@Field」 を参照してください。 - java.lang.String
- 文字列はそのままインデックス付けされます
- short、Short、integer、Integer、long、Long、float、Float、double、Double、BigInteger、BigDecimal
- 数値は文字列表現に変換されます。数値は Lucene (範囲指定のクエリーで使用される) によって追加されず、パディングする必要があることに注意してください。注記Range クエリーの使用には欠点があります。別の方法は、結果クエリーを適切な範囲に対してフィルターするフィルタークエリーを使用することです。Hibernate Search は、で説明されているように、カスタム StringBridge の使用もサポートします。「カスタムブリッジ」。
- java.util.Date
- 日付は yyyyMMddHHmmssSSS として GMT 時間 (EST 2006 年 11 月 7 日 4:03 PM 12 秒の場合は 200611072203012) として保存されます。内部形式を気にする必要はありません。TermRangeQuery を使用する場合は、グリニッジ標準時 (GMT) で日付を示す必要があることを把握しておくことが重要です。通常は、ミリ秒単位までの日付を保存する必要はありません。
@DateBridgeは、インデックス に保存する適切な分解能を定義します ((@DateBridge(resolution=Resolution.DAY))。日付のパターンは、それに応じて切り捨てられます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告分解能がMILLISECOND未満の日付は、@DocumentIdにはできません。重要デフォルトのDateブリッジは Lucene のDateToolsを使用して、Stringとの相互互換を行います。これは、すべての日付が GMT 時間で表されることを意味します。固定タイムゾーンに日付を保存する必要がある場合は、カスタムの日付ブリッジを実装する必要があります。日付のインデックス作成および検索に関するアプリケーションの要件を理解している。 - java.net.URI、java.net.URL
- URI および URL は文字列表現に変換されます。
- java.lang.Class
- クラスは完全修飾クラス名に変換されます。スレッドコンテキストクラスローダーは、クラスがリハイドレートされる際に使用されます。
14.2.4.2. カスタムブリッジ リンクのコピーリンクがクリップボードにコピーされました!
14.2.4.2.1. StringBridge リンクのコピーリンクがクリップボードにコピーされました!
Object を String ブリッジに実装を提供することです。これを実行するには、org.hibernate.search.bridge.StringBridge インターフェースを実装する必要があります。すべての実装は同時に使用されるため、スレッドセーフである必要があります。
例14.25 カスタム StringBridge の 実装
StringBridge の 実装」、@ FieldBridge アノテーションのおかげで、どのプロパティーまたはフィールドでもこのブリッジを使用できます。
@FieldBridge(impl = PaddedIntegerBridge.class) private Integer length;
@FieldBridge(impl = PaddedIntegerBridge.class)
private Integer length;
14.2.4.2.2. パラメーター化されたブリッジ リンクのコピーリンクがクリップボードにコピーされました!
ParameterizedBridge インターフェースを実装し、パラメーターは @FieldBridge アノテーションを介して渡されます。
例14.26 ブリッジ実装にパラメーターを渡す
ParameterizedBridge インターフェースは、StringBridge、TwoWayStringBridge、FieldBridge 実装で実装できます。
14.2.4.2.3. Type Aware Bridge リンクのコピーリンクがクリップボードにコピーされました!
- field/getter-level ブリッジのプロパティーの戻りタイプ。
- クラスレベルのブリッジのクラスタイプ。
AppliedOnTypeAwareBridge を実装するブリッジは、挿入時にブリッジが適用されるタイプを取得します。パラメーターと同様に、インジェクトされるタイプには、スレッドセーフティーに関する特別な作業は必要ありません。
14.2.4.2.4. Two-Way Bridge リンクのコピーリンクがクリップボードにコピーされました!
@DocumentId アノテーション付き) でブリッジ実装を使用する必要がある場合は、TwoWayStringBridge という名前の拡張バージョン StringBridge を使用する必要があります。Hibernate Search は、識別子の文字列表現を読み取り、そこからオブジェクトを生成する必要があります。@FieldBridge アノテーションの使用方法には違いがありません。
例14.27 id プロパティーに使用できる TwoWayStringBridge の実装
14.2.4.2.5. FieldBridge リンクのコピーリンクがクリップボードにコピーされました!
FieldBridge としてブリッジを実装することもできます。このインターフェースは、プロパティーの値を提供し、Lucene Document 内で希望する方法でマッピングできるようにします。たとえば、プロパティーを異なるドキュメントフィールドに保存できます。インターフェースの概念は Hibernate UserType と非常に似ています。
例14.28 FieldBridge インターフェイスの実装
LuceneOptions ヘルパーシステムに委任されます。このヘルパーは、Store や TermVector などの @Fieldで選択したオプションを適用するか、選択した @Boost 値を適用します。COMPRESS 実装の複雑性をカプセル化することは特に便利です。Document にフィールドを追加するために LuceneOptions に委譲することが推奨されますが、必要であれば、Document を直接編集して、LuceneOptions を無視しても問題ありません。
LuceneOptions などのクラスは、アプリケーションを Lucene API の変更から保護し、コードを簡素化するために作成されます。可能な場合はこれを使用しますが、さらに柔軟性が必要な場合は、使用しなくても問題ありません。
14.2.4.2.6. ClassBridge リンクのコピーリンクがクリップボードにコピーされました!
@ClassBridge および @ClassBridges アノテーションは、プロパティーレベルではなくクラスレベルで定義できます。この場合、カスタムフィールドブリッジ実装は、特定のプロパティーの代わりに、エンティティーインスタンスを値のパラメーターとして受信します。に表示されていませんが例14.29「クラスブリッジの実装」、@ClassBridge はtermVectorセクションで説明されている属性「基本的なマッピング」。
例14.29 クラスブリッジの実装
CatMissionClassBridge が department インスタンスに適用され、フィールドブリッジはブランチとネットワークの両方を連結し、この連結をインデックス化します。
14.3. クエリ リンクのコピーリンクがクリップボードにコピーされました!
FullTextSessionの作成- Hibernate Search クエリー DSL (推奨) または Lucene Query API を使用した Lucene クエリーの作成
org.hibernate.Queryを使用した Lucene クエリーのラップ- たとえば、を呼び出して検索を実行します
list()またscroll()
FullTextSession を使用します。この検索固有のセッションは、クエリーおよびインデックス機能を提供するために通常の org.hibernate.Session をラップします。
例14.30 FullTextSession の作成
Session session = sessionFactory.openSession(); ... FullTextSession fullTextSession = Search.getFullTextSession(session);
Session session = sessionFactory.openSession();
...
FullTextSession fullTextSession = Search.getFullTextSession(session);
FullTextSession を使用して、Hibernate Search クエリー DSL またはネイティブの Lucene クエリーのいずれかでフルテキストクエリーを構築します。
例14.31 QueryParser を介した Lucene クエリーの作成
org.hibernate.Query です。このクエリーは、HQL (Hibernate Query Language)、Native、および Criteria などの他の Hibernate クエリー機能と同じパラダイムに残ります。クエリーには、list()、uniqueResult()、iterate()、scroll() などのメソッドを使用します。
例14.32 JPAAPI を使用した検索クエリーの作成
FullTextQuery の取得方法を調整すると、同じ例を Java Persistence API で記述することもできます。
14.3.1. クエリーの構築 リンクのコピーリンクがクリップボードにコピーされました!
14.3.1.1. Lucene API を使用した Lucene クエリーの構築 リンクのコピーリンクがクリップボードにコピーされました!
14.3.1.2. Lucene クエリーの構築 リンクのコピーリンクがクリップボードにコピーされました!
QueryBuilder を使用することが推奨されます。
- メソッド名は英語です。そのため、API 操作は、一連の英語のフレーズおよび命令として読み取り、理解することができます。
- IDE オートコンプリートを使用します。これは、現在の入力プレフィックスの完了を容易にし、ユーザーが適切なオプションを選択できるようにします。
- 多くの場合、チェーンメソッドパターンを使用します。
- API 操作を簡単に使用でき、読み取ることができます。
indexedentitytype に割り当てられるクエリービルダーを作成します。この QueryBuilder は、使用するアナライザーと、適用するフィールドブリッジを認識します。複数の QueryBuilder (クエリーのルートに関連するエンティティータイプごとに 1 つ) を作成できます。QueryBuilder は SearchFactory から派生します。
QueryBuilder mythQB = searchFactory.buildQueryBuilder().forEntity( Myth.class ).get();
QueryBuilder mythQB = searchFactory.buildQueryBuilder().forEntity( Myth.class ).get();
QueryBuilder mythQB = searchFactory.buildQueryBuilder()
.forEntity( Myth.class )
.overridesForField("history","stem_analyzer_definition")
.get();
QueryBuilder mythQB = searchFactory.buildQueryBuilder()
.forEntity( Myth.class )
.overridesForField("history","stem_analyzer_definition")
.get();
Query オブジェクトを使用して生成されたカスタマイズされたクエリーは、Hibernate Search DSL とともに使用されます。
14.3.1.3. キーワードのクエリー リンクのコピーリンクがクリップボードにコピーされました!
Query luceneQuery = mythQB.keyword().onField("history").matching("storm").createQuery();
Query luceneQuery = mythQB.keyword().onField("history").matching("storm").createQuery();
| パラメーター | 説明 |
|---|---|
| keyword() | 特定の単語を検索するには、このパラメーターを使用します。 |
| onField() | このパラメーターを使用して、単語を検索する lucene フィールドを指定します。 |
| matching() | このパラメーターを使用して、検索文字列の一致を指定します。 |
| createQuery() | Lucene クエリーオブジェクトを作成します。 |
- 「storm」という値が
historyFieldBridgeから渡されます。これは、数値または日付が必要な場合に便利です。 - フィールドブリッジの値は、
historyフィールドインデックス化に使用されるアナライザーに渡されます。これにより、クエリーはインデックス (小文字、ngram、スチミングなど) よりも、同じ用語変換を使用します。分析プロセスで指定の単語が複数生成されると、ブールクエリーがSHOULD論理 (おおよそOR論理) とともに使用されます。
Date オブジェクトをその文字列表現 (この場合は年) に変換する必要がありました
FieldBridge に objectToString メソッド (およびすべての組み込み FieldBridge 実装) がある場合、すべてのオブジェクトに対して機能します。
y) を見つけることができます。ユーザーに透過的に実行されます。
ignoreAnalyzer()またignoreFieldBridge()関数を呼び出すことができます。
//search document with storm or lightning in their history
Query luceneQuery =
mythQB.keyword().onField("history").matching("storm lightning").createQuery();
//search document with storm or lightning in their history
Query luceneQuery =
mythQB.keyword().onField("history").matching("storm lightning").createQuery();
onFields方法。
Query luceneQuery = mythQB
.keyword()
.onFields("history","description","name")
.matching("storm")
.createQuery();
Query luceneQuery = mythQB
.keyword()
.onFields("history","description","name")
.matching("storm")
.createQuery();
andField() メソッドを使用します。
14.3.1.4. Fuzzy クエリー リンクのコピーリンクがクリップボードにコピーされました!
keyword クエリーから始め、fuzzy フラグを追加します。
threshold は、両方の用語で照合が考慮される制限です。0 から 1 までの小数で、デフォルト値は 0.5 です。prefixLength は、「fuzzyness」で無視される接頭辞の長さです。デフォルト値は 0 ですが、多数の異なる用語を含むインデックスにはゼロ以外の値が推奨されます。
14.3.1.5. ワイルドカードクエリー リンクのコピーリンクがクリップボードにコピーされました!
? は単一文字で、* は複数文字を表します。パフォーマンス維持のために、クエリーは ? または * で開始しないことが推奨されます。
* または ? のリスクが高すぎます。
14.3.1.6. フレーズクエリー リンクのコピーリンクがクリップボードにコピーされました!
phrase()そうするために。
Query luceneQuery = mythQB
.phrase()
.onField("history")
.sentence("Thou shalt not kill")
.createQuery();
Query luceneQuery = mythQB
.phrase()
.onField("history")
.sentence("Thou shalt not kill")
.createQuery();
14.3.1.7. 範囲クエリー リンクのコピーリンクがクリップボードにコピーされました!
14.3.1.8. クエリーの統合 リンクのコピーリンクがクリップボードにコピーされました!
SHOULD: クエリーには、サブクエリーの一致する要素が含まれる必要があります。MUST: クエリーには、サブクエリーの一致する要素が含まれる必要があります。MUST NOT: クエリーには、サブクエリーの一致する要素を含めないでください。
例14.33 クエリー してはいけません
例14.34 クエリー する必要があります
例14.35 クエリーし ない
14.3.1.9. クエリーオプション リンクのコピーリンクがクリップボードにコピーされました!
boostedTo(クエリータイプおよびフィールド上) は、クエリー全体または特定のフィールドを指定された係数に改善します。withConstantScore(クエリーで) は、ブーストに等しい一定のスコアを持つクエリーに一致するすべての結果を返します。filteredBy(Filter)(クエリー時)Filterインスタンスを使用してクエリー結果をフィルタリングします。ignoreAnalyzer(フィールド上) このフィールドを処理するとき、アナライザーを無視します。ignoreFieldBridge(フィールド上) このフィールドを処理するときにフィールドブリッジを無視します。
例14.36 クエリーオプションの組み合わせ
14.3.1.10. Hibernate Search クエリーの構築 リンクのコピーリンクがクリップボードにコピーされました!
14.3.1.10.1. 一般性 リンクのコピーリンクがクリップボードにコピーされました!
例14.37 Lucene クエリーを Hibernate クエリーでラップする
FullTextSession fullTextSession = Search.getFullTextSession( session ); org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
FullTextSession fullTextSession = Search.getFullTextSession( session );
org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
例14.38 エンティティータイプによる検索結果のフィルタリング
Customer のみを返します。同じ例の次の部分は、一致する Actor と Item を返します。タイプ制限はポリモーフィックです。そのため、2 つのサブクラス Salesman と、ベースクラス Person の Customer は、結果タイプに基づいてフィルタリングする Person.class を指定します。
14.3.1.10.2. ページネーション リンクのコピーリンクがクリップボードにコピーされました!
例14.39 検索クエリーのページ付けを定義する
org.hibernate.Query fullTextQuery =
fullTextSession.createFullTextQuery( luceneQuery, Customer.class );
fullTextQuery.setFirstResult(15); //start from the 15th element
fullTextQuery.setMaxResults(10); //return 10 elements
org.hibernate.Query fullTextQuery =
fullTextSession.createFullTextQuery( luceneQuery, Customer.class );
fullTextQuery.setFirstResult(15); //start from the 15th element
fullTextQuery.setMaxResults(10); //return 10 elements
fulltextQuery.getResultSize()
14.3.1.10.3. ソート リンクのコピーリンクがクリップボードにコピーされました!
例14.40 Lucene ソート の指定
14.3.1.10.4. ストラテジーの取得 リンクのコピーリンクがクリップボードにコピーされました!
例14.41 クエリーでの FetchMode の指定
Criteria criteria =
s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN );
s.createFullTextQuery( luceneQuery ).setCriteriaQuery( criteria );
Criteria criteria =
s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN );
s.createFullTextQuery( luceneQuery ).setCriteriaQuery( criteria );
getResultSize() は制限のある Criteria とともに使用された場合に SearchException をスローするため、Criteria クエリーで制限 (完全な句) を使用しないでください。
setCriteriaQuery。
14.3.1.10.5. プロジェクション リンクのコピーリンクがクリップボードにコピーされました!
Object[] のリストを返します。プロジェクションは、データベースのラウンドトリップが長くなるのを防ぎます。ただし、以下の制限があります。
- 予測されるプロパティーはインデックス (
@Field(store=Store.YES)) に保存され、インデックスサイズが増えます。 - 予測されるプロパティーは、
org.hibernate.search.bridge.TwoWayFieldBridgeまたはorg.hibernate.search.bridge.TwoWayStringBridgeを実装するFieldBridgeを使用する必要があり、後者はより単純なバージョンになります。注記Hibernate Search の組み込みタイプはすべて双方向です。 - インデックス化されたエンティティーまたはその埋め込み関連の簡単なプロパティーのみを展開できます。したがって、埋め込みエンティティー全体を展開できません。
@IndexedEmbeddedでインデックス化されるコレクションやマップで機能しません。
例14.42 投影法を使用したメタデータの取得
FullTextQuery.THIS初期化され管理されたエンティティーを返します (展開されていないクエリーが実行される場合)。FullTextQuery.DOCUMENT展開されるオブジェクトに関連する Lucene ドキュメントを返します。FullTextQuery.OBJECT_CLASS: インデックス化されたエンティティーのクラスを返します。FullTextQuery.SCORE: クエリーのドキュメントスコアを返します。スコアは、あるクエリーの結果を別のクエリーに対する比較には便利ですが、異なるクエリーの結果を比較する場合に有用ではありません。FullTextQuery.ID: 予測されるオブジェクトの ID プロパティー値。FullTextQuery.DOCUMENT_ID: Lucene ドキュメント ID。この値を Lucene ドキュメント ID として使用すると、異なる 2 つの IndexReader を開くたびに変更される可能性があります。FullTextQuery.EXPLANATION: 指定のクエリーの一致するオブジェクト/ドキュメントの Lucene Explanation オブジェクトを返します。これは、大量のデータを取得するのには適していません。通常、実行の説明は、一致する要素ごとに Lucene クエリー全体を実行することを意味します。そのため、展開が推奨されます。
14.3.1.10.6. オブジェクト初期化ストラテジーのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
例14.43 クエリーを使用する前の 2 次キャッシュのチェック
FullTextQuery query = session.createFullTextQuery(luceneQuery, User.class);
query.initializeObjectWith(
ObjectLookupMethod.SECOND_LEVEL_CACHE,
DatabaseRetrievalMethod.QUERY
);
FullTextQuery query = session.createFullTextQuery(luceneQuery, User.class);
query.initializeObjectWith(
ObjectLookupMethod.SECOND_LEVEL_CACHE,
DatabaseRetrievalMethod.QUERY
);
ObjectLookupMethod は、オブジェクトをデータベースから取得せずに簡単にアクセスできるかどうかを確認するストラテジーを定義します。その他のオプションは以下のとおりです。
ObjectLookupMethod.PERSISTENCE_CONTEXTは、一致する多くのエンティティーが永続コンテキストにすでにロードされている場合に使用されます (SessionまたはEntityManagerにロードされている場合)。ObjectLookupMethod.SECOND_LEVEL_CACHEは永続コンテキストをチェックし、2 次キャッシュを確認します。
- 2 次キャッシュを正しく設定およびアクティブ化します。
- 関連するエンティティーの 2 次キャッシュを有効にします。これは、
@Cacheableなどのアノテーションを使用してを行います。 Session、EntityManager、またはQueryのいずれかの 2 次キャッシュ読み取りアクセスを有効にします。Hibernate ネイティブ API ではCacheMode.NORMALを使用し、Java Persistence API ではCacheRetrieveMode.USEを使用します。
ObjectLookupMethod.SECOND_LEVEL_CACHE は使用しないでください。他の 2 次レベルのキャッシュプロバイダーはこのオペレーションを効率的に実装しません。
DatabaseRetrievalMethod を使用して、以下のようにデータベースからオブジェクトを読み込む方法をカスタマイズします。
QUERY(デフォルト) はクエリーのセットを使用して、複数のオブジェクトを各バッチに読み込みます。このアプローチが推奨されます。FIND_BY_IDは、Sessionを使用して一度に 1 つのオブジェクトをロードします。getまたはEntityManager。findセマンティック。これは、Hibernate Core がエンティティーをバッチでロードできるようにする、エンティティーにバッチサイズが設定されている場合に推奨されます。
14.3.1.10.7. クエリー時間の制限 リンクのコピーリンクがクリップボードにコピーされました!
- 制限を指定して受信する際に例外を発生させます。
- 時間制限が発生したときに取得する結果の数に制限します。
14.3.1.10.8. 時間制限の例外発生 リンクのコピーリンクがクリップボードにコピーされました!
QueryTimeoutException が発生します (プログラム API に応じた、org.hibernate.QueryTimeoutException または javax.persistence.QueryTimeoutException)。
例14.44 クエリー実行でのタイムアウトの定義
getResultSize()、iterate()とscroll()メソッド呼び出しが終了するまでのタイムアウトを尊重します。その結果、Iterable または ScrollableResults は、タイムアウトを無視します。さらに、explain()このタイムアウト期間は尊重されません。この方法は、デバッグに使用され、クエリーのパフォーマンス低下の原因をチェックします。
例14.45 クエリー実行でのタイムアウトの定義
14.3.2. 結果の取得 リンクのコピーリンクがクリップボードにコピーされました!
list()、uniqueResult()、iterate()、scroll()利用可能です。
14.3.2.1. パフォーマンスに関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
list()またuniqueResult()をお勧めします。list() は、エンティティー batch-size が正しく設定されている場合に最適に機能します。Hibernate Search を使用する場合、(ページネーション内の) すべての LuceneHits 要素を処理する必要があることに注意してください。list()、uniqueResult()とiterate()。
scroll() の方が適しています。ScrollableResults オブジェクトは Lucene のリソースを保持しているので、終了したら閉じることを忘れないでください。使用する予定の場合scroll,ただし、オブジェクトをバッチでロードしたい場合は、次を使用できます。query.setFetchSize()。オブジェクトにアクセスし、読み込まれていない場合、Hibernate Search は次の fetchSize オブジェクトをパスに読み込みます。
14.3.2.2. 結果サイズ リンクのコピーリンクがクリップボードにコピーされました!
- Google 検索で提供された、全体的な検索結果機能を提供たとえば、"約 888,000,000 件のうちの 1-10」のようになります。
- 高速なページネーションナビゲーションを実装する
- クエリーがゼロを返すか、十分な結果がない場合に概算を追加する複数ステップの検索エンジンを実装するには、以下を実行します。
例14.46 クエリーの結果サイズの決定
14.3.2.3. ResultTransformer リンクのコピーリンクがクリップボードにコピーされました!
Object 配列として返されます。オブジェクトに使用されるデータ構造がアプリケーションの要件と一致しない場合は、ResultTransformer を適用します。ResultTransformer は、クエリーの実行後に必要なデータ構造を構築します。
例14.47 プロジェクションでの ResultTransformer の使用
ResultTransformer 実装の例は、ibernate Core codebase を参照してください。
14.3.2.4. 結果について リンクのコピーリンクがクリップボードにコピーされました!
Luke ツールは結果を理解する際に役立ちます。ただし、Hibernate Search を使用すると、所定の結果 (特定のクエリー内) の Lucene Explanation オブジェクトにアクセスできます。このクラスは Lucene ユーザーに非常に高度なものとみなされますが、オブジェクトの性質をよく理解することができます。特定の結果について Explanation オブジェクトにアクセスするには、以下のいずれかの方法があります。
- 使用
fullTextQuery.explain(int)方法 - プロジェクションの使用
FullTextQuery.DOCUMENT_ID 定数を使用して取得できます。
FullTextQuery.EXPLANATION 定数を使用して Explanation オブジェクトをプロジェクトします。
例14.48 プロジェクトを使用した Lucene の説明オブジェクトの取得
14.3.3. フィルター リンクのコピーリンクがクリップボードにコピーされました!
- セキュリティー
- 一時的なデータ (例: 先月のデータのみ表示)
- 予測フィルター (例: 検索は所定カテゴリーに限定される)
例14.49 クエリーのフルテキストフィルターの有効化
fullTextQuery = s.createFullTextQuery( query, Driver.class );
fullTextQuery.enableFullTextFilter("bestDriver");
fullTextQuery.enableFullTextFilter("security").setParameter( "login", "andre" );
fullTextQuery.list(); //returns only best drivers where andre has credentials
fullTextQuery = s.createFullTextQuery( query, Driver.class );
fullTextQuery.enableFullTextFilter("bestDriver");
fullTextQuery.enableFullTextFilter("security").setParameter( "login", "andre" );
fullTextQuery.list(); //returns only best drivers where andre has credentials
@FullTextFilterDef アノテーションを使用して実行されます。このアノテーションは、フィルターが後に適用されるクエリーに関係なく、@Indexed エンティティーに設定できます。これは、フィルター定義がグローバルであり、名前が一意である必要があることを意味します。同じ名前を持つ @FullTextFilterDef アノテーションが定義される場合は、SearchException が発生します。名前付きの各フィルターは、実際のフィルター実装を指定する必要があります。
例14.50 フィルターの定義と実装
@FullTextFilterDefs( {
@FullTextFilterDef(name = "bestDriver", impl = BestDriversFilter.class),
@FullTextFilterDef(name = "security", impl = SecurityFilterFactory.class)
})
public class Driver { ... }
@FullTextFilterDefs( {
@FullTextFilterDef(name = "bestDriver", impl = BestDriversFilter.class),
@FullTextFilterDef(name = "security", impl = SecurityFilterFactory.class)
})
public class Driver { ... }
BestDriversFilter は簡単な Lucene フィルターの例です。これにより、スコアが 5 のドライバーに設定された結果が減少します。この例では、指定したフィルターは org.apache.lucene.search.Filter を直接実装し、no-arg コンストラクターが含まれます。
例14.51 ファクトリーパターンを使用してフィルターを作成する
@Factory アノテーションが付けられたメソッドを検索し、そのメソッドを使用してフィルターインスタンスを作成します。ファクトリーには no-arg コンストラクターが必要です。
例14.52 定義されたフィルターへのパラメーターの受け渡し
fullTextQuery = s.createFullTextQuery( query, Driver.class );
fullTextQuery.enableFullTextFilter("security").setParameter( "level", 5 );
fullTextQuery = s.createFullTextQuery( query, Driver.class );
fullTextQuery.enableFullTextFilter("security").setParameter( "level", 5 );
例14.53 フィルター実装におけるパラメーターの使用
@Key アノテーションが付けられたメソッドは FilterKey オブジェクトを返すことに注意してください。返されたオブジェクトには特別なコントラクトを持ちます。キーオブジェクトは equals() / hashCode() を実装し、指定される Filter タイプが同一で、パラメーターのセットが同じである場合にのみ、両方の鍵が同じになるようにする必要があります。つまり、鍵の生成元となるフィルターが交換可能な場合、あるいは交換可能である場合にのみ、両方のフィルター鍵が同等になります。キーオブジェクトは、キャッシュメカニズムのキーとして使用されます。
@Key メソッドは以下の場合にのみ必要です。
- フィルターキャッシングシステムが有効になっている (デフォルトでは有効)。
- フィルターにはパラメーターがあります。
StandardFilterKey 実装を使用すれば十分です。それは委任しますequals()/hashCode()各パラメーター equals および hashcode メソッドへの実装。
SoftReferences に最も使用されるフィルターを変換します。ハード参照キャッシュの制限に達すると、追加のフィルターが SoftReferences としてキャッシュされます。ハード参照キャッシュのサイズを調整するには、hibernate.search.filter.cache_strategy.size (デフォルトは 128 に設定) を使用します。フィルターキャッシングの高度な使用のために、独自の FilterCachingStrategy を実装します。classname は hibernate.search.filter.cache_strategy によって定義されます。
CachingWrapperFilter を中心に IndexReader を使用してフィルターをラッピングすることが一般的です。ラッパーは、から返された DocIdSet をキャッシュしますgetDocIdSet(IndexReader reader)高価な再計算を回避する方法。リーダーは、開いた時点のインデックスの状態を効果的に表示するため、計算した DocIdSet が同じ IndexReader インスタンスに対してのみキャッシュ可能であることを示すことが重要です。ドキュメントリストは、開いている IndexReader 内では変更できません。ただし、別の、新しい IndexReader インスタンスの場合は、(別のインデックスから、または単にインデックスが変更されたため) 異なる Document のセットで動作する可能性があるため、キャッシュされた DocIdSet を再計算する必要があります。
@FullTextFilterDef の cache フラグは、デフォルトでは FilterCacheModeType.INSTANCE_AND_DOCIDSETRESULTS に設定されています。これにより、フィルターインスタンスを自動的にキャッシュし、CachingWrapperFilter の Hibernate 固有の実装に指定されたフィルターをラップします。このクラスの Lucene のバージョンとは対照的に、SoftReference はハード参照数とともに使用されます (フィルターキャッシュについて参照)。ハード参照数は、hibernate.search.filter.cache_docidresults.size (デフォルトは 5 に設定) を使用して調整できます。ラッピング動作は、the@FullTextFilterDef.cache パラメーターを使用して制御できます。このパラメーターには、以下の異なる値があります。
| 値 | 定義 |
|---|---|
| FilterCacheModeType.NONE | フィルターインスタンスがなく、Hibernate Search によって結果がキャッシュされません。フィルター呼び出しごとに、新しいフィルターインスタンスが作成されます。この設定は、データセットまたはメモリーが制限される環境を迅速に変更する際に役に立つことがあります。 |
| FilterCacheModeType.INSTANCE_ONLY | フィルターインスタンスはキャッシュされ、同時実行全体で再利用されますFilter.getDocIdSet()呼び出します。DocIdSet の結果はキャッシュされません。この設定は、フィルターが固有のキャッシングメカニズムを使用するか、アプリケーション固有のイベントにより DocIdSet をキャッシュする必要がない場合に動的にフィルターの結果が変更される場合に役立ちます。 |
| FilterCacheModeType.INSTANCE_AND_DOCIDSETRESULTS | フィルターインスタンスと DocIdSet 両方の結果がキャッシュされます。これはデフォルト値です。 |
- システムはターゲットエンティティーインデックスを頻繁に更新しません (つまり、IndexReader は頻繁に再利用されます)。
- Filter の DocIdSet の計算には、クエリーの実行にかかった時間と比較して負荷がかかります。
14.3.3.1. シャード化された環境でのフィルターの使用 リンクのコピーリンクがクリップボードにコピーされました!
手順14.1 インデックスシャードのサブセットのクエリー
- フィルター設定に応じて
IndexManagerのサブセットを選択するシャード化ストラテジーを作成します。 - クエリー時にフィルターをアクティブにします。
例14.54 インデックスシャードのサブセットのクエリー
customer フィルターがアクティブな場合は、クエリーが特定の顧客シャードに対して実行されます。
custom という名前のフィルターがある場合、この顧客専用のシャードのみがクエリーされ、それ以外の場合はすべてのシャードが返されます。所定のシャード化ストラテジーは、単一または複数のフィルターに対応し、それらのパラメーターに依存します。
ShardSensitiveOnlyFilter クラスを指定します。
ShardSensitiveOnlyFilter を使用して Lucene フィルターを実装する必要はありません。シャード化された環境のクエリーを加速するには、これらのフィルターに対応するフィルターおよびシャード化ストラテジーを使用することが推奨されます。
14.3.4. ファセット リンクのコピーリンクがクリップボードにコピーされました!
例14.55 Amazon で HibernateSearch を検索する
QueryBuilder クラスおよび FullTextQuery クラスは、ファセット API へのエントリーポイントです。前者は要求を作成し、後者は FacetManager にアクセスします。FacetManager はクエリーにファセット要求を適用し、検索結果を絞り込むために既存のクエリーに追加されるブックマークを選択します。例では、次に示すようにエンティティー Cd を使用します。例14.56「エンティティー Cd」:
図14.1 Amazon で HibernateSearch を検索する
例14.56 エンティティー Cd
14.3.4.1. ファセット要求の作成 リンクのコピーリンクがクリップボードにコピーされました!
FacetingRequest を作成することです。現時点では、2 種類のセッティング要求がサポートされています。最初のタイプは discrete faceting と呼ばれ、次のタイプは range faceting 要求と呼ばれます。個別のファセットリクエストの場合は、ファセット (分類) を行うインデックスフィールドと、適用するファセットオプションを指定します。個別のファセットリクエストの例は、次のように表示されます。例14.57「個別のファセットリクエストの作成」:
例14.57 個別のファセットリクエストの作成
label フィールドの個別値ごとに Facetインスタンスが作成されます。ファセット インスタンスは、この特定のフィールド値が元のクエリー結果内で発生する頻度を含む実際のフィールド値を記録します。orderedBy、includeZeroCountsとmaxFacetCountは、任意のファセット要求に適用できるオプションのパラメーターです。orderedBy 作成されたファセットが返される順序を指定できます。デフォルトはFacetSortOrder.COUNT_DESC、ただし、フィールド値または範囲が指定された順序で並べ替えることもできます。includeZeroCount カウントが 0 のファセットを結果に含めるかどうかを決定します (デフォルトでは含まれます)。maxFacetCount返されるファセットの最大量を制限できます。
String、Date、または Number および null の値を持つものは使用しないでください。さらに、プロパティーは Analyze.NO でインデックス化する必要があり、数値プロパティー @NumericField を指定する場合は指定する必要があります。
below とabove指定できるのは 1 回だけですが、指定できるのはいくつでもかまいませんfrom-toあなたが望むように範囲。範囲の境界ごとに、次の方法で指定することもできます。excludeLimit範囲に含まれるかどうか。
例14.58 範囲ファセットリクエストの作成
14.3.4.2. ファセット要求の適用 リンクのコピーリンクがクリップボードにコピーされました!
FullTextQuery クラスを介して取得できる FacetManager クラスでクエリーに適用されます。
getFacets()で後から取得できます。もありますdisableFaceting()名前を指定してファセットリクエストを無効にできるメソッド。
例14.59 ファセット要求の適用
14.3.4.3. クエリー結果の制限 リンクのコピーリンクがクリップボードにコピーされました!
Facet を適用できます。そのためには、FacetSelection を使用できます。FacetSelection は FacetManager を介して利用可能であり、クエリー基準としてファセットを選択できます (selectFacets)、ファセット制限を削除します (deselectFacets)、すべてのファセット制限を削除します (clearSelectedFacets) そして現在選択されているすべてのファセットを取得します (getSelectedFacets)。例14.60「FacetSelection のアプリケーションによるクエリー結果の制限」 例を示します。
例14.60 FacetSelection のアプリケーションによるクエリー結果の制限
14.3.5. クエリープロセスの最適化 リンクのコピーリンクがクリップボードにコピーされました!
- Lucene クエリー。
- 読み込まれたオブジェクト数: ページネーション (常時) またはインデックス処理 (必要な場合) を使用します。
- Hibernate Search が Lucene リーダーと対話する方法: 適切なリーダーストラテジーを定義します。
- インデックスから頻繁に抽出された値をキャッシュします。「インデックス値のキャッシュ: FieldCache」 を参照してください。
14.3.5.1. インデックス値のキャッシュ: FieldCache リンクのコピーリンクがクリップボードにコピーされました!
CacheFromIndex アノテーションを使用すると、Hibernate Search に必要なメインのメタデータフィールドのキャッシュをさまざまな方法で試すことができます。
CLASS: Hibernate Search は Lucene FieldCache を使用して、インデックスからクラスタイプの抽出のパフォーマンスを改善します。この値はデフォルトで有効になっており、@CacheFromIndexアノテーションを指定しない場合に Hibernate Search が適用されます。ID: プライマリー識別子はキャッシュを使用します。これにより、パフォーマンスが最も高いクエリーが提供されますが、消費するメモリーが多くなり、パフォーマンスが低下する可能性があります。
- メモリー使用量: このキャッシュには、かなりメモリーがハングします。通常、CLASS キャッシュの要件は ID キャッシュの要件よりも低くなります。
- インデックスウォームアップ: フィールドキャッシュを使用する場合、新しいインデックスまたはセグメントの最初のクエリーは、キャッシュが有効になっていない場合よりも遅くなります。
CLASS フィールドキャッシュを有効にしても使用されない可能性があります。たとえば、単一クラスをターゲットとしている場合は、返される値はすべてそのタイプのものになります (これは各クエリー実行時に評価されます)。
TwoWayFieldBridge(すべてのブリッジの構築として) を使用し、特定のクエリーに読み込まれるすべてのタイプが id のフィールド名を使用し、同じタイプの ID が割り当てられている必要があります (これは各クエリー実行時に評価されます)。
14.4. 手動によるインデックスの変更 リンクのコピーリンクがクリップボードにコピーされました!
14.4.1. インデックスへのインスタンスの追加 リンクのコピーリンクがクリップボードにコピーされました!
FullTextSession を使用します。index(T entity)特定のオブジェクトインスタンスをインデックスに直接追加または更新できます。このエンティティーがすでにインデックス化されている場合は、インデックスが更新されます。インデックスへの変更は、トランザクションコミット時にのみ適用されます。
例14.61 FullTextSession.index (T エンティティー) を介したエンティティーのインデックス作成
FullTextSession fullTextSession = Search.getFullTextSession(session); Transaction tx = fullTextSession.beginTransaction(); Object customer = fullTextSession.load( Customer.class, 8 ); fullTextSession.index(customer); tx.commit(); //index only updated at commit time
FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
Object customer = fullTextSession.load( Customer.class, 8 );
fullTextSession.index(customer);
tx.commit(); //index only updated at commit time
MassIndexer を使用することが推奨されます。詳細は「MassIndexer の使用」を参照してください。
14.4.2. インデックスからのインスタンスの削除 リンクのコピーリンクがクリップボードにコピーされました!
FullTextSession を介しても実行されます。
例14.62 インデックスからエンティティーの特定のインスタンスを削除
purgeAll方法。この操作により、パラメーターとして渡されたタイプのすべてのエンティティーとそのすべてのサブタイプが削除されます。
例14.63 エンティティーのすべてのインスタンスをインデックスから削除する
index、purge、とpurgeAllFullTextEntityManager でも利用できます。
index、purge、とpurgeAll) データベースではなくインデックスにのみ影響しますが、トランザクションであるため、トランザクションが正常にコミットされるか、使用するまで適用されません。flushToIndexes。
14.4.3. インデックスの再構築 リンクのコピーリンクがクリップボードにコピーされました!
FullTextSessionを使用します。flushToIndexes()FullTextSessionを使用している間、定期的に。index()すべてのエンティティーで。MassIndexerを使用。
14.4.3.1. FlushToIndexes() の使用 リンクのコピーリンクがクリップボードにコピーされました!
FullTextSession.purgeAll() および FullTextSession.index() を使用してすべてのエンティティーをインデックスに戻すことで構成されますが、メモリーと効率の制約があります。効率を最大限に高めるためにも、Hibernate Search はインデックス操作をバッチ処理し、コミット時に実行します。大量のデータをインデックス化する場合は、トランザクションがコミットされるまですべてのドキュメントがキューに保存されるため、メモリー消費について注意する必要があります。キューを定期的に空にしないと、OutOfMemoryException が発生する可能性があります。この使用を行うにはfullTextSession.flushToIndexes()。毎回fullTextSession.flushToIndexes()が呼び出されると (またはトランザクションがコミットされた場合)、バッチキューが処理され、すべてのインデックス変更が適用されます。フラッシュ後は、変更をロールバックできないことに注意してください。
例14.64 index() および flushToIndexes() を使用したインデックス再構築
hibernate.search.default.worker.batch_size が非推奨となりました。
14.4.3.2. MassIndexer の使用 リンクのコピーリンクがクリップボードにコピーされました!
MassIndexer は、複数の並列スレッドを使用してインデックスを再ビルドします。オプションで、リロードする必要のあるエンティティーを選択するか、またはすべてのエンティティーのインデックスを変更できます。このアプローチは、パフォーマンスを最大化するために最適化されていますが、アプリケーションをメンテナンスモードに設定する必要があります。MassIndexer がビジーな場合、インデックスのクエリーは推奨されません。
例14.65 MassIndexer を使用してインデックスを再構築する
fullTextSession.createIndexer().startAndWait();
fullTextSession.createIndexer().startAndWait();
例14.66 調整された MassIndexer の使用
FieldBridge または ClassBridge を処理する必要もあります。スレッドは、変換プロセス中に追加属性のレイジーローディングをトリガーします。そのため、並行して機能しているスレッドは多く必要になります。実際のインデックス書き込みで稼働しているスレッドの数は、各インデックスのバックエンド設定によって定義されます。
CacheMode.IGNORE (デフォルト) のままにすることが推奨されます。これは、ほとんどの場合でキャッシュが不要な追加オーバーヘッドになるためです。メインのエンティティーがインデックスに含まれる列挙のようなデータに関連する場合は、パフォーマンスを向上させる可能性があるため、データに応じて他の CacheMode を有効にすると便利です。
hibernate.search.[default|<indexname>].exclusive_index_usehibernate.search.[default|<indexname>].indexwriter.max_buffered_docshibernate.search.[default|<indexname>].indexwriter.max_merge_docshibernate.search.[default|<indexname>].indexwriter.merge_factorhibernate.search.[default|<indexname>].indexwriter.merge_min_sizehibernate.search.[default|<indexname>].indexwriter.merge_max_sizehibernate.search.[default|<indexname>].indexwriter.merge_max_optimize_sizehibernate.search.[default|<indexname>].indexwriter.merge_calibrate_by_deleteshibernate.search.[default|<indexname>].indexwriter.ram_buffer_sizehibernate.search.[default|<indexname>].indexwriter.term_index_interval
max_field_length がありましたが、これは Lucene から削除されました。これは、LimitTokenCountAnalyzer を使用して同様の効果を得ることができます。
.indexwriter パラメーターは Lucene 固有で、Hibernate Search はこれらのパラメーターを渡します。
MassIndexer は、前方のみのスクロール可能な結果を使用して、読み込まれるプライマリーキーを繰り返し処理しますが、MySQL の JDBC ドライバーはメモリーのすべての値を読み込みます。この「最適化」を回避するには、idFetchSize を Integer.MIN_VALUE に設定します。
14.5. インデックスの最適化 リンクのコピーリンクがクリップボードにコピーされました!
- アイドル状態のシステムの場合、または検索が頻繁に行われない場合
- 多数のインデックス変更が適用された後。
MassIndexer (「MassIndexer の使用」 を参照) は、デフォルトで、開始時と処理終了時にインデックスを最適化します。MassIndexer を使用します。optimizeAfterPurgeおよび MassIndexer。optimizeOnFinishこのデフォルトの動作を変更します。
14.5.1. 自動最適化 リンクのコピーリンクがクリップボードにコピーされました!
- 一定量の操作 (挿入または削除)。
- 一定量のトランザクション。
例14.67 自動最適化パラメーターの定義
hibernate.search.default.optimizer.operation_limit.max = 1000 hibernate.search.default.optimizer.transaction_limit.max = 100 hibernate.search.Animal.optimizer.transaction_limit.max = 50
hibernate.search.default.optimizer.operation_limit.max = 1000
hibernate.search.default.optimizer.transaction_limit.max = 100
hibernate.search.Animal.optimizer.transaction_limit.max = 50
Animal インデックスに対してトリガーされます。
- 追加および削除の数は
1000に到達します。 - トランザクション数は
50に達します (hibernate.search.Animal.optimizer.transaction_limit.max優先するhibernate.search.default.optimizer.transaction_limit.max)。
org.hibernate.search.store.optimization.OptimizerStrategy を実装して上書きし、optimizer.implementation プロパティーを実装の完全修飾名に設定して上書きできます。この実装は、インターフェースを実装し、パブリッククラスであり、引数なしでパブリックコンストラクターを持つ必要があります。
例14.68 カスタム OptimizerStrategy のロード
hibernate.search.default.optimizer.implementation = com.acme.worlddomination.SmartOptimizer hibernate.search.default.optimizer.SomeOption = CustomConfigurationValue hibernate.search.humans.optimizer.implementation = default
hibernate.search.default.optimizer.implementation = com.acme.worlddomination.SmartOptimizer
hibernate.search.default.optimizer.SomeOption = CustomConfigurationValue
hibernate.search.humans.optimizer.implementation = default
default を使用すると、Hibernate Search のデフォルト実装を選択できます。.optimizer キーセパレーター以降のすべてのプロパティーは、起動時に実装の initialize メソッドに渡されます。
14.5.2. 手動の最適化 リンクのコピーリンクがクリップボードにコピーされました!
SearchFactory を使用して、Hibernate Search からプログラムで Lucene インデックスを最適化 (デフラグ) できます。
例14.69 プログラムによるインデックスの最適化
Order を保持している Lucene インデックスを最適化し、次の例はすべてのインデックスを最適化します。
searchFactory.optimize() は JMS バックエンドには影響を与えません。マスターノードで最適化操作を適用する必要があります。
14.5.3. 最適化の調整 リンクのコピーリンクがクリップボードにコピーされました!
hibernate.search.[default|<indexname>].indexwriter.max_buffered_docshibernate.search.[default|<indexname>].indexwriter.max_merge_docshibernate.search.[default|<indexname>].indexwriter.merge_factorhibernate.search.[default|<indexname>].indexwriter.ram_buffer_sizehibernate.search.[default|<indexname>].indexwriter.term_index_interval
14.6. 高度な機能 リンクのコピーリンクがクリップボードにコピーされました!
14.6.1. SearchFactory へのアクセス リンクのコピーリンクがクリップボードにコピーされました!
SearchFactory オブジェクトは、Hibernate Search の基礎となる Lucene リソースを追跡します。これは、Lucene にネイティブにアクセスする便利な方法です。SearchFactory は FullTextSession からアクセスできます。
例14.70 SearchFactory へのアクセス
FullTextSession fullTextSession = Search.getFullTextSession(regularSession); SearchFactory searchFactory = fullTextSession.getSearchFactory();
FullTextSession fullTextSession = Search.getFullTextSession(regularSession);
SearchFactory searchFactory = fullTextSession.getSearchFactory();
14.6.2. IndexReader の使用 リンクのコピーリンクがクリップボードにコピーされました!
IndexReader で実行されます。Hibernate Search は、パフォーマンスを最大化するためにインデックスリーダーをキャッシュするか、更新された IndexReader 軽減 I/O 操作を取得するために他の効率的なストラテジーを提供する場合があります。コードはこれらのキャッシュされたリソースにアクセスできますが、要件がいくつかあります。
例14.71 IndexReader へのアクセス
SearchFactory は (シャード化ストラテジーに関連して) このエンティティーのクエリーに必要なインデックスを判別します。各インデックスで設定された ReaderProvider を使用して、関連するすべてのインデックスの上に複合 IndexReader を返します。この IndexReader は複数のクライアント間で共有されるため、以下のルールに従う必要があります。
- IndexReader.close() を呼び出さず、必要に応じて readerProvider.closeReader(reader) を finally ブロックで使用します。
- 変更操作には、この
IndexReaderを使用しないでください (読み取り専用のIndexReaderであり、このような試行によって例外が発生します)。
IndexReader を自由に使用できます。共有 IndexReaders を使用すると、たとえばファイルシステムから直接開くよりも、ほとんどのクエリーがより効率的になります。
open(Class... types)あなたが使用することができますopen(String... indexNames)、1 つ以上のインデックス名を渡すことができます。このストラテジーを使用して、シャードが使用される場合に、インデックスタイプに対してインデックスのサブセットを選択することもできます。
例14.72 インデックス名による IndexReader へのアクセス
IndexReader reader = searchFactory.getIndexReaderAccessor().open("Products.1", "Products.3");
IndexReader reader = searchFactory.getIndexReaderAccessor().open("Products.1", "Products.3");
14.6.3. Lucene ディレクトリーへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
Directory は、インデックスストレージを表すために Lucene で使用される最も一般的な抽象化です。Hibernate Search は Lucene Directory と直接対話することはありませんが、これらの対話は IndexManager 経由で抽象化されます。インデックスが必ずしも Directory によって実装される必要はありません。
Directory として表示され、アクセスする必要がある場合は、IndexManager から Directory への参照を取得できます。IndexManager を DirectoryBasedIndexManager にキャストし、getDirectoryProvider().getDirectory() を使用して基礎となる Directory への参照を取得します。これは推奨されていません.代わりに IndexReader を使用することが推奨されます。
14.6.4. シャード化インデックス リンクのコピーリンクがクリップボードにコピーされました!
- 単一のインデックスが大きいと、インデックスの更新時間は遅くなります。
- 一般的な検索は、データが顧客、地域、またはアプリケーションによってセグメント化された場合など、インデックスのサブセットのみに一致します。
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards プロパティーを使用します。
例14.73 インデックスシャーディングの有効化
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
IndexShardingStrategy を使用します。デフォルトのシャード化ストラテジーは、(FieldBridge によって生成された)ID 文字列表現のハッシュ値に従ってデータを分割します。これにより、シャードが大幅に分散されます。カスタムの IndexShardingStrategy を実装して、デフォルトのストラテジーを置き換えることができます。カスタムストラテジーを使用するには、hibernate.search.<indexName>.sharding_strategy プロパティーを設定する必要があります。
例14.74 カスタムシャーディング戦略の指定
hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
IndexShardingStrategy プロパティーでは、クエリーを実行するシャードを選択して検索を最適化することもできます。フィルターをアクティベートすることで、シャード化ストラテジーはクエリー (IndexShardingStrategy.getIndexManagersForQuery) に回答するために使用されるシャードのサブセットを選択できるため、クエリーの実行が速くなります。
IndexManager があるため、異なるディレクトリープロバイダーおよびバックエンド設定を使用するように設定できます。の Animal エンティティーの IndexManager インデックス名例14.75「エンティティーアニマルのシャーディング設定」Animal.0 から Animal.4 です。つまり、各シャードには所有するインデックス名の後に . (ドット) とそのインデックス番号が設定されます。
例14.75 エンティティーアニマルのシャーディング設定
Animal インデックスを 5 つのサブインデックスに使用しています。すべてのサブインデックスはファイルシステムのインスタンスで、各サブインデックスが保存されるディレクトリーは、以下のようになります。
- sub-index 0:
/usr/lucene/indexes/Animal00(共有 indexBase、indexName を上書き) - sub-index 1 の場合:
/usr/lucene/indexes/Animal.1(共有 indexBase、デフォルト indexName) - sub-index 2:
/usr/lucene/indexes/Animal.2(共有 indexBase、デフォルト indexName) - sub-index 3:
/usr/lucene/shared/Animal03(上書きされた indexBase、上書きされた indexName) - sub-index 4:
/usr/lucene/indexes/Animal.4(共有 indexBase、デフォルト indexName)
IndexShardingStrategy を実装する場合は、任意のフィールドを使用してシャード化の選択を判断できます。deletion、purge、purgeAll などの操作を処理するには、すべてのフィールド値またはプライマリー識別子を読み取れずにインデックスを返す必要があることもあります。このような場合、すべてのインデックスが返されるため、削除操作は、削除されるドキュメントが含まれる可能性のあるすべてのインデックスに伝播されます。
14.6.5. Lucene のスコアリングカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
org.apache.lucene.search.Similarity を拡張して、そのフラグ式をカスタマイズできます。このクラスで定義された抽象メソッドは、以下の式の係数と一致し、ドキュメント d のクエリー q のスコアを計算します。
| ファクター | 説明 |
|---|---|
| tf(t ind) | ドキュメント (d) の用語 (t) の周波数係数。 |
| idf(t) | 用語の頻度に関する記録。 |
| coord(q,d) | 指定されたドキュメントのクエリー用語がいくつあるかに基づくスコア要因。 |
| queryNorm(q) | クエリー間でスコアを設定するために使用される正規化の要素。 |
| t.getBoost() | フィールドブースト。 |
| norm(t,d) | いくつかの (インデックス時間) ブーストおよび長さ要素をカプセル化します。 |
Similarity の Javadoc を参照してください。
類似性 実装の完全に指定されたクラス名を指定することにより、デフォルトの類似性を設定できますhibernate.search.similarity。デフォルト値は org.apache.lucene.search.DefaultSimilarity です。
similarity プロパティーを設定して特定のインデックスに使用される類似性を上書きすることもできます。
hibernate.search.default.similarity = my.custom.Similarity
hibernate.search.default.similarity = my.custom.Similarity
@Similarity アノテーションを使用してクラスレベルのデフォルトの類似性を上書きできます。
tf(float freq)1.0 を返す必要があります。
Similarity 実装を宣言する必要があります。同じクラス階層のクラスは常にインデックスを共有するため、Similarity 実装の上書きはできません。
14.6.6. 例外処理の設定 リンクのコピーリンクがクリップボードにコピーされました!
hibernate.search.error_handler = log
hibernate.search.error_handler = log
ErrorHandler インターフェイスを実装する必要があります。handle(ErrorContext context)方法。ErrorContext プライマリーへの参照を提供しますLuceneWorkインスタンス、根本的な例外およびその後の例外LuceneWork主な例外のために処理できなかったインスタンス。
ErrorHandler 実装の完全修飾クラス名を宣言する必要があります。
hibernate.search.error_handler = CustomerErrorHandler
hibernate.search.error_handler = CustomerErrorHandler
14.6.7. Hibernate Search の無効化 リンクのコピーリンクがクリップボードにコピーされました!
インデックスの無効化
Hibernate Search インデックスを無効にするには、indexing_strategy 設定オプションを manual に変更して JBoss EAP を再起動します。
hibernate.search.indexing_strategy = manual
hibernate.search.indexing_strategy = manual
Hibernate Search を完全に無効にする
Hibernate Search を完全に無効にするには、autoregister_listeners 設定オプションをfalse に変更してすべてのリスナーを無効にし、JBoss EAP を再起動します。
hibernate.search.autoregister_listeners = false
hibernate.search.autoregister_listeners = false
第15章 JAX-RSWeb サービス リンクのコピーリンクがクリップボードにコピーされました!
15.1. JAX-RS について リンクのコピーリンクがクリップボードにコピーされました!
helloworld-rs、jax-rs-client、とkitchensinkクイックスタート:「クイックスタートにアクセスする」。
15.2. RESTEasy について リンクのコピーリンクがクリップボードにコピーされました!
15.3. RESTfulWeb サービスについて リンクのコピーリンクがクリップボードにコピーされました!
15.4. RESTEasy で定義された注釈 リンクのコピーリンクがクリップボードにコピーされました!
| アノテーション | 用途 |
|---|---|
ClientResponseType | これは、応答タイプが返される RESTEasy クライアントインターフェイスに追加できる注釈です。 |
ContentEncoding | アノテーション付きのアノテーションで適用する Content-Encoding を指定するメタアノテーション。 |
DecorateTypes | サポートされているタイプを指定するには、DecoratorProcessor クラスに配置する必要があります。 |
Decorator | デコレーションをトリガーする別のアノテーションに配置されるメタアノテーション。 |
Form | これは、リクエストと要求の発信および受信を行うためにオブジェクトとして使用できます。 |
StringParameterUnmarshallerBinder | 文字列ベースのアノテーションインジェクターに適用されるように StringParameterUnmarshaller をトリガーする別のアノテーションに配置されるメタアノテーション。 |
Cache | 応答の Cache-Control ヘッダーを自動的に設定します。 |
NoCache | nocache の Cache-Control 応答ヘッダーを設定します。 |
ServerCached | この jax-rs メソッドへの応答をサーバーにキャッシュする必要があることを指定します。 |
ClientInterceptor | インターセプターをクライアント側のインターセプターとして特定します。 |
DecoderPrecedence | このインターセプターは、コンテンツエンコーディングデコーダーです。 |
EncoderPrecedence | このインターセプターは、コンテンツエンコーディングエンコーダーです。 |
HeaderDecoratorPrecedence | HeaderDecoratorPrecedence インターセプターは、応答 (サーバー上) または送信要求 (クライアント上) を特別なユーザー定義のヘッダーで装飾するため、常に最初に来る必要があります。 |
RedirectPrecedence | PreProcessInterceptor に配置する必要があります。 |
SecurityPrecedence | PreProcessInterceptor に配置する必要があります。 |
ServerInterceptor | インターセプターをサーバー側のインターセプターとして特定します。 |
NoJackson | Jackson プロバイダーをトリガーしない場合にクラス、パラメーター、フィールド、またはメソッドに配置します。 |
ImageWriterParams | IIOImageProvider にパラメーターを渡すためにリソースクラスが使用できるアノテーション。 |
DoNotUseJAXBProvider | このクラスまたはパラメーターは、JAXB MessageBodyReader/Writer を使用せず、代わりにタイプをマーシャリングするために使用するより具体的なプロバイダーがある場合に使用してください。 |
Formatted | インデントと改行で XML 出力をフォーマットします。これは、JAXB Decorator です。 |
IgnoreMediaTypes | タイプ、メソッド、パラメーター、またはフィールドにフィールドを置くと、特定のメディアタイプに対して JAXRS プロバイダーを使用しないように指示します。 |
Stylesheet | XML スタイルシートヘッダーを指定します。 |
Wrapped | これをメソッドまたはパラメーターに配置すると、指定のオブジェクトのコレクションまたは配列をマーシャリングまたはマーシャリング解除できます。 |
WrappedMap | これは、JAXB オブジェクトのマップのマーシャリングまたはマーシャリング解除を行う場合は、メソッドまたはパラメーターに配置します。 |
XmlHeader | 返されたドキュメントの XML ヘッダーを設定します。 |
BadgerFish | A JSONConfig. |
Mapped | A JSONConfig. |
XmlNsMap | A JSONToXml. |
MultipartForm | これは、multipart/form-data mime タイプの受信/発進のオブジェクトとして使用できます。 |
PartType | List または Map を multipart/* タイプとして書き出す場合は、Multipart プロバイダーと併用する必要があります。 |
XopWithMultipartRelated | このアノテーションは、アノテーション付きのオブジェクト間の XOP メッセージの受信/送信 (multipart / 関連としてパッケージ化) の処理と生成に使用できます。 |
After | 署名時に有効期限属性を追加するため、または検証のための古いチェックとして使用されます。 |
Signed | DOSETA 仕様を使用して要求または応答の署名をトリガーするコンビニエンスアノテーション。 |
Verify | 署名ヘッダーで指定された入力署名の検証。 |
Path | これは、クラスまたはリソースメソッドに存在する必要があります。両方に存在する場合、リソースメソッドへの相対パスはクラスとメソッドの連結になります。 |
PathParam | 変数 URI パスのフラグメントをメソッド呼び出しにマッピングできるようにします。 |
QueryParam | URI クエリー文字列パラメーターまたは URL 形式のエンコードされたパラメーターをメソッド呼び出しにマップできるようにします。 |
CookieParam | HTTP リクエスト cookie のクッキーまたはオブジェクト表現の値をメソッド呼び出しに指定できます。 |
DefaultValue | HTTP リクエスト項目が存在しない場合にデフォルト値を定義するために、その他の @*Param アノテーションと組み合わせることができます。 |
Context | javax.ws.rs.core.HttpHeaders、javax.ws.rs.core.UriInfo、javax.ws.rs.core.Request、javax.servlet.HttpServletRequest、javax.servlet.HttpServletResponse、javax.ws.rs.core.SecurityContext オブジェクトのインスタンスを指定できます。 |
Encoded | クラス、メソッド、またはパラメーターで使用できます。デフォルトでは、@PathParam および @QueryParams はデコードされます。@Encoded アノテーションを追加すると、これらのパラメーターの値がエンコードされた形式で提供されます。 |
15.5. RESTEasy 設定 リンクのコピーリンクがクリップボードにコピーされました!
15.5.1. RESTEasy 設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
| オプション名 | デフォルト値 | 説明 |
|---|---|---|
| resteasy.servlet.mapping.prefix | デフォルトなし | Resteasy servlet-mapping の url パターンが /*ではない場合。 |
| resteasy.scan | false | @Provider および JAX-RS リソースクラス (@Path、@GET、@POST など) の両方に対して WEB-INF/lib JARs および WEB-INF/classes を自動的にスキャンします。 |
| resteasy.scan.providers | false | @Provider クラスをスキャンして登録します。 |
| resteasy.scan.resources | false | JAX-RS リソースクラスのスキャン。 |
| resteasy.providers | デフォルトなし | 登録する完全修飾 @Provider クラス名のコンマ区切りリスト。 |
| resteasy.use.builtin.providers | true | デフォルトのビルトイン @Provider クラスを登録するかどうか。 |
| resteasy.resources | デフォルトなし | 登録する完全修飾 JAX-RS リソースクラス名のコンマ区切りリスト。 |
| resteasy.jndi.resources | デフォルトなし | JAX-RS リソースとして登録するオブジェクトを参照する JNDI 名のカンマ区切りリスト。 |
| javax.ws.rs.Application | デフォルトなし | 仕様移植可能な方法でブートストラップする Application クラスの完全修飾名。 |
| resteasy.media.type.mappings | デフォルトなし | ファイル名の拡張子 (例: .xml や txt) をメディアタイプにマッピングすることで、Accept ヘッダーの必要性を置き換えます。クライアントが Accept ヘッダーを使用して表示 (ブラウザーなど) を選択できない場合に使用されます。 |
| resteasy.language.mappings | デフォルトなし | ファイル名の拡張子 (.en または .fr など) を言語にマッピングすることで、Accept-Language ヘッダーの必要性を置き換えます。クライアントが Accept-Language ヘッダーを使用して言語 (ブラウザーなど) を選択できない場合に使用されます。 |
| resteasy.document.expand.entity.references | false | 外部エンティティーを展開するか、空の文字列に置き換えるか。JBoss EAP 6 では、このパラメーターのデフォルトは false であるため、空の文字列に置き換わります。 |
| resteasy.document.secure.processing.feature | true | org.w3c.dom.Document ドキュメントとつの JAXB オブジェクト表現を処理する際にセキュリティー制約を課します。 |
| resteasy.document.secure.disableDTDs | true | org.w3c.dom.Document ドキュメントおよび JAXB オブジェクトの表現を禁止します。 |
resteasy.scan.* ファイルの web.xml 設定は無視され、すべての JAX-RS アノテーションが付けられたコンポーネントが自動的にスキャンされます。
15.6. JAX-RSWeb サービスセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
15.6.1. RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasy は JAX-RS メソッドでの @RolesAllowed、@PermitAll、@DenyAll アノテーションに対応しています。ただし、デフォルトではこれらの注釈は認識されません。以下の手順に従って、web.xml ファイルを設定し、ロールベースのセキュリティーを有効にします。
- resteasy.document.expand.entity.references
- resteasy.document.secure.processing.feature
- resteasy.document.secure.disableDTDs
手順15.1 RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - 以下の <context-param> をファイルに、
web-app内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - <security-role> タグを使用して、RESTEasy JAX-RS WAR ファイル内で使用されるすべてのロールを宣言します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - すべてのロールについて JAX-RS ランタイムによって処理されるすべての URL へのアクセスを承認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
ロールベースのセキュリティーは、定義されたロールとともにアプリケーション内で有効にされています。
例15.1 例: ロールベースのセキュリティー設定
15.6.2. アノテーションを使用して JAX-RSWeb サービスを保護する リンクのコピーリンクがクリップボードにコピーされました!
概要
このトピックでは、サポートされているセキュリティーアノテーションを使用して JAX-RSWeb サービスを保護する手順について説明します。
手順15.2 サポートされているセキュリティーアノテーションを使用して JAX-RSWeb サービスを保護する
- ロールベースセキュリティーを有効化します。詳細は、「RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化」 を参照してください。
- JAX-RS Web サービスにセキュリティーアノテーションを追加します。RESTEasy は以下のアノテーションをサポートします。
- @RolesAllowed
- メソッドにアクセスできるロールを定義します。すべてのロールは
web.xmlファイルで定義する必要があります。 - @PermitAll
web.xmlファイルに定義されているすべてのロールがメソッドにアクセスできるようにします。- @DenyAll
- メソッドへのすべてのアクセスを拒否します。
15.7. 例外処理 リンクのコピーリンクがクリップボードにコピーされました!
15.7.1. 例外マッパーを作成する リンクのコピーリンクがクリップボードにコピーされました!
概要
例外マッパーは、出力された例外をキャッチし、特定の HTTP 応答を書き込むカスタムのアプリケーション提供コンポーネントです。
例15.2 例外マッパー
ExceptionMapperインターフェイス。
web.xml ファイルのresteasy.providerscontext-param、またはプログラムで登録しますResteasyProviderFactoryクラス。
15.7.2. RESTEasy 内部で出力された例外 リンクのコピーリンクがクリップボードにコピーされました!
| 例外 | HTTP コード | 説明 |
|---|---|---|
| BadRequestException | 400 | 正しくない要求。リクエストが適切にフォーマットされていなかったか、またはリクエスト入力の処理に問題がありました。 |
| UnauthorizedException | 401 | 承認されていません。RESTEasy のアノテーションベースのロールベースのセキュリティーを使用している場合には、セキュリティー例外が発生します。 |
| InternalServerErrorException | 500 | 内部サーバーエラー。 |
| MethodNotAllowedException | 405 | リソースが呼び出した HTTP 操作を処理できる JAX-RS メソッドはありません。 |
| NotAcceptableException | 406 | Accept ヘッダーに一覧表示されるメディアタイプを生成する JAX-RS メソッドはありません。 |
| NotFoundException | 404 | リクエストパス/ リソースを提供する JAX-RS メソッドはありません。 |
| ReaderException | 400 | から出力されたすべての例外MessageBodyReadersこの例外にラップされます。ない場合ExceptionMapperラップされた例外の場合、または例外がWebApplicationExceptionの場合、RESTEasy はデフォルトで 400 コードを返します。 |
| WriterException | 500 | から出力されたすべての例外MessageBodyWritersこの例外にラップされます。ない場合ExceptionMapperラップされた例外の場合、または例外がWebApplicationExceptionの場合、RESTEasy はデフォルトで 400 コードを返します。 |
| JAXBUnmarshalException | 400 | JAXB プロバイダー (XML および Jettison) は、読み取り時にこの例外を出力します。JAXBExceptions をラップしている可能性があります。このクラスは拡張しますReaderException。 |
| JAXBMarshalException | 500 | JAXB プロバイダー (XML および Jettison) は、書き込み時にこの例外を出力します。JAXBExceptions をラップしている可能性があります。このクラスは拡張しますWriterException。 |
| ApplicationException | 該当なし | アプリケーションコードから出力されたすべての例外をラップします。と同じように機能しますInvocationTargetException。ラップされた例外に対する ExceptionMapper がある場合は、要求の処理に使用されます。 |
| 失敗 | 該当なし | 内部 RESTEasy エラー。ログに記録されない。 |
| LoggableFailure | 該当なし | 内部 RESTEasy エラー。ログが記録されています。 |
| DefaultOptionsMethodException | 該当なし | ユーザーが HTTP OPTIONS を呼び出しても、JAX-RS メソッドが呼び出されない場合、RESTEasy はこの例外を発生させてデフォルトの動作を提供します。 |
15.8. RESTEasy インターセプター リンクのコピーリンクがクリップボードにコピーされました!
15.8.1. JAX-RS 呼び出しのインターセプト リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasy は JAX-RS 呼び出しをインターセプトし、インターセプターと呼ばれるリスナーのようなオブジェクトでそれらをルーティングできます。このトピックでは、4 種類のインターセプターについて説明します。
例15.3 MessageBodyReader/Writer インターセプター
@Provider、およびいずれか@ServerInterceptorまた@ClientInterceptorRESTEasy がそれらをインターセプターリストに追加するかどうかを認識できるようにします。
MessageBodyReader.readFrom()またMessageBodyWriter.writeTo()。これらは、Output や Input ストリームをラップするために使用できます。
MessageBodyReaderContext.proceed() またMessageBodyWriterContext.proceed()次のインターセプターに移動するために呼び出されます。呼び出すインターセプターがこれ以上ない場合は、readFrom()またwriteTo()MessageBodyReader または MessageBodyWriter のメソッド。このラッピングにより、オブジェクトは Reader や Writer に到達する前に変更でき、proceed() が返された後にクリーンアップされます。
例15.4 PreProcessInterceptor
public interface PreProcessInterceptor
{
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
}
public interface PreProcessInterceptor
{
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
}
preProcess()メソッドが ServerResponse を返すと、基になる JAX-RS メソッドは呼び出されず、ランタイムは応答を処理してクライアントに戻ります。の場合preProcess()メソッドは ServerResponse を返さず、基礎となる JAX-RS メソッドが呼び出されます。
例15.5 PostProcessInterceptors
public interface PostProcessInterceptor
{
void postProcess(ServerResponse response);
}
public interface PostProcessInterceptor
{
void postProcess(ServerResponse response);
}
例15.6 ClientExecutionInterceptors
@ClientInterceptorと@Provider。これらのインターセプターは、MessageBodyWriter の後、および ClientRequest がクライアント側で構築された後に実行されます。
15.8.2. インターセプターを JAX-RS メソッドにバインドする リンクのコピーリンクがクリップボードにコピーされました!
概要
登録されているすべてのインターセプターは、デフォルトですべての要求に対して呼び出されます。The AcceptedByMethodこの動作を微調整するためにインターフェイスを実装できます。
例15.7 バインディングインターセプターの例
accept()を実装するインターセプターのメソッド AcceptedByMethodインターフェイス。メソッドが true を返す場合、インターセプターは JAX-RS メソッドのコールチェーンに追加されます。それ以外の場合は、そのメソッドでは無視されます。
accept()@GET アノテーションが JAX-RS メソッドに存在するかどうかを判別します。そうである場合、インターセプターはメソッドの呼び出しチェーンに適用されます。
15.8.3. インターセプターを登録する リンクのコピーリンクがクリップボードにコピーされました!
概要
このトピックでは、RESTEasyJAX-RS インターセプターをアプリケーションに登録する方法について説明します。
手順15.3 インターセプターを登録する
- インターセプターを登録するには、以下の
web.xmlファイルにインターセプターをリストします。resteasy.providerscontext-param、またはクラスまたはオブジェクトとして返しますApplication.getClasses()またApplication.getSingletons()方法。
例15.8 web.xml ファイル にインターセプターをリストして登録します。
<context-param> <param-name>resteasy.providers</param-name> <param-value>my.app.CustomInterceptor</paramvalue> </context-param>
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>my.app.CustomInterceptor</paramvalue>
</context-param>
例15.9 Application.getClasses () メソッドを使用したインターセプターの登録:
例15.10 Application.getSingletons () メソッドを使用したインターセプターの登録:
15.8.4. インターセプター優先ファミリー リンクのコピーリンクがクリップボードにコピーされました!
15.8.4.1. インターセプター優先ファミリーについて リンクのコピーリンクがクリップボードにコピーされました!
概要
インターセプターは、呼び出される順序に敏感になる可能性があります。RESTEasy は、インターセプターをファミリーにグループ化して、順序付けを簡単にします。このリファレンストピックでは、組み込みのインターセプター優先順位ファミリーとそれぞれに関連付けられたインターセプターについて説明します。
- セキュリティー
- SECURITY インターセプターは通常 PreProcessInterceptors です。呼び出しが許可される前に実行する必要があるのは可能な限り少ないため、最初に呼び出されます。
- HEADER_DECORATOR
- HEADER_DECORATOR インターセプターは、応答または送信要求にヘッダーを追加します。追加されたヘッダーが他のインターセプターファミリーの動作に影響を与える可能性があるため、これらはセキュリティーインターセプターに従います。
- エンコーダー
- ENCODER インターセプターは OutputStream を変更します。たとえば、GZIP インターセプターは GZIPOutputStream を作成して、圧縮のために実際の OutputStream をラップします。
- REDIRECT
- REDIRECT インターセプターは、リクエストを再ルーティングして JAX-RS メソッドを完全にバイパスする可能性があるため、通常 PreProcessInterceptors で使用されます。
- デコーダ
- DECODER インターセプターは InputStream をラップします。たとえば、GZIP インターセプターデコーダーは InputStream を GzipInputStream インスタンスにラップします。
org.jboss.resteasy.annotations.interceptionパッケージ:@DecoredPrecedence、@EncoderPrecedence、@HeaderDecoratorPrecedence、@RedirectPrecedence、@SecurityPrecedence。の代わりにこれらを使用してください@Precedence注釈。詳細は、「RESTEasy で定義された注釈」 を参照してください。
15.8.4.2. カスタムインターセプター優先順位ファミリーを定義する リンクのコピーリンクがクリップボードにコピーされました!
概要
カスタム優先順位ファミリーを作成して、web.xml ファイルに登録できます。このトピックでは、インターセプター優先順位ファミリーを定義するために使用できるコンテキストパラメーターの例について説明します。
例15.11 resteasy.append.interceptor.precedence
resteasy.append.interceptor.precedencecontext param は、新しい優先順位ファミリーをデフォルトの優先順位ファミリーリストに追加します。
<context-param>
<param-name>resteasy.append.interceptor.precedence</param-name>
<param-value>CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
<context-param>
<param-name>resteasy.append.interceptor.precedence</param-name>
<param-value>CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
例15.12 resteasy.interceptor.before.precedence
resteasy.interceptor.before.precedencecontext param は、カスタムファミリーが以前に実行されるデフォルトの優先順位ファミリーを定義します。パラメーター値は、':' で区切られた DEFAULT_PRECEDENCE_FAMILY/CUSTOM_PRECEDENCE_FAMILY の形式を取ります。
<context-param>
<param-name>resteasy.interceptor.before.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
<context-param>
<param-name>resteasy.interceptor.before.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
例15.13 resteasy.interceptor.after.precedence
resteasy.interceptor.after.precedencecontext param は、カスタムファミリーが実行されるデフォルトの優先ファミリーを定義します。パラメーター値は、: で区切られた DEFAULT_PRECEDENCE_FAMILY/CUSTOM_PRECEDENCE_FAMILY の形式を取ります。
<context-param>
<param-name>resteasy.interceptor.after.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
<context-param>
<param-name>resteasy.interceptor.after.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
15.9. 文字列ベースの注釈 リンクのコピーリンクがクリップボードにコピーされました!
15.9.1. 文字列ベースの @*Param アノテーションをオブジェクトに変換する リンクのコピーリンクがクリップボードにコピーされました!
@*Param アノテーションは、raw HTTP リクエストで文字列として表されます。これらのタイプのインジェクトされたパラメーターは、それらのオブジェクトに valueOf(String) 静的メソッドまたは String パラメーターを取るコンストラクターがある場合に、オブジェクトに変換できます。
@Providerどちらも持たないクラスのこの変換を処理するためのインターフェイスvalueOf(String)静的メソッド、または文字列コンストラクタ。
例15.14 StringConverter
例15.15 StringParameterUnmarshaller
StringParameterUnmarshallerインターフェイスは、挿入するパラメーターまたはフィールドに配置された注釈に敏感です。インジェクターごとに作成されます。setAnnotations () メソッドは、アンマーシャラーを初期化するために resteasy によって呼び出されます。
org.jboss.resteasy.annotations.StringsParameterUnmarshallerBinder。
java.util.Dateベースの @PathParam。
15.10. ファイル拡張子を設定する リンクのコピーリンクがクリップボードにコピーされました!
15.10.1. web.xml ファイルのメディアタイプにファイル拡張子をマップします リンクのコピーリンクがクリップボードにコピーされました!
概要
ブラウザーなどの一部のクライアントは、Accept および Accept-Language ヘッダーを使用して、表現メディアタイプまたは言語をネゴシエートできません。RESTEasy は、この問題に対処するために、ファイル名サフィックスをメディアタイプおよび言語にマップできます。次の手順に従って、web.xml ファイルでメディアタイプをファイル拡張子にマップします。
手順15.4 メディアタイプをファイル拡張子にマップする
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - context-param を追加します
resteasy.media.type.mappingsファイルに、内部web-appタグ:<context-param> <param-name>resteasy.media.type.mappings</param-name> </context-param><context-param> <param-name>resteasy.media.type.mappings</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - パラメーター値を設定します。マッピングはコンマ区切りのリストを形成します。各マッピングは、
::例15.16 マッピングの例
<context-param> <param-name>resteasy.media.type.mappings</param-name> <param-value>html : text/html, json : application/json, xml : application/xml</param-value> </context-param><context-param> <param-name>resteasy.media.type.mappings</param-name> <param-value>html : text/html, json : application/json, xml : application/xml</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.10.2. ファイル拡張子を web.xml ファイルの言語にマップする リンクのコピーリンクがクリップボードにコピーされました!
概要
ブラウザーなどの一部のクライアントは、Accept および Accept-Language ヘッダーを使用して、表現メディアタイプまたは言語をネゴシエートできません。RESTEasy は、この問題に対処するために、ファイル名サフィックスをメディアタイプおよび言語にマップできます。以下の手順に従い、web.xml ファイルのファイル拡張子に言語をマッピングします。
手順15.5 ファイル拡張子を web.xml ファイルの言語にマップする
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - context-param を追加します
resteasy.language.mappingsファイルに、内部web-appタグ:<context-param> <param-name>resteasy.language.mappings</param-name> </context-param><context-param> <param-name>resteasy.language.mappings</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - パラメーター値を設定します。マッピングはコンマ区切りのリストを形成します。各マッピングは、
::例15.17 マッピングの例
<context-param> <param-name>resteasy.language.mappings</param-name> <param-value> en : en-US, es : es, fr : fr</param-name> </context-param><context-param> <param-name>resteasy.language.mappings</param-name> <param-value> en : en-US, es : es, fr : fr</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.10.3. RESTEasy がサポートするメディアタイプ リンクのコピーリンクがクリップボードにコピーされました!
| メディアタイプ | Java タイプ |
|---|---|
| application/*+xml, text/*+xml, application/*+json, application/*+fastinfoset, application/atom+* | JaxB アノテーション付きクラス |
| application/*+xml, text/*+xml | org.w3c.dom.Document |
| */* | java.lang.String |
| */* | java.io.InputStream |
| text/plain | プリミティブ、java.lang.String、または String コンストラクターを持つタイプ、または入力用の静的 valueOf(String) メソ背戸、出力用の toOf() メソッド。 |
| */* | javax.activation.DataSource |
| */* | byte[] |
| */* | java.io.File |
| application/x-www-form-urlencoded | javax.ws.rs.core.MultivaluedMap |
15.11. RESTEasy JavaScript API リンクのコピーリンクがクリップボードにコピーされました!
15.11.1. RESTEasy JavaScript API について リンクのコピーリンクがクリップボードにコピーされました!
例15.18 単純な JAX-RSJavaScriptAPI の例
var text = Foo.get({order: 'desc', 'X-Foo': 'hello',
colour: 'blue', 'Foo-Cookie': 123987235444});
Foo.put({$entity: text});
var text = Foo.get({order: 'desc', 'X-Foo': 'hello',
colour: 'blue', 'Foo-Cookie': 123987235444});
Foo.put({$entity: text});
15.11.2. RESTEasy JavaScript API サーブレットの有効化 リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasyJavaScriptAPI はデフォルトでは有効になっていません。次の手順に従って、web.xml ファイルを使用して有効にします。
手順15.6 web.xml を編集して、RESTEasyJavaScriptAPI を有効にします
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - 次の設定をファイル内の
web-appタグ:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.11.3. RESTEasy JavaScript API パラメーター リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー | デフォルト値 | 説明 |
|---|---|---|
| $entity | PUT、POST 要求として送信するエンティティー。 | |
| $contentType | Content-Type ヘッダーとして送信されるボディーエンティティーの MIME タイプ。@Consumes アノテーションで決定されます。 | |
| $accepts | */* | Accept ヘッダーとして送信される許可される MIME タイプ。@Provides アノテーションで決定されます。 |
| $callback | 非同期呼び出しの関数 (httpCode、xmlHttpRequest、value) に設定します。これがない場合、呼び出しは同期され、値を返します。 | |
| $apiURL | 最後のスラッシュを含まない JAX-RS エンドポイントのベース URI に設定します。 | |
| $username | ユーザー名およびパスワードが設定されている場合は、要求のクレデンシャルに使用されます。 | |
| $password | ユーザー名およびパスワードが設定されている場合は、要求のクレデンシャルに使用されます。 |
15.11.4. JavaScriptAPI を使用して AJAX クエリーを作成する リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasy JavaScript API を使用すると、手動で要求を作成することができます。このトピックでは、この動作の例について説明します。
例15.19 REST オブジェクト
- apiURL
- デフォルトでは、JAX-RS ルート URL に設定されています。要求の作成時にすべての JavaScript クライアント API 機能によって使用されます。
- log
- log: RESTEasy クライアント API ログを受信するために function(string) に設定します。これは、クライアント API のデバッグ、およびそれらを確認できる場所のログの配置を行う場合に便利です。
例15.20 REST.Request クラス
15.11.5. rest.Request クラスメンバー リンクのコピーリンクがクリップボードにコピーされました!
| メンバー | 説明 |
|---|---|
| execute(callback) | 現在のオブジェクトに設定されたすべての情報でリクエストを実行します。値はオプションの引数コールバックに渡され、返されません。 |
| setAccepts(acceptHeader) | Accept 要求ヘッダーを設定します。デフォルトは "" です。 |
| setCredentials(username, password) | 要求の認証情報を設定します。 |
| setEntity(entity) | リクエストエンティティーを設定します。 |
| setContentType(contentTypeHeader) | Content-Type リクエストヘッダーを設定します。 |
| setURI(uri) | 要求 URI を設定します。絶対 URI である必要があります。 |
| setMethod(method) | 要求メソッドを設定します。デフォルトは GET です。 |
| setAsync(async) | リクエストを非同期にするかどうかを制御します。デフォルトは true です。 |
| addCookie(name, value) | 要求の実行時に現在のドキュメントに指定の Cookie を設定します。これは、ブラウザーで永続化されます。 |
| addQueryParameter(name, value) | クエリーパラメーターを URI クエリー部分に追加します。 |
| addMatrixParameter(name, value) | リクエスト URI の最後のパスセグメントにマトリクスパラメーター (path パラメーター) を追加します。 |
| addHeader(name, value) | 要求ヘッダーを追加します。 |
15.12. RESTEasy Asynchronous Job Service リンクのコピーリンクがクリップボードにコピーされました!
15.12.1. RESTEasy 非同期ジョブサービスについて リンクのコピーリンクがクリップボードにコピーされました!
15.12.2. 非同期ジョブサービスを有効にする リンクのコピーリンクがクリップボードにコピーされました!
手順15.7 web.xml ファイルを変更します
- Asynchronous Job Service は
web.xmlファイルで有効化します。<context-param> <param-name>resteasy.async.job.service.enabled</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.async.job.service.enabled</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
非同期ジョブサービスが有効になりました。設定オプションについては、以下を参照してください。「非同期ジョブサービス設定パラメーター」。
15.12.3. RESTEasy の非同期ジョブを設定する リンクのコピーリンクがクリップボードにコピーされました!
概要
本トピックでは、RESTEasy を使用した非同期ジョブのクエリーパラメーターの例について説明します。
web.xml ファイルでの XML 宣言を使用してアプリケーションセキュリティーを確立する必要があります。
例15.21 非同期パラメーター
asynch クエリーパラメーターは、バックグラウンドで呼び出しを実行するために使用されます。202 Accepted 応答が返されます。また、バックグラウンドメソッドの応答がある場所を指す URL が含まれる場所のヘッダーも返されます。
POST http://example.com/myservice?asynch=true
POST http://example.com/myservice?asynch=true
HTTP/1.1 202 Accepted Location: http://example.com/asynch/jobs/3332334
HTTP/1.1 202 Accepted
Location: http://example.com/asynch/jobs/3332334
/asynch/jobs/{job-id}?wait={millisconds}|nowait=true
/asynch/jobs/{job-id}?wait={millisconds}|nowait=true
- ジョブが完了したら、GET は応答として呼び出される JAX-RS リソースメソッドを返します。ジョブが完了していない場合、この GET は 202Accepted 応答コードを返します。GET を呼び出してもジョブは削除されないため、複数回呼び出すことができます。
- POST はジョブの応答を読み取り、完了するとジョブを削除します。
- DELETE は、ジョブキューを手動でクリーンアップするために呼び出されます。注記ジョブキューが満杯になると、DELETE を呼び出すことなく、メモリーから最も古いジョブを自動的に無効にします。
例15.22 待つ/待つ
waitとnowaitクエリーパラメーター。の場合waitパラメーターが指定されていない場合、操作はデフォルトでnowait=true、およびジョブが完了していない場合はまったく待機しません。Thewaitパラメーターはミリ秒単位で定義されます。
POST http://example.com/asynch/jobs/122?wait=3000
POST http://example.com/asynch/jobs/122?wait=3000
例15.23 一方向パラメーター
onewayクエリーパラメーター。
POST http://example.com/myservice?oneway=true
POST http://example.com/myservice?oneway=true
15.12.4. 非同期ジョブサービス設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
概要
以下の表は、非同期ジョブサービスの設定可能な context-params の詳細を示しています。これらのパラメーターは web.xml ファイルで設定できます。
| Parameter | 説明 |
|---|---|
| resteasy.async.job.service.max.job.results | メモリーに一度に保持できるジョブ結果の数。デフォルト値は 100 です。 |
| resteasy.async.job.service.max.wait | クライアントがそのジョブをクエリーする際のジョブの最大待機時間。デフォルト値は 300000. です。 |
| resteasy.async.job.service.thread.pool.size | ジョブを実行するバックグラウンドスレッドのスレッドプールサイズ。デフォルト値は 100 です。 |
| resteasy.async.job.service.base.path | ジョブ URI のベースパスを設定します。デフォルト値は /asynch/jobs です。 |
例15.24 非同期ジョブ設定の例
15.13. RESTEasy JAXB リンクのコピーリンクがクリップボードにコピーされました!
15.13.1. JAXB デコレータを作成する リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasy の資料プロバイダーには、Marshaller および Un Marketplaceler インスタンスを切り離すプラグ可能な方法があります。Marshaller または Unmarshaller インスタンスのいずれかをトリガーできるアノテーションが作成されます。このトピックでは、RESTEasy を使用して JAXB デコレータを作成する手順について説明します。
手順15.8 RESTEasy を使用したデコレーターの作成
Processor クラスを作成します。
- DecoratorProcessor<Target, Annotation> を実装するクラスを作成します。ターゲットは JAXB Marshaller または Unmarshallerクラスのいずれかになります。アノテーションは、ステップ 2 で作成されます。
- クラスに @DecorateTypes アノテーションを付け、デコレーターがデコレートする必要のある MIME タイプを宣言します。
- 内でプロパティーまたは値を設定します
decorate関数。
例15.25 例: Processor クラス
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アノテーションを作成します。
- @Decorator アノテーションが付けられたカスタムインターフェースを作成します。
- @Decorator アノテーションのプロセッサーおよびターゲットを宣言します。プロセッサーは、ステップ 1 で作成されます。ターゲットは JAXB Marshaller または Unmarshallerクラスのいずれかになります。
例15.26 アノテーションの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 手順 2 で作成したアノテーションを関数に追加して、入力または出力のいずれかがマーシャリングされるときにデコレートされるようにします。
結果
JAXB デコレータは、JAX-RSWeb サービス内で作成および適用されています。
15.13.2. アイザーおよび XML プロバイダー リンクのコピーリンクがクリップボードにコピーされました!
@XmlHeader および @Stylesheet
RESTEasy は、@org.jboss.resteasy.annotations.providers.jaxb.XmlHeader注釈。以下に例を示します。
@XmlHeaderXML 出力に XML スタイルシートヘッダーがあることを確認します。
15.13.3. JAXB および JSON プロバイダー リンクのコピーリンクがクリップボードにコピーされました!
BadgerFish で、もう 1 つは Jettison にマップされたコンベンション形式です。マップされた規則がデフォルトです。JAXB + JSON プロバイダーと Jettison の統合の詳細については、以下を参照してください。 http://docs.jboss.org/resteasy/docs/2.3.7.Final/userguide/html_single/index.html
15.14. RESTEasy Atom サポート リンクのコピーリンクがクリップボードにコピーされました!
15.14.1. AtomAPI とプロバイダーについて リンクのコピーリンクがクリップボードにコピーされました!
org.jboss.resteasy.plugins.providers.atom パッケージにあります。RESTEasy は JAXB を使用して API のマーシャリングおよびマーシャリング解除に使用します。プロバイダーは JAXB ベースであり、XML を使用した Atom オブジェクトの送信に限定されません。RESTEasy が持つすべての JAXB プロバイダーは、JSON を含む Atom API およびプロバイダーによって再利用できます。API の詳細については、カスタマーサービスポータル から入手できる javadocs を参照してください。
15.14.2. Atom プロバイダーでの JAXB の使用 リンクのコピーリンクがクリップボードにコピーされました!
15.15. YAML プロバイダー リンクのコピーリンクがクリップボードにコピーされました!
SnakeYAML ライブラリーを使用した YAML のサポートが同梱されています。YAML サポートを有効にするには、アプリケーションのプロジェクト pom ファイルに次の依存関係を挿入する必要があります。
- text/x-yaml
- text/yaml
- application/x-yaml
15.16. EJB 統合 リンクのコピーリンクがクリップボードにコピーされました!
@Remoteまた@LocalJAX-RS アノテーションとのインターフェイス:
web.xml ファイルで、を使用して EJB を RESTEasy に手動で登録する必要があります。 resteasy.jndi.resources <context-param>
15.17. Jackson による JSON サポート リンクのコピーリンクがクリップボードにコピーされました!
15.18. RESTEasy/Spring 統合 リンクのコピーリンクがクリップボードにコピーされました!
15.18.1. RESTEasy/Spring 統合 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- アプリケーションに既存の JAX-WS サービスおよびクライアント設定を指定する必要があります。
手順15.9 RESTEasy/Spring 統合機能を有効にする
- RESTEasy は Spring 3.0.x と統合します。Maven ユーザーは resteasy-spring アーティファクトを使用する必要があります。または、jar を JBoss EAP 6 のモジュールとして利用できます。RESTEasy には、Bean が BeanFactory によって作成されたときに JAX-RS アノテーションを処理する RESTEasy 固有の BeanPostProcessor を登録する独自の Spring ContextLoaderListener が付属しています。これは、RESTEasy が Bean クラスの @Provider および JAX-RS リソースアノテーションを自動的にスキャンして登録することを意味します。それらを JAX-RS リソースとして。
例15.27 web.xml を編集します
以下を web.xml ファイルに追加し、RESTEasy/Spring 統合機能を有効にします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SpringContextLoaderListener は、ResteasyBootstrap の後に宣言する必要があります。これは、初期化される ServletContext 属性を使用するためです。
第16章 JAX-WS Web Services リンクのコピーリンクがクリップボードにコピーされました!
16.1. JAX-WSWeb サービスについて リンクのコピーリンクがクリップボードにコピーされました!
WS-Notification、WS-Addressing、WS-Policy、WS-Security、とWS-Trust。これらは、メッセージアーキテクチャーとメッセージ形式を定義する Simple Object Access Protocol (SOAP) と呼ばれる特殊な XML 言語を使用して通信します。
WebServiceとWebMethodインターフェイス。
サービス サブシステムを介して提供されます。
実例
JBoss EAP クイックスタートには、完全に機能する JAX-WSWeb サービスアプリケーションがいくつか含まれています。これらの例は次のとおりです。
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
16.2. Web サービスサブシステムを設定します リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 にデプロイされた Web サービスの動作を制御する Web サービスサブシステムでは、多くの設定オプションを使用できます。管理 CLI スクリプトの各要素を変更するコマンド (EAP_HOME/bin/jboss-cli.sh または EAP_HOME/bin/jboss-cli.bat) が提供されています。スタンドアロンサーバーのコマンドの /profile= default 部分を削除するか、default を設定するプロファイルの名前に置き換えます。
公開されたエンドポイントアドレス
エンドポイントで公開された WSDL コントラクトの <soap:address> 要素を書き換えることができます。この機能を使用して、各エンドポイントのクライアントにアドバタイズされるサーバーアドレスを制御できます。次の各オプション要素は、要件に合わせて変更できます。アクティブな WS 展開がある場合、これらの要素のいずれかを変更するには、サーバーをリロードする必要があります。
| 要素 | Description | CLI コマンド |
|---|---|---|
| modify-wsdl-address |
常に WSDL アドレスを変更するかどうか。true の場合、
<soap:address> の内容は常に上書きされます。false の場合、<soap:address> のコンテンツは、有効な URL でない場合にのみ上書きされます。使用される値は、以下で説明する wsdl-host、wsdl-port、および wsdl-secure-port になります。
|
/profile=default/subsystem=webservices/:write-attribute(name=modify-wsdl-address,value=true)
|
| wsdl-host | <soap:address> の書き換えに使用するホスト名/IP アドレス。wsdl-host が文字列 jbossws.undefined.host に設定されている場合、<soap:address> を書き換えるときにリクエスターのホストが使用されます。
| /profile=default/subsystem=webservices/:write-attribute(name=wsdl-host,value=10.1.1.1) |
| wsdl-port | SOAP アドレスの書き換えに使用される HTTP ポートを明示的に定義する整数。未定義の場合、HTTP ポートは、インストールされている HTTP コネクターのリストを照会することによって識別されます。 | /profile=default/subsystem=webservices/:write-attribute(name=wsdl-port,value=8080)
|
| wsdl-secure-port | SOAP アドレスの書き換えに使用される HTTPS ポートを明示的に定義する整数。未定義の場合、HTTPS ポートは、インストールされている HTTPS コネクターのリストを照会することによって識別されます。 | /profile=default/subsystem=webservices/:write-attribute(name=wsdl-secure-port,value=8443)
|
事前定義されたエンドポイント設定
エンドポイントの実装で参照できるエンドポイント設定を定義できます。これを使用する 1 つの方法は、アノテーションが付いた特定のエンドポイント設定でマークされた WS エンドポイントに特定のハンドラーを追加することです。@org.jboss.ws.api.annotation.EndpointConfig。
Standard-Endpoint-Config。カスタム設定の例、Recording-Endpoint-Config、も含まれています。これは、レコーディングハンドラーの例を提供します。TheStandard-Endpoint-Config他の設定に関連付けられていないエンドポイントに自動的に使用されます。
Standard-Endpoint-Config管理 CLI を使用して、次のコマンドを使用します。
/profile=default/subsystem=webservices/endpoint-config=Standard-Endpoint-Config/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
/profile=default/subsystem=webservices/endpoint-config=Standard-Endpoint-Config/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
エンドポイント設定
管理 API で endpoint-config と呼ばれるエンドポイント設定には、特定のエンドポイントに適用される pre-handler-chain、post-handler-chain、およびいくつかのプロパティーが含まれます。次のコマンドは、エンドポイント設定を読み取り、追加します。
例16.1 エンドポイント設定を読み取る
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config:read-resource
例16.2 エンドポイント設定を追加する
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config:add
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config:add
ハンドラーチェーン
各エンドポイント設定は、PRE および POST ハンドラーチェーンに関連付けることができます。各ハンドラーチェーンには、JAXWS 準拠のハンドラーが含まれる場合があります。アウトバウンドメッセージの場合、PRE ハンドラーチェーンハンドラーは、@HandlerChain アノテーションなどの標準の JAX-WS を使用してエンドポイントにアタッチされたハンドラーの前に実行されます。POST ハンドラーチェーンハンドラーは、通常のエンドポイントハンドラーの後に実行されます。受信メッセージには、逆が適用されます。JAX-WS は XML ベースの Web サービスの標準 API で、で http://jcp.org/en/jsr/detail?id=224 説明されています。
protocol-bindings 属性を含めることもできます。
例16.3 ハンドラーチェーンを読む
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers:read-resource
例16.4 ハンドラーチェーンの追加
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers:add(protocol-bindings="##SOAP11_HTTP")
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers:add(protocol-bindings="##SOAP11_HTTP")
ハンドラー
JAXWS ハンドラーは、ハンドラーチェーン内の子要素 ハンドラー です。ハンドラーは、ハンドラークラスの完全修飾クラス名である クラス 属性を取ります。エンドポイントがデプロイされると、参照デプロイメントごとにそのクラスのインスタンスが作成されます。モジュールのデプロイメントクラ出力ダーまたはクラ出力ダーのいずれかorg.jboss.as.webservices.server.integrationハンドラークラスをロードできる必要があります。
例16.5 ハンドラーを読む
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers/handler=RecordingHandler:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers/handler=RecordingHandler:read-resource
例16.6 ハンドラーの追加
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers/handler=foo-handler:add(class="org.jboss.ws.common.invocation.RecordingServerHandler")
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers/handler=foo-handler:add(class="org.jboss.ws.common.invocation.RecordingServerHandler")
Web サービスランタイム情報
エンドポイント自体にクエリーを実行することで、Web コンテキストや WSDLURL などの Web サービスに関するランタイム情報を表示できます。* 文字を使用して、すべてのエンドポイントを一度に照会できます。次の例は、管理対象ドメイン内のサーバーとスタンドアロンサーバーの両方に対するコマンドを示しています。
例16.7 管理対象ドメイン内のサーバー上のすべての Web サービスエンドポイントに関するランタイム情報を表示する
マスター でホストされ、管理対象ドメインで実行されている server-one という名前のサーバー上のすべてのエンドポイントに関する情報を表示します。
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
例16.8 スタンドアロンサーバー上のすべての Web サービスエンドポイントに関するランタイム情報を表示する
/deployment="*"/subsystem=webservices/endpoint="*":read-resource
/deployment="*"/subsystem=webservices/endpoint="*":read-resource
例16.9 エンドポイント情報の例
16.3. アプリケーションごとに HTTP タイムアウトを設定する リンクのコピーリンクがクリップボードにコピーされました!
- アプリケーション - アプリケーションの
web.xml設定ファイルで定義されています。 - サーバー
-default-session-timeout属性を介して指定されます。 - デフォルト - 30 分です。
手順16.1 アプリケーションごとに HTTP タイムアウトを設定する
- アプリケーションの
WEB-INF/web.xmlファイルを編集します。 - 次の設定 XML をファイルに追加し、
30を目的のタイムアウト (分単位) に変更します。<session-config> <session-timeout>30</session-timeout> </session-config>
<session-config> <session-timeout>30</session-timeout> </session-config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - WAR ファイルを変更した場合は、アプリケーションを再デプロイします。WAR ファイルを展開した場合、JBoss EAP はアプリケーションを自動的にアンデプロイして再デプロイするため、これ以上のアクションは必要ありません。
16.4. JAX-WS Web サービスエンドポイント リンクのコピーリンクがクリップボードにコピーされました!
16.4.1. JAX-WS Web サービスエンドポイント リンクのコピーリンクがクリップボードにコピーされました!
- WSDL 記述子は手動で記述できます。
- WSDL 記述子を自動的に作成する JAX-WS アノテーションを使用できます。これは、WSDL 記述子を作成するための最も一般的な方法です。
開発要件
Web サービスは、JAX-WS API および JSR 181: Web Services Metadata for the Java Platform 仕様の要件を満たす必要があります。有効な実装は、以下の要件を満たしている必要があります。
- それは含まれています
javax.jws.WebService注釈。 - すべてのメソッドパラメーターとリターンタイプは、JAXB2.0 仕様の JSR-222 と互換性があります。詳細は、http://www.jcp.org/en/jsr/summary?id=222 を参照してください。
例16.10 例: POJO エンドポイント
例16.11 例: Web サービスエンドポイント
例16.12 EJB でのエンドポイントの公開
エンドポイントプロバイダー
JAX-WS サービスは通常 Java サービスエンドポイントインターフェース (SEI) を実装します。これは、WSDL ポートタイプから、直接またはアノテーションを使用してマッピングされる可能性があります。この SEI は、Java オブジェクトとその XML 表現の詳細を隠す高度な抽象化を提供します。ただし、サービスは XML メッセージレベルで動作する必要があることがあります。エンドポイントProviderインターフェイスは、この機能を実装する Web サービスに提供します。
エンドポイントの使用およびアクセス
Web サービスをデプロイしたら、WSDL を消費してアプリケーションの基盤となるコンポーネントのスタブを作成できます。その後、アプリケーションはエンドポイントにアクセスしてその作業を実行できます。
実例
JBoss EAP クイックスタートには、完全に機能する JAX-WSWeb サービスアプリケーションがいくつか含まれています。これらの例は次のとおりです。
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
16.4.2. JAX-WSWeb サービスエンドポイントの作成とデプロイ リンクのコピーリンクがクリップボードにコピーされました!
はじめに
このトピックでは、サーバー側コンポーネントである単純な JAX-WS サービスエンドポイントの開発について説明します。これは、JAX-WS クライアントからの要求に応答し、それ自体の WSDL 定義を公開します。JAX-WS サービスエンドポイントの詳細については、以下を参照してください。「JAX-WS Common API Reference」JBoss EAP 6 とともに配布される Javadoc 形式の API ドキュメントバンドル。
開発要件
Web サービスは、JAXWS API と Web Services メタデータ仕様の要件に http://www.jcp.org/en/jsr/summary?id=181 対応します。有効な実装は、以下の要件を満たしている必要があります。
- それは含まれています
javax.jws.WebService注釈。 - すべてのメソッドパラメーターとリターンタイプは、JAXB2.0 仕様の JSR-222 と互換性があります。詳細は、http://www.jcp.org/en/jsr/summary?id=222 を参照してください。
例16.13 サービス実装の例
例16.14 XML ペイロードの例
DiscountRequestによって使用されるクラスProfileMgmtBean前の例の Bean。アノテーションは詳細度のために含まれています。通常、これは JAXB デフォルトは妥当な設定であり、指定する必要はありません。
デプロイメントをパッケージ化する
実装クラスは JAR デプロイメントでラップされます。デプロイメントに必要なメタデータは、実装クラスとサービスエンドポイントインターフェース上のアノテーションから取得されます。管理 CLI または管理インターフェイスを使用して JAR をデプロイすると、HTTP エンドポイントが自動的に作成されます。
例16.15 Web サービスデプロイメントの JAR 構造の例
16.5. JAX-WS Web サービスクライアント リンクのコピーリンクがクリップボードにコピーされました!
16.5.1. JAX-WS Web サービスの消費とアクセス リンクのコピーリンクがクリップボードにコピーされました!
- クライアントアーティファクトの作成
- サービススタブの構成
クライアントアーティファクトの作成
クライアントアーティファクトを作成する前に、WSDL コントラクトを作成する必要があります。以下の WSDL コントラクトは、本トピックの残りの部分に記載の例に使用します。
ProfileMgmtService.wsdl ファイルにこの WSDL コントラクトがあることを前提としています。
例16.16 WSDL コントラクトの例
EAP_HOME/bin/ ディレクトリーにあります。
例16.17 wsconsume.sh コマンドの構文
.java ファイルを ProfileMgmtService.wsdl ファイルから生成します。ソースは、-p スイッチで指定されたパッケージのディレクトリー構造を使用します。
.java ソースファイルとコンパイルされた .class ファイルはどちらも、コマンドを実行するディレクトリー内の output/ ディレクトリーに生成されます。
| ファイル | 説明 |
|---|---|
ProfileMgmt.java
|
サービスエンドポイントインターフェース。
|
Customer.java
|
カスタムデータタイプ。
|
Discount*.java
|
カスタムデータタイプ。
|
ObjectFactory.java
|
JAXB XML レジストリー。
|
package-info.java
|
JAXB パッケージのアノテーション。
|
ProfileMgmtService.java
|
サービスファクトリー。
|
wsconsume.sh コマンドは、すべてのカスタムデータタイプ (JAXB アノテーションが付けられたクラス)、サービスエンドポイントインターフェース、およびサービスファクトリークラスを生成します。これらのアーティファクトは、Web サービスクライアントの実装をビルドするために使用されます。
サービススタブの構成
Web サービスクライアントはサービススタブを使用して、リモート Web サービス呼び出しの詳細を抽象化します。クライアントアプリケーションの場合、WS の呼び出しは他のビジネスコンポーネントの呼び出しと同様になります。この場合、サービスエンドポイントインターフェースはビジネスインターフェースとして機能し、サービスファクトリークラスはサービススタブとしての構築に使用されません。
例16.18 サービススタブの構築とエンドポイントへのアクセス
16.5.2. JAX-WS クライアントアプリケーションの開発 リンクのコピーリンクがクリップボードにコピーされました!
サービス
- 概要
- A
ServiceWSDL サービスを表す抽象化です。WSDL サービスは、一連の関連ポートです。それぞれには、特定のプロトコルとエンドポイントアドレスに結合したポートタイプが含まれます。通常、サービスの生成は、残りのコンポーネントのスタブが、既存の WSDL コントラクトから生成されると行われます。WSDL コントラクトは、デプロイされたエンドポイントの WSDL URL 経由で利用できます。または、EAP_HOME/bin/ディレクトリーのwsprovide.shコマンドを使用してエンドポイントソースから作成できます。このタイプの使用は、static ユースケースと呼ばれます。この場合、コンポーネントのスタブのいずれかとして作成されたServiceクラスのインスタンスを作成します。を使用して、サービスを手動で作成することもできます。Service.create方法。これは、dynamic ユースケースと呼ばれます。 - 用途
- 静的ユースケース
- JAX-WS クライアントの static ユースケースでは、すでに WSDL コントラクトが存在することを前提としています。これは外部ツールで生成されるか、JAX-WS エンドポイントの作成時に適切な JAX-WS アノテーションを使用して生成される可能性があります。コンポーネントスタブを生成するには、
wsconsume.shまたwsconsume.batEAP_HOME/bin/に含まれているスクリプト。このスクリプトは、WSDL URL またはファイルをパラメーターとして受け取り、ディレクトリーツリーで構造化された複数のファイルを生成します。を表すソースファイルとクラスファイルService名前が付けられていますCLASSNAME_Service.javaとCLASSNAME_Service.class、それぞれ。生成された実装クラスには、引数のないパブリックコンストラクターと、2 つの引数を持つコンストラクターがあります。2 つの引数は、WSDL の場所を表します (java.net.URL) およびサービス名 (ajavax.xml.namespace.QName) それぞれ。引数なしのコンストラクターは最もよく使用されます。この場合、WSDL の場所とサービス名は WSDL にあるものです。これらは、から暗黙的に設定されます@WebServiceClient生成されたクラスを装飾するアノテーション。例16.19 生成されたサービスクラスの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 動的ユースケース
- 動的の場合、スタブは自動的に生成されません。代わりに、Web サービスクライアントは
Service.create作成する方法Serviceインスタンス。以下のコードはこのプロセスを示しています。例16.20 手動でサービスを作成する
URL wsdlLocation = new URL("http://example.org/my.wsdl"); QName serviceName = new QName("http://example.org/sample", "MyService"); Service service = Service.create(wsdlLocation, serviceName);URL wsdlLocation = new URL("http://example.org/my.wsdl"); QName serviceName = new QName("http://example.org/sample", "MyService"); Service service = Service.create(wsdlLocation, serviceName);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- ハンドラー解決
- JAX-WS は、handlers と呼ばれるメッセージ処理モジュールに柔軟なプラグインフレームワークを提供します。これらのハンドラーは JAX-WS ランタイムシステムの機能を拡張します。A
Serviceインスタンスはへのアクセスを提供しますHandlerResolverのペアを介してgetHandlerResolverとsetHandlerResolverサービスごと、ポートごと、またはプロトコルごとのバインディングに基づいて一連のハンドラーを設定できるメソッド。いつServiceインスタンスはプロキシーまたはDispatchたとえば、現在サービスに登録されているハンドラーリゾルバーは、必要なハンドラーチェーンを作成します。に設定されたハンドラーリゾルバーへのその後の変更Serviceインスタンスは、以前に作成されたプロキシーのハンドラーに影響を与えません。Dispatchインスタンス。 - エグゼキューター (Executor)
Serviceインスタンスは、java.util.concurrent.Executor。TheExecutorアプリケーションによって要求された非同期コールバックを呼び出します。ThesetExecutorとgetExecutorの方法Service変更および取得できますExecutorサービス用に設定されています。
動的プロキシー
動的プロキシー は、次のいずれかを使用するクライアントプロキシーのインスタンスです。getPortで提供されるメソッドService。TheportNameサービスが使用する WSDL ポートの名前を指定します。TheserviceEndpointInterface作成された動的プロキシーインスタンスでサポートされるサービスエンドポイントインターフェイスを指定します。
例16.21 getPort Methods
public <T> T getPort(QName portName, Class<T> serviceEndpointInterface) public <T> T getPort(Class<T> serviceEndpointInterface)
public <T> T getPort(QName portName, Class<T> serviceEndpointInterface)
public <T> T getPort(Class<T> serviceEndpointInterface)
wsconsume.sh ツールを使用して生成されます。これは、WSDL を解析し、そこから Java クラスを作成します。
例16.22 サービスのポートを返す
@WebServiceRef
The@WebServiceRefアノテーションは、Web サービスへの参照を宣言します。これは、で定義される javax.annotation.Resource アノテーションで示されるリソースパターンに http://www.jcp.org/en/jsr/summary?id=250 従います。
のユースケース @WebServiceRef
- これを使用して、生成されたタイプの参照を定義できます
Serviceクラス。この例では、type および value 要素はそれぞれ、生成されたServiceクラスタイプを参照します。さらに、リファンレンスタイプがアノテーションが適用されるフィールドまたはメソッド宣言によって推定される場合、type および value 要素にはデフォルト値のObject.classが設定されることがあります。これは必須ではありません。タイプを推定できない場合、type 要素がデフォルト以外の値を持つ必要があります。 - これは、タイプが SEI のリファンレスを定義するのに使用できます。この場合、リファレンスのタイプが annotated フィールドまたは method 宣言から推測される場合、type 要素はデフォルト値で存在することがあります (ただし、必須ではありません)。ただし、value 要素は常に存在し、生成されたサービスクラスターイプを参照する必要があります。これは、
javax.xml.ws.Service。ThewsdlLocation要素が存在する場合は、で指定された WSDL ロケーション情報をオーバーライドします。@WebService参照された生成されたサービスクラスのアノテーション。例16.23
@WebServiceRef例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Dispatch
XML Web サービスは、Java EE コンテナーおよびすべてのクライアントにデプロイされる、エンドポイント間の通信に XML メッセージを使用します。XML メッセージは、Simple Object Access Protocol (SOAP) と呼ばれる XML 言語を使用します。JAX-WS API は、エンドポイントとクライアントのメカニズムを提供し、各エンドポイントが SOAP メッセージを送受信できるようにします。マーシャリングは、Java オブジェクトを SOAP XML メッセージに変換するプロセスです。マーシャリング解除とは、SOAP XML メッセージを Java オブジェクトに変換するプロセスのことです。
Dispatchクラスはこの機能を提供します。Dispatch は、以下の定数のいずれかによって識別される、2 つの使用モードのいずれかで動作します。
javax.xml.ws.Service.Mode.MESSAGE- このモードは、クライアントアプリケーションがプロトコル固有のメッセージ構造を直接操作するように指示します。SOAP プロトコルバインディングを使用すると、クライアントアプリケーションは SOAP メッセージで直接機能します。javax.xml.ws.Service.Mode.PAYLOAD- このモードでは、クライアントはペイロード自体を操作します。たとえば、SOAP プロトコルバインディングと使用すると、クライアントアプリケーションは SOAP メッセージ全体ではなく SOAP ボディーのコンテンツで動作します。
Dispatch は低レベルの API で、クライアントはメッセージまたはペイロードを XML として構成する必要があります。これは、個別のプロトコルの標準と、メッセージまたはペイロード構造の詳細な知識とメッセージに忠実に従った状態を意味します。Dispatch は、メッセージの入出力または、任意のタイプのメッセージペイロードに対応した汎用クラスです。
例16.24 Dispatch 用途
非同期呼び出し
TheBindingProviderインターフェイスは、クライアントが使用できるプロトコルバインディングを提供するコンポーネントを表します。これはプロキシーによって実装され、Dispatchインターフェイス。
BindingProvider インスタンスは非同期操作機能を提供する場合があります。非同期操作の呼び出しは、BindingProvider呼び出し時のインスタンス。操作が完了しても、応答コンテキストは更新されません。代わりに、別の応答コンテキストが使用可能になりますResponseインターフェイス。
例16.25 非同期呼び出しの例
@Oneway 呼び出し
@Oneway アノテーションは、指定の web メソッドが入力メッセージを取得し、出力メッセージを返しないことを示します。通常、@Oneway メソッドは、ビジネスメソッドの実行前に、制御のスレッドを呼び出しアプリケーションに戻します。
例16.26 例@Oneway呼び出し
タイムアウトの設定
2 種類のプロパティーが HTTP 接続のタイムアウトの動作と、メッセージの受信を待機しているクライアントのタイムアウトを制御します。最初はjavax.xml.ws.client.connectionTimeoutそして 2 番目はjavax.xml.ws.client.receiveTimeout。それぞれはミリ秒単位で示され、正しい構文を以下に示します。
例16.27 JAX-WS タイムアウト設定
16.6. JAX-WS 開発リファレンス リンクのコピーリンクがクリップボードにコピーされました!
16.6.1. Web サービスアドレス指定を有効にする (WS-Addressing) リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- アプリケーションに既存の JAX-WS サービスおよびクライアント設定を指定する必要があります。
手順16.2 クライアントコードに注釈を付けて更新する
サービスエンドポイントに注釈を付ける
追加します@Addressingアプリケーションのエンドポイントコードへの注釈。例16.28
@AddressingAnnotationこの例は、通常の JAX-WS エンドポイントを示しています。@Addressing注釈が追加されました。Copy to Clipboard Copied! Toggle word wrap Toggle overflow クライアントコードを更新する
アプリケーションのクライアントコードを更新して、WS-Addressing を設定します。例16.29 WS-Addressing のクライアント設定
この例は、WS-Addressing を設定するために更新された通常の JAX-WS クライアントを示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
クライアントとエンドポイントは、WS-Addressing を使用して通信しています。
16.6.2. JAX-WS Common API Reference リンクのコピーリンクがクリップボードにコピーされました!
ハンドラーフレームワーク
ハンドラーフレームワークは、クライアントおよびエンドポイント (サーバーコンポーネント) の JAX-WS プロトコルバインディングによって実装されます。binding providers として知られるプロキシーおよび Dispatch インスタンスは、それぞれプロトコルバインディングを使用して抽象機能を特定のプロトコルにバインドします。
メッセージハンドラーの種類
- 論理ハンドラー
- Logical handlers は、メッセージコンテキストプロパティーおよびメッセージペイロードでのみ動作します。論理ハンドラーはプロトコルに依存しないため、メッセージのプロトコル固有の部分には影響がありません。論理ハンドラーはインターフェイスを実装します
javax.xml.ws.handler.LogicalHandler。 - プロトコルハンドラー
- Protocol handlers は、メッセージコンテキストプロパティーおよびプロトコル固有のメッセージで動作します。プロトコルハンドラーは特定のプロトコルに固有のもので、メッセージのプロトコル固有の側面にアクセスし、変更する可能性があります。プロトコルハンドラーは、から派生した任意のインターフェイスを実装します
javax.xml.ws.handler.Handler except javax.xml.ws.handler.LogicalHandler。 - サービスエンドポイントハンドラー
- サービスエンドポイントでは、ハンドラーは
@HandlerChain注釈。ハンドラーチェーンファイルの場所は、絶対的なものにすることができますjava.net.URLのexternalFormまたは、ソースファイルまたはクラスファイルからの相対パス。例16.30 サービスエンドポイントハンドラーの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - サービスクライアントハンドラー
- JAX-WS クライアントでは、ハンドラーはサービスエンドポイントの場合と同様に
@HandlerChainアノテーションを使用するか、JAX-WS API を使用して動的に定義されます。例16.31 API を使用したサービスクライアントハンドラーの定義
Copy to Clipboard Copied! Toggle word wrap Toggle overflow への呼び出しsetHandlerChainメソッドが必要です。
メッセージコンテキスト
TheMessageContextinterface は、すべての JAX-WS メッセージコンテキストのスーパーインターフェイスです。これは、追加のメソッドと定数を使用して Map<String,Object> を拡張し、ハンドラーチェーンのハンドラーが処理関連の状態を共有できるようにするプロパティーセットを管理します。たとえば、ハンドラーは put メソッドを使用してプロパティーをメッセージコンテキストに挿入します。ハンドラーチェーン内の他の 1 つ以上のハンドラーは、その後、get方法。
APPLICATION または HANDLER としてスコープ指定されます。すべてのプロパティーは、特定のエンドポイントのメッセージ交換パターン (MEP) のインスタンスに対するすべてのハンドラーで利用できます。たとえば、論理ハンドラーがプロパティーをメッセージコンテキストに置いた場合、そのプロパティーは MEP インスタンスの実行中にチェーンの任意のプロトコルハンドラーでも利用できます。
APPLICATION レベルでスコープ設定されているプロパティーは、クライアントアプリケーションおよびサービスエンドポイント実装でも利用可能になります。Thedefaultscopeプロパティーの場合は HANDLER です。
- 論理メッセージコンテキスト
- 論理ハンドラーが呼び出されると、タイプのメッセージコンテキストを受け取ります
LogicalMessageContext。LogicalMessageContext拡張しますMessageContextメッセージペイロードを取得および変更するメソッドを使用します。メッセージのプロトコル固有の側面へのアクセスは提供しません。プロトコルバインディングは、論理メッセージコンテキストを介して使用できるメッセージのコンポーネントを定義します。SOAP バインディングにデプロイされた論理ハンドラーは SOAP ボディーのコンテンツにアクセスできますが、SOAP ヘッダーにはアクセスできません。一方、XML/HTTP バインディングは論理ハンドラーがメッセージの XML ペイロード全体にアクセスできることを定義します。 - SOAP メッセージコンテキスト
- SOAP ハンドラーが呼び出されると、
SOAPMessageContext。SOAPMessageContext拡張しますMessageContextSOAP メッセージペイロードを取得および変更するメソッドを使用します。
障害処理
アプリケーションが SOAPFaultException またはアプリケーション固有のユーザー例外をスローする可能性があります。後者の場合、必要な障害ラッパー Bean がデプロイメントに含まれていない場合は、ランタイム時に生成されます。
例16.32 障害処理の例
public void throwApplicationException() throws UserException
{
throw new UserException("validation", 123, "Some validation error");
}
public void throwApplicationException() throws UserException
{
throw new UserException("validation", 123, "Some validation error");
}
JAX-WS アノテーション
JAX-WS API 経由で利用可能なアノテーションは JSR-224 で定義されています。これについては、を参照してください http://www.jcp.org/en/jsr/detail?id=224。これらの注釈はパッケージに含まれていますjavax.xml.ws。
javax.jws。
第17章 WebSocket リンクのコピーリンクがクリップボードにコピーされました!
17.1. WebSocket について リンクのコピーリンクがクリップボードにコピーされました!
Upgrade ヘッダーを使用して WebSocket 接続を要求します。同じ TCP/IP 接続上ではすべて全二重通信になり、データのオーバヘッドが最小化されます。各メッセージには不必要な HTTP ヘッダーコンテンツが含まれていないため、Websocket 通信で必要な帯域幅は小さくなります。その結果、通信パスのレイテンシーが低くなるため、リアルタイムの応答が必要なアプリケーションに適しています。
17.2. WebSocket アプリケーションを作成する リンクのコピーリンクがクリップボードにコピーされました!
- Javaクライアントまたは WebSocket が有効になっている HTML クライアント。次の場所で HTML クライアントブラウザーのサポートを確認できます。 http://caniuse.com/websockets
- WebSocket サーバーエンドポイントクラス。
- WebSocket を有効にするように設定された
jboss-web.xmlファイル。 - WebSocket API で依存関係を宣言するために設定されたプロジェクト依存関係。
- Red Hat JBoss Enterprise Application Platform サーバー設定ファイルの
WebサブシステムでNIO2コネクターを有効にします。
手順17.1 WebSocket アプリケーションの作成
JavaScript HTML クライアントを作成します。
以下は WebSocket クライアントの例になります。この例には 3 つの JavaScript 関数が含まれています。lconnect(): この関数は WebSocket URI を渡す WebSocket 接続を作成します。リソースの場所は、サーバーエンドポイントクラスに定義されたリソースと一致します。この関数は、WebSocket をインターセプトして処理しますonopen、onmessage、onerror、とonclose。sendMessage(): この関数はフォームに入力された名前を取得し、メッセージを作成します。 さらに、WebSocket.send() コマンドを使用してメッセージを送信します。disconnect(): この関数は WebSocket.close () コマンドを発行します。displayMessage(): この関数は、ページ上の表示メッセージを WebSocket エンドポイントメソッドによって返された値に設定します。displayStatus(): この関数は、WebSocket 接続ステータスを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow WebSocket サーバーエンドポイントを作成します。
以下の方法のいずれかを使用して WebSocket サーバーエンドポイントを作成できます。以下のコード例では、アノテーション付きエンドポイントが使用され、以下のイベントが処理されます。Programmatic Endpoint: エンドポイントは Endpoint クラスを拡張します。Annotated Endpoint: エンドポイントクラスはアノテーションを使用して WebSocket イベントと対話します。これは、プログラム的なエンドポイントよりも簡単にコーディングできます。
- The
@ServerEndpointアノテーションは、このクラスを WebSocket サーバーエンドポイントとして識別し、パスを指定します。 - WebSocket 接続が開かれると
@OnOpenアノテーションがトリガーされます。 - The
@OnMessageメッセージが WebSocket 接続に送信されると、注釈がトリガーされます。 - WebSocket 接続が閉じられると、
@OnCloseアノテーションがトリガーされます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-web.xml ファイルを設定します。
を作成する必要があります<enable-websockets>アプリケーションWEB-INF/jboss-web.xmlの要素を作成し、trueに設定します。<?xml version="1.0" encoding="UTF-8"?> <!--Enable WebSockets --> <jboss-web> <enable-websockets>true</enable-websockets> </jboss-web>
<?xml version="1.0" encoding="UTF-8"?> <!--Enable WebSockets --> <jboss-web> <enable-websockets>true</enable-websockets> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロジェクト POM ファイルで WebSocket API の依存関係を宣言します。
Maven を使用する場合は、プロジェクトpom.xmlファイルに以下の依存関係を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow JBoss EAP サーバーを設定します。
httpを設定します<connector>サーバー設定ファイルのWebサブシステムで、NIO2プロトコルを使用します。- JBoss EAP サーバーを起動します。
- ご使用のオペレーティングシステム向けのコマンドを使用して、管理 CLI を起動します。Linux の場合Windows の場合:
EAP_HOME/bin/jboss-cli.sh --connect
EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOME\bin\jboss-cli.bat --connect
EAP_HOME\bin\jboss-cli.bat --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow - JBoss EAP サーバー設定ファイルの
WebサブシステムでノンブロッキングJavaNIO2コネクタープロトコルを有効にするには、次のコマンドを入力します。/subsystem=web/connector=http/:write-attribute(name=protocol,value=org.apache.coyote.http11.Http11NioProtocol)
/subsystem=web/connector=http/:write-attribute(name=protocol,value=org.apache.coyote.http11.Http11NioProtocol)Copy to Clipboard Copied! Toggle word wrap Toggle overflow どちらのコマンドでも、次の結果が表示されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 設定を再ロードするようにサーバーに通知します。
reload
reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の結果が表示されるはずです。{ "outcome" => "success", "result" => undefined }{ "outcome" => "success", "result" => undefined }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - JBoss EAP サーバー設定ファイルへの変更を確認します。これで、
Webサブシステムにhttp用の次の XML が含まれるはずです。<connector>。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第18章 アプリケーションセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
18.1. 基本的な概念 リンクのコピーリンクがクリップボードにコピーされました!
18.1.1. 暗号化について リンクのコピーリンクがクリップボードにコピーされました!
18.1.2. セキュリティードメイン リンクのコピーリンクがクリップボードにコピーされました!
18.1.3. SSL 暗号化について リンクのコピーリンクがクリップボードにコピーされました!
18.1.4. 宣言型セキュリティーについて リンクのコピーリンクがクリップボードにコピーされました!
18.2. アプリケーションにおけるロールベースのセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
18.2.1. アプリケーションセキュリティーについて リンクのコピーリンクがクリップボードにコピーされました!
18.2.2. 認証 リンクのコピーリンクがクリップボードにコピーされました!
18.2.3. 認可について リンクのコピーリンクがクリップボードにコピーされました!
18.2.4. セキュリティー監査 リンクのコピーリンクがクリップボードにコピーされました!
18.2.5. セキュリティーマッピング リンクのコピーリンクがクリップボードにコピーされました!
18.2.6. Java 認証および承認サービス (JAAS) リンクのコピーリンクがクリップボードにコピーされました!
18.2.7. Java 認証および承認サービス (JAAS) について リンクのコピーリンクがクリップボードにコピーされました!
ドメイン、サーバーグループ、およびサーバー固有の設定
サーバーグループ (管理対象ドメイン内) およびサーバー (スタンドアロンサーバー内) には、セキュリティードメインの設定が含まれます。セキュリティードメインには、認証、承認、マッピング、および監査モジュールの組み合わせに関する情報と、設定の詳細が含まれています。アプリケーションは、jboss-web.xml で、必要なセキュリティードメインを名前で指定します。
アプリケーション固有の設定
アプリケーション固有の設定は、次の 4 つのファイルの 1 つ以上で行われます。
| ファイル | Description |
|---|---|
| ejb-jar.xml |
アーカイブの
META-INF ディレクトリーにある EnterpriseJavaBean (EJB) アプリケーションのデプロイメント記述子。ejb-jar.xml を使用して、アプリケーションレベルでロールを指定し、それらをプリンシパルにマップします。特定のメソッドとクラスを特定のロールに制限することもできます。また、セキュリティーに関係のない他の EJB 固有の設定にも使用されます。
|
| web.xml |
Java Enterprise Edition (EE)Web アプリケーションのデプロイメント記述子。
web.xml を使用して、許可される HTTP リクエストのタイプを制限するなど、アプリケーションのリソースとトランスポートの制約を宣言します。このファイルで単純な Web ベースの認証を設定することもできます。また、セキュリティーに関係のない他のアプリケーション固有の設定にも使用されます。アプリケーションが認証と承認に使用するセキュリティードメインは、jboss-web.xml で定義されています。
|
| jboss-ejb3.xml | ejb-jar.xml 記述子に対する JBoss 固有の拡張機能が含まれています。
|
| jboss-web.xml | web.xml 記述子に対する JBoss 固有の拡張機能が含まれています。
|
ejb-jar.xml および web.xml は、Java Enterprise Edition (Java EE) 仕様で定義されています。jboss-ejb3.xml は ejb-jar.xml の JBoss 固有の拡張機能を提供し、jboss-web.xml は web.xml の JBoss 固有の拡張機能を提供します。
18.2.8. アプリケーションでのセキュリティードメインの使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
アプリケーションでセキュリティードメインを使用するには、最初にサーバーの設定でセキュリティードメインを定義してから、アプリケーションの展開記述子でアプリケーションに対してセキュリティードメインを有効にする必要があります。次に、それを使用する EJB に必要なアノテーションを追加する必要があります。このトピックでは、アプリケーションでセキュリティードメインを使用するために必要な手順について説明します。
手順18.1 セキュリティードメインを使用するようアプリケーションを設定
セキュリティードメインの定義
サーバーの設定ファイルでセキュリティードメインを定義した後、アプリケーションの記述子ファイルでアプリケーションに対して有効にする必要があります。サーバーの設定ファイルへセキュリティードメインを設定
セキュリティードメインは、サーバーの設定ファイルのセキュリティーサブシステムで設定されます。JBoss EAP 6 インスタンスが管理対象ドメインで実行されている場合、これはdomain/configuration/domain.xmlファイルです。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、これはstandalone/configuration/standalone.xmlファイルです。他のjboss-web-policyおよびjboss-ejb-policyセキュリティードメインは、JBoss EAP 6 でデフォルトで提供されます。次の XML の例は、サーバーの設定ファイルのセキュリティーサブシステムからコピーされたものです。Thecache-typeセキュリティードメインの属性は、認証チェックを高速化するためのキャッシュを指定します。許可される値は、デフォルトでキャッシュとして単純なマップを使用するか、infinispanで Infinispan キャッシュを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 管理コンソールまたは CLI を使用して、追加のセキュリティードメインを必要に応じて設定できます。アプリケーションの記述子ファイルでのセキュリティードメインの有効化
セキュリティードメインは、アプリケーションのWEB-INF/jboss-web.xmlファイルの<jboss-web>要素の<security-domain>子要素で指定されます。次の例では、my-domainという名前のセキュリティードメインを設定します。<jboss-web> <security-domain>my-domain</security-domain> </jboss-web><jboss-web> <security-domain>my-domain</security-domain> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、WEB-INF/jboss-web.xml記述子で指定できる多くの設定の 1 つにすぎません。
EJB への必要なアノテーションの追加
@SecurityDomainおよび@RolesAllowedアノテーションを使用して、EJB でセキュリティーを設定します。次の EJB コード例は、ゲストロールのユーザーによる他のセキュリティードメインへのアクセスを制限します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow その他のコード例は、Red Hat カスタマーポータルより入手できる JBoss EAP 6 Quickstarts バンドルのejb-securityクイックスタートを参照してください。注記EJB のセキュリティードメインは、jboss-ejb3.xmlデプロイメント記述子を使用して設定することもできます。詳細は、「jboss-ejb3.xml デプロイメント記述子の参照」 を参照してください。
手順18.2 EJB3Bean のカスタムプリンシパルにアクセスするように JBoss EAP 6 を設定します
- JAAS に従うように ApplicationRealm を設定します。
<security-realm name="MyDomainRealm"> <authentication> <jaas name="my-security-domain"/> </security-realm>
<security-realm name="MyDomainRealm"> <authentication> <jaas name="my-security-domain"/> </security-realm>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - カスタムプリンシパルを使用するように JAAS セキュリティードメインを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - カスタムプリンシパルを JBoss モジュールとしてデプロイします。
- を設定します
org.jboss.as.remotingモジュール (modules/org/jboss/as/remoteing/main/module.xml) は、カスタムプリンシパルを含むモジュールに依存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 使用するクライアントを設定する
org.jboss.ejb.client.naming、jboss-ejb-client.propertiesファイルは次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
18.2.9. サーブレットでロールベースのセキュリティーを使用する リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml で指定されたセキュリティードメインによって処理されます。
前提条件
サーブレットでロールベースのセキュリティーを使用する前に、アクセスの認証と承認に使用されるセキュリティードメインを JBoss EAP 6 コンテナーで設定する必要があります。
手順18.3 サーブレットにロールベースのセキュリティーを追加する
サーブレットと URL パターンの間にマッピングを追加します。
web.xmlの<servlet-mapping>要素を使用して、個々のサーブレットを URL パターンにマップします。次の例では、DisplayOpResultというサーブレットを URL パターン/DisplayOpResultにマップします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow URL パターンにセキュリティー制約を追加します。
URL パターンをセキュリティー制約にマップするには、<security-constraint>を使用します。次の例では、URL パターン/DisplayOpResultからのアクセスを、ロールeap_adminのプリンシパルがアクセスするように制限しています。ロールはセキュリティードメインに存在する必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 認証方法を指定する必要があります。これは、BASIC、FORM、DIGEST、CLIENT-CERT、SPNEGO のいずれかになります。この例では、BASIC認証を使用しています。WAR の
jboss-web.xmlでセキュリティードメインを指定しますサーブレットを設定済みのセキュリティードメインに接続するために、セキュリティードメインを WAR のjboss-web.xmlに追加します。これは、セキュリティー制約に対してプリンシパルを認証および承認する方法を知っています。次の例では、acme_domainというセキュリティードメインを使用しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例18.1 ロールベースのセキュリティーが設定された web.xml の例
18.2.10. アプリケーションでサードパーティーの認証システムを使用する リンクのコピーリンクがクリップボードにコピーされました!
context.xml デプロイメント記述子はなくなりました。代わりに、バルブは jboss-web.xml 記述子で直接設定されます。context.xml は無視されるようになりました。
例18.2 基本認証バルブ
例18.3 ヘッダー属性が設定されたカスタムバルブ
カスタムオーセンティケーターの作成
独自のオーセンティケーターを作成することは、このドキュメントの範囲外です。ただし、例として次の Java コードが提供されています。
例18.4 GenericHeaderAuthenticator.java
18.3. ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
18.3.1. モジュールの使用 リンクのコピーリンクがクリップボードにコピーされました!
18.3.1.1. パスワードスタッキング リンクのコピーリンクがクリップボードにコピーされました!
使用するパスワードスタッキング 属性 FirstPass。パスワードスタッキングに設定した以前のモジュールがユーザーを認証した場合、他のすべてのスタッキングモジュールがユーザーによって認証されたこととなり、承認の手順でロールの提供のみを行います。
パスワードスタッキング オプションが useFirstPass に設定されている場合、このモジュールは最初にプロパティー名の下で共有ユーザー名とパスワードを検索しますjavax.security.auth.login.nameとjavax.security.auth.login.passwordログインモジュールの共有状態マップでそれぞれ。
例18.5 パスワードスタッキングサンプル
18.3.1.2. パスワードのハッシュ化 リンクのコピーリンクがクリップボードにコピーされました!
例18.6 パスワードのハッシュ化
nobody を割り当て、usersb64.properties ファイルに based64 でエンコードされた SHA-256 ハッシュのパスワードを含むログインモジュール設定です。usersb64.properties ファイルは、デプロイメントクラスパスの一部です。
- hashAlgorithm
- パスワードをハッシュするために使用される
java.security.MessageDigestアルゴリズムの名前。デフォルトがないため、ハッシュを有効にするには、このオプションを指定する必要があります。一般的な値はSHA-256、SHA-1、およびMD5です。 - hashEncoding
base64、hex、rfc2617の 3 つのエンコーディングタイプのいずれかを指定する文字列。デフォルトはbase64です。- hashCharset
- クリアテキストのパスワードをバイト配列に変換するために使用されるエンコーディング文字セット。プラットフォームのデフォルトエンコーディングがデフォルトです。
- hashUserPassword
- ユーザーが送信するパスワードにハッシュアルゴリズムを適用する必要があることを指定します。ハッシュ化されたユーザーパスワードは、ログインモジュール内の値と比較されます. これは、パスワードのハッシュです。デフォルトは
trueです。 - hashStorePassword
- サーバー側に保存されているパスワードにハッシュアルゴリズムを適用する必要があることを指定します。これは、ユーザーパスワードのハッシュと、比較対象のサーバーからの要求固有のトークンを送信するダイジェスト認証に使用されます。ハッシュアルゴリズム (ダイジェストの場合は
rfc2617) を利用してサーバー側のハッシュを計算し、クライアントから送信されたハッシュ値と一致させる必要があります。
org.jboss.security.auth.spi.Util クラスは、指定されたエンコーディングを使用してパスワードをハッシュする静的ヘルパーメソッドを提供します。次の例では、base64 でエンコードされた MD5 ハッシュパスワードを生成します。
String hashedPassword = Util.createPasswordHash("SHA-256",
Util.BASE64_ENCODING, null, null, "password");
String hashedPassword = Util.createPasswordHash("SHA-256",
Util.BASE64_ENCODING, null, null, "password");
パスワード (password) が OpenSSL ダイジェスト関数にパイプされ、次に別の OpenSSL 関数にパイプされて base64 エンコード形式に変換されます。
echo -n password | openssl dgst -sha256 -binary | openssl base64
echo -n password | openssl dgst -sha256 -binary | openssl base64
XohImNooBHFR0OVvjcYpJ3NgPQ1qq73WKhHvch0VQtg=。この値は、上記の例ではセキュリティードメインで指定されたユーザーのプロパティーファイル (usersb64.properties) に保存する必要があります。
18.3.1.3. 認証されていない ID リンクのコピーリンクがクリップボードにコピーされました!
unauthenticatedIdentity は、認証情報を持たない要求に特定の ID (例: guest) を割り当てるログインモジュール設定オプションです。これを使用すると、保護されていないサーブレットは特定ロールを必要としない EJB でメソッドを呼び出すことができます。このようなプリンシパルには関連したロールがなく、セキュアでない EJB や、チェックされていないパーミッション制約と関連する EJB メソッドのみにアクセスできます。
- unauthenticatedIdentity: これにより、認証情報を含まない要求に割り当てる必要があるプリンシパル名が定義されます。
18.3.1.4. Ldap ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
Ldap ログインモジュールは、ライトウェイトディレクトリーアクセスプロトコル (LDAP) サーバーに対して認証を行う LoginModule 実装です。ユーザー名と資格情報が、Java Naming and Directory Interface (JNDI)LDAP プロバイダーを使用してアクセスできる LDAP サーバーに保管されている場合は、Ldap ログインモジュールを使用します。
AdvancedLdap ログインモジュールの使用を検討するか、AdvancedLdap ログインモジュールのみの使用を検討してください。
- 識別名 (DN)
- LDAP (Lightweight Directory Access Protocol) において、ディレクトリー内のオブジェクトを一意に特定する識別名。各識別名には、他のオブジェクトと区別するための一意名と場所が必要で、これには属性と値のペア (AVP) を使用します。AVP は、共通名、組織単位などの情報を定義します。LDAP に必要となる一意な文字列は、これらの値の組み合わせになります。
- java.naming.factory.initial
InitialContextFactory実装クラス名。これは、デフォルトで SunLDAP プロバイダー実装com.sun.jndi.ldap.LdapCtxFactoryになります。- java.naming.provider.url
- LDAP サーバーの LDAP URL。
- java.naming.security.authentication
- 使用するセキュリティープロトコルレベル。使用可能な値には、
none、simple、strongが含まれます。プロパティーが定義されていない場合に、この動作はサービスプロバイダーによって決定されます。 - java.naming.security.protocol
- 安全なアクセスに使用するトランスポートプロトコル。この設定オプションをサービスプロバイダーのタイプ (SSL など) に設定します。プロパティーが定義されていない場合に、この動作はサービスプロバイダーによって決定されます。
- java.naming.security.principal
- サービスへの呼び出し元を認証するためのプリンシパルの ID を指定します。これは、以下で説明されているように、その他のプロパティーから構築されます。
- java.naming.security.credentials
- サービスへの呼び出し元を認証するためのプリンシパルの資格情報を指定します。資格情報は、ハッシュ化されたパスワード、クリアテキストのパスワード、キー、または証明書の形式をとることができます。プロパティーが定義されていない場合に、この動作はサービスプロバイダーによって決定されます。
true に設定する必要があります。
InitialLdapContext を作成することによって行われます。
InitialLdapContext インスタンスが作成されると)、検索属性がに設定された rolesCtxDN の場所で検索を実行することにより、ユーザーのロールが照会されます。roleAttributeNameとuidAttributeNameオプション値。を呼び出すことによって名前が取得しているロール toString 検索結果セットのロール属性のメソッド。
例18.7 LDAP ログインモジュールセキュリティードメイン
java.naming.factory.initial、java.naming.factory.url、および java.naming.security オプションtestLDAPセキュリティードメインの設定は、次の条件を示しています。
- SunLDAPJNDI プロバイダーの実装が使用されます
- LDAP サーバーは、ポート 1389 のホスト
ldaphost.jboss.orgにあります。 - LDAP サーバーへの接続には、LDAP の単純な認証方法が使用されます。
jsmith は uid = jsmith、ou = People、dc = jboss、dc=org に マップされます。
デューク) の userPassword 属性を使用してユーザーを認証することを前提としています。ほとんどの LDAP サーバーはこのように動作しますが、LDAP サーバーが認証を異なる方法で処理する場合は、LDAP が実稼働環境の要件に従って設定されていることを確認する必要があります。
rolesCtxDN のサブツリー検索を実行して、認証の基になるロールが取得されます。uidAttributeIDユーザーと一致します。もしもmatchOnUserDNtrue の場合、検索はユーザーの完全な DN に基づいて行われます。それ以外の場合、検索は入力された実際のユーザー名に基づいて行われます。この例では、ou = Roles、dc = jboss、dc = org で、uid = jsmith、ou = People、dc = jboss、dc=org に 等しい メンバー 属性を持つエントリーを検索します。検索では、ロールエントリーの下に cn=JBossAdmin が見つかります。
cn です。返される値は JBossAdmin になるため、jsmith ユーザーは JBossAdmin ロールに割り当てられます。
- LDAP データ交換形式 (LDIF)
- LDAP ディレクトリーのコンテンツと更新要求を表すために使用されるプレーンテキストのデータ交換形式。ディレクトリーコンテンツは、オブジェクトまたは更新要求ごとに 1 つのレコードとして表されます。コンテンツは、追加、変更、削除、および名前変更のリクエストで設定されます。
例18.8 LDIF ファイルの例
18.3.1.5. LdapExtended ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
- 識別名 (DN)
- LDAP (Lightweight Directory Access Protocol) において、ディレクトリー内のオブジェクトを一意に特定する識別名。各識別名には、他のオブジェクトと区別するための一意名と場所が必要で、これには属性と値のペア (AVP) を使用します。AVP は、共通名、組織単位などの情報を定義します。LDAP に必要となる一意な文字列は、これらの値の組み合わせになります。
org.jboss.security.auth.spi.LdapExtLoginModule) ログインモジュールは、ユーザーと認証で関連ロールを検索します。ロールは再帰的にクエリーを行い、DN に従って階層的なロール構造を移動します。
- Context.INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial"
- Context.SECURITY_PROTOCOL = "java.naming.security.protocol"
- Context.PROVIDER_URL = "java.naming.provider.url"
- Context.SECURITY_AUTHENTICATION = "java.naming.security.authentication"
- Context.REFERRAL = "java.naming.referral"
- 最初の LDAP サーバーバインドは、bindDNとbindCredentialプロパティー。ThebindDN両方を検索する権限を持つユーザーですbaseCtxDNとrolesCtxDNユーザーとロールのツリー。Theuser DN認証対象は、で指定されたフィルターを使用して照会されますbaseFilter財産。
- 結果としてuserDNを使用して LDAP サーバーにバインドすることで認証されますuserDNInitialLdapContext 環境としてContext.SECURITY_PRINCIPAL。TheContext.SECURITY_CREDENTIALSプロパティーは、コールバックハンドラーによって取得された文字列パスワードに設定されます。
- これが成功すると、rolesCtxDN、roleAttributeID、roleAttributeIsDN、roleNameAttributeID、および roleFilter オプションを使用して、関連付けられたユーザーロールが照会されます。
- トップレベルのロールは roleAttributeID のみに対してクエリーされ、roleNameAttributeID にはクエリーされません。
- roleAttributeIsDN モジュールプロパティーが false に設定されている場合、recurseRoles モジュールオプションが true に設定されていても、再帰ロール検索は無効になります。
図18.1 LDAP 構造の例
例18.9 例 2LDAP 設定
例18.10 例 3LDAP 設定
例18.11 例 4LDAP 設定
例18.12 デフォルトの Active Directory 設定
例18.13 再帰的なロール Active Directory の設定
18.3.1.6. UsersRoles ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
UsersRoles ログインモジュールは、Java プロパティーファイルからロードされる複数のユーザーおよびユーザーロールをサポートする簡単なログインモジュールです。デフォルトの username-to-password マッピングファイル名は users.properties で、デフォルトの username-to-roles マッピングファイル名は roles.propertiesです。
WAR アーカイブの WEB-INF/classes フォルダーなど) またはサーバークラスパスの任意のディレクトリーに配置できます。このログインモジュールの主な目的は、アプリケーションとともにデプロイされたプロパティーファイルを使用して複数のユーザーおよびロールのセキュリティー設定を簡単にテストすることです。
例18.14 UsersRoles ログインモジュール
ejb3-sampleapp-users.properties ファイルは username = password 形式を使用し、各ユーザーエントリーは別々の行にあります。
username1=password1 username2=password2 ...
username1=password1
username2=password2
...
ている ejb3-sampleapp-roles.properties ファイル例18.14「UsersRoles ログインモジュール」パターン username=role1、role2 を 使用し、オプションのグループ名の値を指定します。以下に例を示します。
username1=role1,role2,... username1.RoleGroup1=role3,role4,... username2=role1,role3,...
username1=role1,role2,...
username1.RoleGroup1=role3,role4,...
username2=role1,role3,...
ejb3-sampleapp-roles.properties に存在するプロパティー名パターンは、プロパティー名の XXX 部分がグループ名である特定の名前付きロールグループにユーザー名ロールを割り当てるために使用されます。Theuser name=...form はの略語ですuser name.Roles=...、ここで、Roles グループ名は、JBossAuthorizationManager がユーザーの権限を定義するロールを含むことを期待する標準名です。
jduke ユーザー名の同等の定義です。
jduke=TheDuke,AnimatedCharacter jduke.Roles=TheDuke,AnimatedCharacter
jduke=TheDuke,AnimatedCharacter
jduke.Roles=TheDuke,AnimatedCharacter
18.3.1.7. Database ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
Database ログインモジュールは、認証とロールマッピングをサポートする JDBC (Java Database Connectivity) ベースのログインモジュールです。ユーザー名、パスワード、およびロール情報がリレーショナルデータベースに保存されている場合は、このログインモジュールを使用してください。
データベース ログインモジュールは、次の 2 つの論理テーブルに基づいています。
Table Principals(PrincipalID text, Password text) Table Roles(PrincipalID text, Role text, RoleGroup text)
Table Principals(PrincipalID text, Password text)
Table Roles(PrincipalID text, Role text, RoleGroup text)
Principals テーブルはユーザー PrincipalID を有効なパスワードに関連付けます。また、Roles テーブルはユーザー PrincipalID をそのロールセットに関連付けます。ユーザーパーミッションに使用されるロールは、Roles の RoleGroup コラムの値を持つ行に含まれる必要があります。
java.sql.ResultSet は前述の Principals および Roles と同じ論理構造を持ちます。テーブル名およびコラムの実際の名前は、コラムのインデックスに基づいてアクセスされるため、関係ありません。
Principals および Roles という 2 つのテーブルがあるデータベースを検討してください。以下のステートメントは、以下のデータをテーブルに追加します。
Principalsテーブルのechomanというパワスワードを持つPrincipalIDjavaRolesテーブルのRolesRoleGroupのEchoという名前のロールを持つPrincipalIDjavaRolesテーブルのCallerPrincipalRoleGroupにcaller_javaという名前のロールを持つPrincipalIDjava
INSERT INTO Principals VALUES('java', 'echoman')
INSERT INTO Roles VALUES('java', 'Echo', 'Roles')
INSERT INTO Roles VALUES('java', 'caller_java', 'CallerPrincipal')
INSERT INTO Principals VALUES('java', 'echoman')
INSERT INTO Roles VALUES('java', 'Echo', 'Roles')
INSERT INTO Roles VALUES('java', 'caller_java', 'CallerPrincipal')
データベースログインモジュール の設定例は、次のように設定できます。
CREATE TABLE Users(username VARCHAR(64) PRIMARY KEY, passwd VARCHAR(64)) CREATE TABLE UserRoles(username VARCHAR(64), role VARCHAR(32))
CREATE TABLE Users(username VARCHAR(64) PRIMARY KEY, passwd VARCHAR(64))
CREATE TABLE UserRoles(username VARCHAR(64), role VARCHAR(32))
18.3.1.8. Certificate ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
Certificate ログインモジュールは、X509 証明書を基にユーザーを認証します。このログインモジュールの典型的なユースケースが、web 層の CLIENT-CERT 認証です。
CertRolesLoginModule および DatabaseCertLoginModule は動作を拡張し、プロパティーファイルまたはデータベースから承認ロールを取得します。
証明書 ログインモジュールオプションの詳細については、JBoss EAP の 『セキュリティーガイド』 の 『含まれる認証モジュール』 リファレンスを参照してください。
証明書 ログインモジュールには、ユーザー検証を実行するための KeyStore が必要です。これは、次の設定フラグメントに示すように、リンクされたセキュリティードメインの JSSE 設定から取得されます。
手順18.4 証明書とロールベースの承認による安全な Web アプリケーション
user-app.war などの Web アプリケーションを保護する方法について説明します。この例では、CertificateRoles ログインモジュールが認証と承認に使用されています。trusted-clients.keystore と app-roles.properties の両方に、クライアント証明書に関連付けられたプリンシパルにマップするエントリーが必要です。
リソースとロールを宣言する
web.xmlを変更して、認証と承認に使用できる許可されたロールとセキュリティードメインとともに、保護するリソースを宣言します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow セキュリティードメインを指定する
jboss-web.xmlファイルで、必要なセキュリティードメインを指定します。<jboss-web> <security-domain>app-sec-domain</security-domain> </jboss-web>
<jboss-web> <security-domain>app-sec-domain</security-domain> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログインモジュールの設定
管理 CLI を使用して、指定したapp-sec-domainドメインのログインモジュール設定を定義します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例18.15 証明書の例
trusted-clients.keystore には、次の証明書が必要です。例18.15「証明書の例」CN = valid-client、OU = Security QE、OU = JBoss、O = Red Hat、C=CZ のエイリアスで保存されます。app-roles.properties には同じエントリーが必要です。DN には通常区切り文字として扱われる文字が含まれているため、以下に示すように、円記号 (' \ ') を使用して問題のある文字をエスケープする必要があります。
# A sample app-roles.properties file CN\=valid-client,\ OU\=Security\ QE,\ OU\=JBoss,\ O\=Red\ Hat,\ C\=CZ
# A sample app-roles.properties file
CN\=valid-client,\ OU\=Security\ QE,\ OU\=JBoss,\ O\=Red\ Hat,\ C\=CZ
18.3.1.9. Identity ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
Identity ログインモジュールは、ハードコードされたユーザー名をモジュールに対して認証されたサブジェクトに関連付ける簡単なログインモジュールです。このモジュールは、principal のオプションによって指定された名前を使用して SimplePrincipal インスタンスを作成します。
jduke という名前のプリンシパルとして認証し、TheDuke のロール名と AnimatedCharacter: を割り当てます。
18.3.1.10. RunAs ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
RunAS ログインモジュールは、認証のログインフェーズの間に run as ロールをスタックにプッシュするヘルパーモジュールです。ログインフェーズ後、コミットまたはアボートフェーズで run as ロールをスタックからポップします。
RunAs ログインモジュールは、run as ロールの構築が必要なログインモジュールよりも先に設定する必要があります。
18.3.1.10.1. RunAsIdentity の作成 リンクのコピーリンクがクリップボードにコピーされました!
javax.security.auth.Subject インスタンスまたは org.jboss.security.RunAsIdentity インスタンスのいずれかで表されます。これらのクラスは両方とも、ID を表す 1 つ以上のプリンシパルと、ID が所有するロールのリストを格納します。javax.security.auth.Subject の場合、資格情報のリストも保存されます。
ejb-jar.xml デプロイメント記述子のセクションでは、ユーザーがさまざまな EJB メソッドにアクセスするために必要な 1 つ以上のロールを指定します。これらのリストを比較すると、ユーザーが EJB メソッドにアクセスするために必要なロールの 1 つを持っているかどうかがわかります。
例18.16 org.jboss.security.RunAsIdentity Creation
ejb-jar.xml ファイルで、<security-identity>要素と<run-as><session> 要素の子として定義されたロール。
AdminRunAsIdentity ロールを作成する必要があることを示しています。
管理者 ロールのプリンシパルに名前を付けるには、jboss-ejb3.xml ファイルで <run-as-principal> 要素を定義します。
ejb-jar.xml ファイルの <security-identity> 要素と jboss-ejb3.xml ファイルの <security> 要素の両方がデプロイメント時に解析されます。<run-as> ロール名と <run-as-principal> 名は、org.jboss.metadata.ejb.spec.SecurityIdentityMetaData クラスに保存されます。
例18.17 RunAsIdentity への複数のロールの割り当て
jboss-ejb3.xml デプロイメント記述子 <assembly-descriptor> エレメントグループのプリンシパルにロールをマッピングすることにより、RunAsIdentity により多くのロールを割り当てることができます。
ジョン の <run-as-principal> が作成されました。この例の設定では、サポート ロールを追加することにより、管理者 ロールを拡張します。新しいロールには、最初に定義されたプリンシパル John を含む追加のプリンシパルが含まれます。
ejb-jar.xml ファイルと jboss-ejb3.xml ファイルの両方の <security-role> 要素は、デプロイメント時に解析されます。<role-name> および <principal-name> データは、org.jboss.metadata.ejb.spec.SecurityIdentityMetaData クラスに保存されます。
18.3.1.11. Client ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
Client ログインモジュール (org.jboss.security.ClientLoginModule) は、呼び出し元のアイデンティティーとクレデンシャルの確立時に JBoss クライアントによって使用される LoginModule の実装です。新しい SecurityContext を作成してプリンシパルとクレデンシャルに割り当て、SecurityContext を ThreadLocal セキュリティーコンテキストに設定します。
Client ログインモジュールは、クライアントが現在のスレッドの呼び出し元を確立するために唯一サポートされるログインモジュールです。セキュリティー環境が JBoss EJB security サブシステムを使用するよう透過的に設定されていない EJB クライアントとして動作するサーバー環境とスタンドアロンクライアントアプリケーションは、Client ログインモジュールを使用する必要があります。
クライアント ログインモジュールに加えて別のログインモジュールを設定する必要があります。
18.3.1.12. SPNEGO ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
SPNEGO ログインモジュール (org.jboss.security.negotiation.spnego.SPNEGOLoginModule) は、KDC で呼び出し元のアイデンティティーとクレデンシャルを確立する LoginModule の実装です。モジュールは、SPNEGO、Simple、および Protected GSSAPI Negotiation メカニズムを実装し、JBoss Negotiation プロジェクトの一部です。この認証を AdvancedLdap ログインモジュールとチェーンされた設定で使用すると、LDAP サーバーと連携できます。
SPNEGOまたAdvancedLdapプロジェクトのログインモジュールでは、META-INF/jboss-deployment-structure.xml デプロイメント記述子ファイルを編集して、依存関係を手動で追加する必要があります。
例18.18 JBossNegotiationModule を依存関係として追加する
18.3.1.13. RoleMapping ログインモジュール リンクのコピーリンクがクリップボードにコピーされました!
RoleMapping ログインモジュールは、1 つ以上の宣言的ロールへの認証プロセスの最終結果となるロールのマッピングをサポートします。たとえば、ユーザー A のロールが ldapAdmin と testAdmin で、web.xml または ejb-jar.xml ファイルで定義されたアクセスの宣言的ロールは admin であると認証プロセスによって判断された場合、このログインモジュールは admin ロールを A にマップします。
RoleMapping ログインモジュールオプションの詳細については、JBoss EAP の 『セキュリティーガイド』 の 『含まれる認証モジュール』 リファレンスを参照してください。
RoleMapping ログインモジュールは、以前マップされたロールのマッピングを変更するため、ログインモジュール設定でオプションのモジュールとして定義する必要があります。
例18.19 マップされたロールの定義
例18.20 マップされたロールを定義するための好ましい方法
例18.21 RoleMappingLoginModule によって使用されるプロパティーファイル
ldapAdmin=admin, testAdmin
ldapAdmin=admin, testAdmin
ldapAdmin が含まれている場合、ロール admin および testAdmin は、認証されたサブジェクトに追加されるか、認証されたサブジェクトに置き換えられます。replaceRoleプロパティー値。
18.3.1.14. bindCredential モジュールオプション リンクのコピーリンクがクリップボードにコピーされました!
bindCredential モジュールオプションは、DN の資格情報を保存するために使用され、複数のログインおよびマッピングモジュールで使用できます。パスワードを取得するには、いくつかの方法があります。
- 管理 CLI コマンドのプレーンテキスト。
- のパスワード
bindCredentialモジュールは、管理 CLI コマンドでプレーンテキストで提供できます。例:("bindCredential"=>"secret1").セキュリティー上の理由から、パスワードは JBoss EAP ボールトメカニズムを使用して暗号化する必要があります。 - 外部コマンドを使用します。
- 外部コマンドの出力からパスワードを取得するには、次の形式を使用します
{EXT}...どこ...外部コマンドです。コマンド出力の最初の行がパスワードとして使用されます。パフォーマンスを向上させるために、{EXTC[:expiration_in_millis]}バリアントは、指定されたミリ秒数の間パスワードをキャッシュします。デフォルトでは、キャッシュされたパスワードは期限切れになりません。値0(ゼロ) が指定されている場合、キャッシュされた資格情報は期限切れになりません。TheEXTCバリアントは、LdapExtendedログインモジュール。
例18.22 外部コマンドからパスワードを取得する
{EXT}cat /mysecretpasswordfile
{EXT}cat /mysecretpasswordfile
例18.23 外部ファイルからパスワードを取得し、500 ミリ秒キャッシュします
{EXTC:500}cat /mysecretpasswordfile
{EXTC:500}cat /mysecretpasswordfile
18.3.2. カスタムモジュール リンクのコピーリンクがクリップボードにコピーされました!
AuthenticationManager は、Subject プリンシパルの特定の使用パターンを必要とします。AuthenticationManager と動作するログインモジュールを作成するには、JAAS Subject クラスの情報ストレージ機能と、これらの機能の想定される使用方法を完全に理解する必要があります。
LoginModule 実装を紹介します。
サブジェクト に関連付けられたセキュリティー情報を取得できます。
サブジェクト ID とロールについては、EAP が最も論理的な選択肢を選択しました 。getPrincipals () および getPrincipals (java.lang.Class) を介して取得されたプリンシパルセットです。使用パターンは次のとおりです。
- ユーザー ID(たとえば、ユーザー名、社会保障番号、従業員 ID) は、
サブジェクトプリンシパルセットにjava.security.Principalオブジェクトとして格納されます。ユーザー ID を表すプリンシパルの実装は、プリンシパルの名前に基づいて比較と同等性を確立する必要があります。適切な実装は、org.jboss.security.SimplePrincipalクラスとして利用できます。他のプリンシパルインスタンスは、必要に応じてサブジェクトプリンシパルセットに追加できます。 - 割り当てられたユーザーロールも
プリンシパルセットに保存され、java.security.acl.Groupインスタンスを使用して名前付きロールセットにグループ化されます。Groupインターフェイスは、Principalおよび/またはGroupのコレクションを定義し、java.security.Principalのサブインターフェイスです。 サブジェクトには、任意の数のロールセットを割り当てることができます。
- EAP セキュリティーフレームワークは、
RolesとCallerPrincipalという名前の 2 つのよく知られたロールセットを使用します。ロールグループは、サブジェクトが認証されたアプリケーションドメインで知られている名前付きロールのプリンシパルのコレクションです。このロールセットは、EJBContext.isCallerInRole (String)などのメソッドによって使用されます。EJB は、このメソッドを使用して、現在の呼び出し元が指定されたアプリケーションドメインロールに属しているかどうかを確認できます。メソッド権限チェックを実行するセキュリティーインターセプタロジックも、このロールセットを使用します。CallerPrincipalグループは、アプリケーションドメインのユーザーに割り当てられた単一のプリンシパルID で設定されます。EJBContext.getCallerPrincipal ()メソッドは、CallerPrincipalを使用して、アプリケーションドメインが操作環境 ID からアプリケーションに適したユーザー ID にマップできるようにします。サブジェクトにCallerPrincipalGroupがない場合、アプリケーション ID は運用環境 ID と同じです。
18.3.2.1. サブジェクト使用パターンのサポート リンクのコピーリンクがクリップボードにコピーされました!
サブジェクト の使用パターンの正しい実装を簡素化するため「カスタムモジュール」、EAP には、認証された サブジェクト に正しい サブジェクト の使用を強制するテンプレートパターンを入力するログインモジュールが含まれています。
AbstractServerLoginModule
2 つの中で最も一般的なのは、org.jboss.security.auth.spi.AbstractServerLoginModule クラスです。
javax.security.auth.spi.LoginModule インターフェイスの実装を提供し、運用環境のセキュリティーインフラストラクチャーに固有の主要なタスクのための抽象的なメソッドを提供します。クラスの重要な詳細は、例18.24「AbstractServerLoginModule クラスの一部」。JavaDoc コメントは、サブクラスの責任について詳しく説明しています。
loginOk インスタンス変数は極めて重要です。ログインが成功した場合は true に設定する必要があり、ログインメソッドをオーバーライドするサブクラスでは false に設定する必要があります。この変数が正しく設定されていない場合、commit メソッドはサブジェクトを正しく更新しません。
例18.24 AbstractServerLoginModule クラスの一部
UsernamePasswordLoginModule
カスタムログインモジュールに適した 2 番目の抽象ベースログインモジュールは、org.jboss.security.auth.spi.UsernamePasswordLoginModule です。
char パスワードを認証資格情報として適用することにより、カスタムログインモジュールの実装をさらに簡素化します。また、匿名ユーザー (null のユーザー名とパスワードで示される) のロールのないプリンシパルへのマッピングもサポートします。クラスの重要な詳細は、次のクラスフラグメントで強調表示されています。JavaDoc コメントは、サブクラスの責任について詳しく説明しています。
例18.25 UsernamePasswordLoginModule クラスの一部
ログインモジュールのサブクラス化
AbstractServerLoginModule と UsernamePasswordLoginModule のサブクラスの選択は、ログインモジュールを作成する認証テクノロジーで文字列ベースのユーザー名と資格情報を使用できるかどうかに基づいています。文字列ベースのセマンティクスが有効な場合は、UsernamePasswordLoginModule をサブクラス化し、そうでない場合は、AbstractServerLoginModule をサブクラス化します。
サブクラス化の手順
カスタムログインモジュールが実行する必要のある手順は、選択した基本ログインモジュールクラスによって異なります。セキュリティーインフラストラクチャーと統合するカスタムログインモジュールを作成するときは、AbstractServerLoginModule または UsernamePasswordLoginModule をサブクラス化して、ログインモジュールが EAP セキュリティーマネージャーが期待する形式で認証された プリンシパル 情報を提供するようにする必要があります。
AbstractServerLoginModule をサブクラス化するときは、以下をオーバーライドする必要があります。
void initialize (Subject、CallbackHandler、Map、Map): 解析するカスタムオプションがある場合。boolean login (): 認証アクティビティーを実行します。ログインが成功した場合はloginOkインスタンス変数を true に設定し、失敗した場合は false に設定してください。Principal getIdentity ():log ()ステップによって認証されたユーザーのPrincipalオブジェクトを返します。Group getRoleSets ():login ()中に認証されたプリンシパルに割り当てられたロールを含むRolesという名前のグループを少なくとも 1 つ返します。2 番目の共通グループはCallerPrincipalという名前で、セキュリティードメイン ID ではなくユーザーのアプリケーション ID を提供します。
UsernamePasswordLoginModule をサブクラス化するときは、以下をオーバーライドする必要があります。
void initialize (Subject、CallbackHandler、Map、Map): 解析するカスタムオプションがある場合。Group getRoleSets ():login ()中に認証されたプリンシパルに割り当てられたロールを含むRolesという名前のグループを少なくとも 1 つ返します。2 番目の共通グループはCallerPrincipalという名前で、セキュリティードメイン ID ではなくユーザーのアプリケーション ID を提供します。String getUsersPassword ():getUsername ()メソッドを介して使用可能な現在のユーザー名の予想されるパスワードを返します。getUsersPassword ()メソッドは、callbackhandlerがユーザー名と候補パスワードを返した後、login ()内から呼び出されます。
18.3.2.2. カスタム LoginModule の例 リンクのコピーリンクがクリップボードにコピーされました!
UsernamePasswordLoginModule を拡張し、JNDI ルックアップからユーザーのパスワードとロール名を取得するカスタムログインモジュールの例を作成するのに役立ちます。
password/<username> という形式の名前 (<username> は現在のユーザー) を使用してコンテキストを検索すると、ユーザーのパスワードを返すカスタム JNDI コンテキストログインモジュールを作成します。認証されている)。同様に、roles/<username> の形式を検索すると、要求されたユーザーのロールが返されます。の例18.26「JndiUserAndPassLoginModule Custom Login Module」JndiUserAndPassLoginModule カスタムログインモジュールのソースコードです。
JBossUsernamePasswordLoginModule を拡張するため、JndiUserAndPassLoginModule は JNDI ストアからユーザーのパスワードとロールを取得することに注意してください。JndiUserAndPassLoginModule は、JAASLoginModule 操作と相互作用しません。
例18.26 JndiUserAndPassLoginModule Custom Login Module
例18.27 セキュリティーの定義 - 新しく作成されたカスタムログインモジュールを使用した ex2 セキュリティードメイン
JndiUserAndPassLoginModule カスタムログインモジュールを使用するかどうかは、セキュリティードメインの例のログイン設定によって決まります。EJB JAR META-INF/jboss-ejb3.xml 記述子は、セキュリティードメインを設定します。Web アプリケーションの場合、これは WEB-INF/jboss-web.xml ファイルの一部です。
例18.28 jboss-ejb3.xml の 例
例18.29 jboss-web.xml example
<?xml version="1.0"?>
<jboss-web>
<security-domain>security-ex2</security-domain>
</jboss-web>
<?xml version="1.0"?>
<jboss-web>
<security-domain>security-ex2</security-domain>
</jboss-web>
18.4. EJB アプリケーションセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
18.4.1. セキュリティーアイデンティティー リンクのコピーリンクがクリップボードにコピーされました!
18.4.1.1. EJB セキュリティーアイデンティティー リンクのコピーリンクがクリップボードにコピーされました!
18.4.1.2. EJB のセキュリティーアイデンティティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
<security-identity> タグで指定します。
<security-identity> タグが存在しない場合、EJB 自身の呼び出し元 ID が使用されます。
例18.30 EJB のセキュリティーアイデンティティーの呼び出し元と同じ値への設定
<security-identity> 要素の宣言を指定しない場合は、この動作がデフォルトになります。
例18.31 EJB のセキュリティーアイデンティティーの特定のロールへの設定
<security-identity> タグ内の <run-as> と <role-name> タグを使用します。
<run-as> を使用すると、anonymous という名前のプリンシパルが発信呼び出しに割り当てられます。異なるプリンシパルを割り当てるには、<run-as-principal> を使用します。
<run-as> および <run-as-principal> 要素を使用することもできます。
以下も参照してください。
18.4.2. EJB メソッドパーミッション リンクのコピーリンクがクリップボードにコピーされました!
18.4.2.1. EJB メソッドパーミッションについて リンクのコピーリンクがクリップボードにコピーされました!
<method-permission> 要素の宣言は、EJB のインターフェイスメソッドを呼び出すことができるロールを指定します。以下の組み合わせのパーミッションを指定できます。
- 名前付き EJB のすべてのホームおよびコンポーネントインターフェースメソッド
- 名前付き EJB のホームまたはコンポーネントインターフェースの指定メソッド
- オーバーロード名を持つ一連のメソッドに指定されたメソッド
18.4.2.2. EJB メソッドパーミッションの使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
<method-permission> 要素は、<method> 要素で定義される EJB メソッドへのアクセスを許可される論理ロールを定義します。複数の例は、XML の構文を示しています。複数のメソッドパーミッションステートメントが存在する可能性があり、それらのステートメントには累積的影響があります。<method-permission> 要素は、<ejb-jar> 記述子の <assembly-descriptor> 要素の子です。
例18.32 ロールに対する EJB の全メソッドへのアクセスの許可
例18.33 ロールが EJB の特定のメソッドにのみアクセスできるようにし、渡すことができるメソッドパラメーターを制限します。
例18.34 任意の認証されたユーザーによる EJB のメソッドへのアクセスの許可
<unchecked/> 要素を使用すると、認証されたユーザーが指定されたメソッドを使用できます。
例18.35 特定の EJB メソッドの使用を完全に除外します
例18.36 複数の <method-permission> ブロックを含む完全な <assembly-descriptor>
18.4.3. EJB セキュリティーアノテーション リンクのコピーリンクがクリップボードにコピーされました!
18.4.3.1. EJB セキュリティーアノテーションについて リンクのコピーリンクがクリップボードにコピーされました!
javax.annotation.security アノテーションは JSR-250 で定義されます。
- @DeclareRoles
- 利用可能なロールを宣言します。
- @RunAs
- コンポーネントの伝播セキュリティーアイデンティティーを設定します。
18.4.3.2. EJB セキュリティーアノテーションの使用 リンクのコピーリンクがクリップボードにコピーされました!
概要
XML 記述子またはアノテーションのいずれかを使用して、Enterprise JavaBean (EJB) でメソッドを呼び出すことのできるセキュリティーロールを制御できます。XML 記述子の使用については、「EJB メソッドパーミッションの使用」 を参照してください。
EJB のセキュリティーパーミッションを制御するアノテーション
- @DeclareRoles
- @DeclareRoles を使用して、パーミッションをチェックするセキュリティーロールを定義します。@DeclareRoles がない場合、一覧は @RolesAllowed アノテーションから自動的にビルドされます。ロールの設定に関する詳細は、『Java EE 6 チュートリアル』 Specifying Authorized Users by Declaring Security Roles を参照してください。
- @RolesAllowed, @PermitAll, @DenyAll
- 使用する
@RolesAllowed1 つまたは複数のメソッドへのアクセスが許可されているロールを一覧表示します。使用する@PermitAllまた@DenyAll1 つまたは複数のメソッドの使用からすべてのロールを許可または拒否します。アノテーションメソッドのパーミッション設定に関する詳細は、『Java EE 6 チュートリアル』 Specifying Authorized Users by Declaring Security Roles を参照してください。 - @RunAs
@RunAsを使用して、アノテーション付きのメソッドから呼び出しを行うときにメソッドが使用するロールを指定します。アノテーションを使用してセキュリティーアイデンティティーを伝播する方法は、『Java EE 6 チュートリアル』 Propagating a Security Identity (Run-As) を参照してください。
例18.37 セキュリティー注釈の例
WelcomeEveryone。TheGoodByeメソッドはを使用しますtempemployee電話をかけるときのロール。のみadminロールはメソッドにアクセスできますGoodbyeAdmin、およびセキュリティーアノテーションのないその他のメソッド。
18.4.4. EJB へのリモートアクセス リンクのコピーリンクがクリップボードにコピーされました!
18.4.4.1. リモートメソッドアクセスについて リンクのコピーリンクがクリップボードにコピーされました!
サポートされているトランスポートタイプ
- ソケット/セキュアソケット
- RMI/RMI over SSL
- HTTP / HTTPS
- サーブレット/セキュアサーブレット
- Bisocket/Secure Bisocket
データマーシャリング
リモーティングシステムは、データマーシャリングおよびアンマーシャリングサービスも提供します。データマーシャリングとは、ネットワークとプラットフォームの境界を越えてデータを安全に移動し、別のシステムがデータに対して作業を実行できるようにする機能を指します。その後、作業は元のシステムに送り返され、ローカルで処理されたかのように動作します。
アーキテクチャーの概要
Remoting を使用するクライアントアプリケーションを設計するときは、URL タイプ形式の単純な文字列である InvokerLocator と呼ばれる特別なタイプのリソースロケーターを使用するようにアプリケーションを設定することにより、サーバーと通信するようにアプリケーションに指示します。サーバーは、リモーティング サブシステムの一部として設定されている コネクター でリモートリソースの要求をリッスンします。コネクター は、設定された ServerInvocationHandler に要求を渡します。各 ServerInvocationHandler はメソッドを実装しますinvoke(InvocationRequest)、リクエストの処理方法を知っています。
JBossRemotingFramework レイヤー
- ユーザーは外層と対話します。クライアント側では、外層は
Clientクラス。呼び出し要求を送信します。サーバー側では、ユーザーによって実装され、呼び出し要求を受け取るのは InvocationHandler です。 - トランスポートは、呼び出し側レイヤーによって制御されます。
- 最下層には、データ形式をワイヤ形式に変換するマーシャラーとアンマーシャラーが含まれています。
18.4.4.2. コールバックのリモート処理について リンクのコピーリンクがクリップボードにコピーされました!
InvocationRequestクライアントに。サーバー側のコードは、コールバックが同期であるか非同期であるかに関係なく、同じように機能します。クライアントだけが違いを知る必要があります。サーバーの InvocationRequest はresponseObjectクライアントに。これは、クライアントが要求したペイロードです。これは、リクエストまたはイベント通知への直接の応答である可能性があります。
m_listeners物体。サーバーハンドラーに追加されたすべてのリスナーのリストが含まれています。TheServerInvocationHandlerインターフェイスには、このリストを管理できるメソッドが含まれています。
org.jboss.remoting.InvokerCallbackHandler、コールバックデータを処理します。コールバックハンドラーを実装した後、プルコールバックのリスナーとして自分自身を追加するか、プッシュコールバックのコールバックサーバーを実装します。
コールバックをプル
プルコールバックの場合、クライアントは、を使用してサーバーのリスナーのリストに自分自身を追加します。Client.addListener()方法。次に、コールバックデータの同期配信のためにサーバーを定期的にポーリングします。このポーリングは、Client.getCallbacks()。
プッシュコールバック
プッシュコールバックでは、クライアントアプリケーションが独自の InvocationHandler を実行する必要があります。これを行うには、クライアント自体で Remoting サービスを実行する必要があります。これは、コールバックサーバー と呼ばれます。コールバックサーバーは着信要求を非同期で受け入れ、要求者 (この場合はサーバー) のためにそれらを処理します。クライアントのコールバックサーバーをメインサーバーに登録するには、コールバックサーバーのInvokerLocatorの 2 番目の引数としてaddListener方法。
18.4.4.3. リモーティングサーバー検出について リンクのコピーリンクがクリップボードにコピーされました!
18.4.4.4. リモーティングサブシステムを設定する リンクのコピーリンクがクリップボードにコピーされました!
概要
JBoss Remoting には、3 つのトップレベルの設定可能な要素があります。ワーカースレッドプール、1 つ以上のコネクター、および一連のローカルおよびリモート接続 URI です。このトピックでは、設定可能な各項目の説明、各項目を設定する方法の CLI コマンドの例、および完全に設定されたサブシステムの XML の例を示します。この設定はサーバーにのみ適用されます。独自のアプリケーションにカスタムコネクターを使用する場合を除き、Remoting のサブシステムの設定は必要でないことがほとんどです。EJB などの、リモーティングクライアントとして動作するアプリケーションには特定のコネクターに接続するための別の設定が必要になります。
CLI コマンドの適応
CLI コマンドは、デフォルト のプロファイルを設定するときに、管理対象ドメイン用に作成されます。別のプロファイルを設定するには、その名前に置き換えます。スタンドアロンサーバーの場合、コマンドの /profile=default 部分を省略します。
リモーティングサブシステム外の設定
リモーティング サブシステムの外部にあるいくつかの設定の側面があります。
- ネットワークインターフェース
リモーティングサブシステムで使用されるネットワークインターフェイスは、domain/configuration/domain.xmlまたはstandalone/configuration/standalone.xmlで定義されているパブリックインターフェイスです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow パブリックインターフェイスのホストごとの定義は、domain.xmlまたはstandalone.xmlと同じディレクトリーのhost.xmlで定義されます。このインターフェイスは、他のいくつかのサブシステムでも使用されます。変更するときは注意してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - socket-binding
remotingサブシステムによって使用されるデフォルトのソケットバインディングは TCP ポート 4447 にバインドされます。これを変更する必要がある場合の詳細は、ソケットバインディングとソケットバインディンググループに関するドキュメントを参照してください。ソケットバインディングおよびソケットバインディンググループに関する情報は、JBoss EAP の 『管理および設定ガイド』 の 『ソケットバインディンググループ』 の章にあります。 https://access.redhat.com/documentation/ja-jp/red_hat_jboss_enterprise_application_platform/?version=6.4- EJB の リモーティングコネクター参照
- EJB サブシステムにはリモートメソッド呼び出しに対するリモーティングコネクターへの参照が含まれています。デフォルト設定は次のとおりです。
<remote connector-ref="remoting-connector" thread-pool-name="default"/>
<remote connector-ref="remoting-connector" thread-pool-name="default"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - セキュアなトランスポート設定
- リモーティングトランスポートはクライアントの要求があれば StartTLS を使用してセキュアな接続 (HTTPS、Secure Servlet など) を使用します。セキュアな接続とセキュアでない接続の両方で同じソケットバインディング (ネットワークポート) が使用されるため、サーバー側に追加の設定をする必要はありません。クライアントは必要に応じてセキュアなトランスポートまたはセキュアでないトランスポートを要求します。EJB、ORB、JMS プロバイダーなどのリモーティングを使用する JBoss EAP 6 のコンポーネントはデフォルトでセキュアなインターフェイスを使用します。
ワーカースレッドプール
ワーカースレッドプールは、Remoting コネクターを介して入ってくる作業を処理するために使用できるスレッドのグループです。これは単一の要素 <worker-thread-pool> であり、いくつかの属性を取ります。ネットワークタイムアウトが発生した場合、スレッドが不足した場合、またはメモリー使用量を制限する必要がある場合は、これらの属性を調整してください。具体的な推奨事項は、特定の状況によって異なります。詳細は Red Hat グローバルサポートサービスまでお問い合わせください。
| 属性 | 説明 | CLI コマンド |
|---|---|---|
| 読み取りスレッド |
リモーティングワーカーに対して作成する読み取りスレッドの数。デフォルトは
1です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-read-threads,value=1)
|
| write-threads |
リモーティングワーカーに作成する書き込みスレッドの数。デフォルトは
1です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-write-threads,value=1)
|
| task-keepalive |
コアでないリモーティングワーカーのタスクスレッドにキープアライブを使用する期間 (ミリ秒単位)。デフォルトは
60 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-keepalive,value=60)
|
| task-max-threads |
リモーティングワーカーのタスクスレッドプールに対するスレッドの最大数。デフォルトは
16 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-max-threads,value=16)
|
| task-core-threads |
リモーティングワーカーのタスクスレッドプールに対するコアスレッドの数。デフォルトは
4 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-core-threads,value=4)
|
| task-limit |
許可するリモーティングワーカータスクの最大数。 この数を超えるリモーティングワーカータスクは拒否されます。デフォルトは
16384 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-limit,value=16384)
|
コネクター
コネクターは主な Remoting 設定要素です。複数のコネクターを設定できます。それぞれは、いくつかのサブ要素といくつかの可能な属性を持つ要素 <connector> 要素で設定されています。デフォルトのコネクターは複数の JBoss EAP 6 サブシステムによって使用されます。カスタムコネクターの要素や属性の設定はアプリケーションによって異なるため、詳細は Red Hat グローバルサポートサービスまでご連絡ください。
| 属性 | 説明 | CLI コマンド |
|---|---|---|
| socket-binding | このコネクターに使用するソケットバインディングの名前。 | /profile = default/subsystem = remoteing/connectedor = remoteing-connector/:write-attribute (name = socket-binding、value = remoteing)
|
| authentication-provider |
このコネクターで使用するコンテナー用 Java 認証サービスプロバイダーインターフェイス (JASPIC) モジュール。モジュールはクラスパスに含まれている必要があります。
| /profile = default/subsystem = remoteing/connectedor = remoteing-connector/:write-attribute (name = authentication-provider、value = myProvider)
|
| security-realm |
任意。アプリケーションのユーザー、パスワード、およびロールを含むセキュリティーレルム。EJB または Web アプリケーションは、セキュリティーレルムに対して認証できます。
ApplicationRealm は、デフォルトの JBoss EAP 6 インストールで使用できます。
| /profile = default/subsystem = remoteing/connectedor = remoteing-connector/:write-attribute (name = security-realm、value = ApplicationRealm)
|
| 属性 | 説明 | CLI コマンド |
|---|---|---|
| sasl |
Simple Authentication and Security Layer (SASL) 認証メカニズムの囲み要素
| 該当なし
|
| properties |
1 つ以上の
<property> 要素が含まれ、それぞれに name 属性とオプションの value 属性があります。
| /profile = default/subsystem = remoteing/connectedor = remoteing-connector/property = myProp/:add (value = myPropValue)
|
送信接続
3 つのタイプのアウトバウンド接続を指定することができます。
- STF へのアウトバウンド接続
- ソケットなどのローカルリソースに接続するローカルアウトバウンド接続
- リモートリソースに接続し、セキュリティーレルムを使用して認証を行うリモートアウトバウンド接続
<outbound-connections> 要素で囲まれています。これらの各接続タイプは、outbound-socket-binding-ref 属性を取ります。アウトバウンド接続は uri 属性を取ります。リモートアウトバウンド接続は、オプションの ユーザー名 と セキュリティーレルム 属性を使用して承認に使用します。
| 属性 | 説明 | CLI コマンド |
|---|---|---|
| outbound-connection | 一般的なアウトバウンド接続。 | /profile = default/subsystem = remoting/outbound-connection = my-connection/:add (uri = http://my-connection)
|
| local-outbound-connection | 暗黙の local://URI スキームを使用したアウトバウンド接続。 | /profile = default/subsystem = remoteing/local-outbound-connection = my-connection/:add (outbound-socket-binding-ref = remoteing2)
|
| remote-outbound-connection |
セキュリティーレルムで基本/ダイジェスト認証を使用する、remote://URI スキームのアウトバウンド接続。
| /profile = default/subsystem = remoteing/remote-outbound-connection = my-connection/:add (outbound-socket-binding-ref = remoteing、username = myUser、security-realm = ApplicationRealm)
|
SASL 要素
SASL 子要素を定義する前に、最初の SASL 要素を作成する必要があります。以下のコマンドを使用します。
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:add
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:add
| 属性 | 説明 | CLI コマンド |
|---|---|---|
| include-mechanisms |
SASL メカニズムのリストである
value 属性が含まれています。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=include-mechanisms,value=["DIGEST","PLAIN","GSSAPI"])
|
| qop |
優先度の高い順に、SASL の保護品質値のリストである
value 属性が含まれています。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=qop,value=["auth"])
|
| strength |
優先度の高い順に、SASL 暗号強度値のリストである
value 属性が含まれています。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=strength,value=["medium"])
|
| reuse-session |
ブール値である
value 属性が含まれています。true の場合、セッションの再利用を試みます。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=reuse-session,value=false)
|
| server-auth |
ブール値である
value 属性が含まれています。true の場合、サーバーはクライアントに対して認証を行います。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=server-auth,value=false)
|
| policy |
以下の要素を 0 個以上含む囲み要素。それぞれが単一の
値 を取ります。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:add
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=forward-secrecy,value=true)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-active,value=false)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-anonymous,value=false)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-dictionary,value=true)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-plain-text,value=false)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=pass-credentials,value=true)
|
| properties |
1 つ以上の
<property> 要素が含まれ、それぞれに name 属性とオプションの value 属性があります。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/property=myprop:add(value=1)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/property=myprop2:add(value=2)
|
例18.38 設定例
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>
まだ文書化されていない設定の側面
- JNDI およびマルチキャスト自動検出
18.4.4.5. リモート EJB クライアントでのセキュリティーレルムの使用 リンクのコピーリンクがクリップボードにコピーされました!
- 新しいセキュリティーレルムをドメインコントローラーまたはスタンドアロンサーバーに追加します。
- アプリケーションのクラスパスにある
jboss-ejb-client.propertiesファイルに以下のパラメーターを追加します。この例では、接続がファイル内の他のパラメーターによってdefaultとして参照されていることを前提としています。remote.connection.default.username=appuser remote.connection.default.password=apppassword
remote.connection.default.username=appuser remote.connection.default.password=apppasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しいセキュリティーレルムを使用するドメインまたはスタンドアロンサーバーでカスタムリモーティングコネクターを作成します。
- カスタムリモーティングコネクターでプロファイルを使用するよう設定されたサーバーグループに EJB を追加します。または管理対象ドメインを使用していない場合はスタンドアロンサーバーに EJB をデプロイします。
18.4.4.6. 新しいセキュリティーレルムの追加 リンクのコピーリンクがクリップボードにコピーされました!
管理 CLI を実行します。
jboss-cli.shまたはjboss-cli.batコマンドを起動して、サーバーに接続します。新しいセキュリティーレルム自体を作成します。
以下のコマンドを実行し、ドメインコントローラーまたはスタンドアロンサーバーにMyDomainRealmという名前の新しいセキュリティーレルムを作成します。ドメインインスタンスの場合は、以下のコマンドを使用します。/host=master/core-service=management/security-realm=MyDomainRealm:add()
/host=master/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow スタンドアロンインスタンスの場合には、以下のコマンドを使用します。/core-service=management/security-realm=MyDomainRealm:add()
/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新規ロールに関する情報を格納するプロパティーファイルへの参照を作成します。
以下のコマンドを実行して、新しいロールに関連するプロパティーが含まれるmyfile.propertiesファイルへのポインターを作成します。注記新しく作成されたプロパティーファイルは、含まれるadd-user.shおよびadd-user.batスクリプトでは管理されません。外部で管理する必要があります。ドメインインスタンスの場合は、以下のコマンドを使用します。/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow スタンドアロンインスタンスの場合には、以下のコマンドを使用します。/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
新しいセキュリティーレルムが作成されます。この新しいレルムにユーザーおよびロールを追加すると、情報はデフォルトのセキュリティーレルムとは別のファイルに保存されます。この新しいファイルは、独自のアプリケーションまたは手順を使用して管理できます。
18.4.4.7. セキュリティーレルムへのユーザーの追加 リンクのコピーリンクがクリップボードにコピーされました!
add-user.shまたはadd-user.batコマンドを実行します。ターミナルを開き、EAP_HOME/bin/ディレクトリーに移動します。Red Hat Enterprise Linux またはその他の UNIX と同様のオペレーティングシステムを使用している場合には、add-user.shを実行します。Microsoft Windows Server を実行している場合は、add-user.batを実行します。管理ユーザーまたはアプリケーションユーザーを追加するかどうかを選択します。
この手順では、bと入力してアプリケーションユーザーを追加します。ユーザーを追加するレルムを選択します。
デフォルトでは、利用可能なレルムはApplicationRealmのみです。カスタムレルムを追加した場合は、代わりにその名前を入力できます。プロンプトが表示されたら、ユーザー名、パスワード、およびロールを入力します。
プロンプトが表示されたら、希望のユーザー名、パスワード、および任意のロールを入力します。yesを入力して選択を確認するか、noと入力して変更をキャンセルします。変更は、セキュリティーレルムの各プロパティーファイルに書き込まれます。
18.4.4.8. SSL 暗号化を使用したリモート EJB アクセス リンクのコピーリンクがクリップボードにコピーされました!
18.5. JAX-RS アプリケーションセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
18.5.1. RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasy は JAX-RS メソッドでの @RolesAllowed、@PermitAll、@DenyAll アノテーションに対応しています。ただし、デフォルトではこれらの注釈は認識されません。以下の手順に従って、web.xml ファイルを設定し、ロールベースのセキュリティーを有効にします。
- resteasy.document.expand.entity.references
- resteasy.document.secure.processing.feature
- resteasy.document.secure.disableDTDs
手順18.5 RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - 以下の <context-param> をファイルに、
web-app内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - <security-role> タグを使用して、RESTEasy JAX-RS WAR ファイル内で使用されるすべてのロールを宣言します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - すべてのロールについて JAX-RS ランタイムによって処理されるすべての URL へのアクセスを承認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
ロールベースのセキュリティーは、定義されたロールとともにアプリケーション内で有効にされています。
例18.39 例: ロールベースのセキュリティー設定
18.5.2. アノテーションを使用して JAX-RSWeb サービスを保護する リンクのコピーリンクがクリップボードにコピーされました!
概要
このトピックでは、サポートされているセキュリティーアノテーションを使用して JAX-RSWeb サービスを保護する手順について説明します。
手順18.6 サポートされているセキュリティーアノテーションを使用して JAX-RSWeb サービスを保護する
- ロールベースセキュリティーを有効化します。詳細は、「RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化」 を参照してください。
- JAX-RS Web サービスにセキュリティーアノテーションを追加します。RESTEasy は以下のアノテーションをサポートします。
- @RolesAllowed
- メソッドにアクセスできるロールを定義します。すべてのロールは
web.xmlファイルで定義する必要があります。 - @PermitAll
web.xmlファイルに定義されているすべてのロールがメソッドにアクセスできるようにします。- @DenyAll
- メソッドへのすべてのアクセスを拒否します。
18.6. 機密性の高い文字列のパスワード vault リンクのコピーリンクがクリップボードにコピーされました!
18.6.1. パスワード vault システム リンクのコピーリンクがクリップボードにコピーされました!
18.6.2. パスワード Vault の設定と使用 リンクのコピーリンクがクリップボードにコピーされました!
手順18.7 パスワード Vault の設定および使用に関する基本的な手順
- Java キーストアを設定し、パスワード暗号化用のキーを格納します。キーストアの作成は、「機密性が高い文字列を格納する Java キーストアの作成」 を参照してください。。
- パスワード vault を初期化します。パスワードのマスキングとパスワード Vault の初期化については、「パスワード vault の初期化」 を参照してください。
- パスワード Vault に機密文字列を保存します。機密文字列をパスワード Vault に保存する方法については、「パスワード Vault に Sensitive 文字列を保存します。」 を参照してください。
- パスワード vault を使用するように JBoss EAP 6 を設定します。パスワード Vault を使用するように JBoss EAP 6 を設定する方法については、「パスワード vault を使用するよう JBoss EAP 6 を設定」 を参照してください。カスタム実装については、「パスワード Vault のカスタム実装を使用するよう JBoss EAP 6 を設定」 を参照してください注記暗号化した機密文字列を設定で使用する方法は、「暗号化した機密文字列を設定で使用」 を参照してください。アプリケーションで暗号化した機密文字列を使用する方法は、「アプリケーションで暗号化した機密文字列の使用」 を参照してください。パスワード Vault で機密文字列を確認するには、「機密文字列がパスワード vault 内にあるかどうかを確認します。」 を参照してください。パスワード Vault から機密文字列を削除するには、「パスワード vault からの機密文字列の削除」 を参照してください。
18.6.3. 外部ソースからのキーストアパスワードの取得 リンクのコピーリンクがクリップボードにコピーされました!
<vault-option name="KEYSTORE_PASSWORD" value="[here]"
<vault-option name="KEYSTORE_PASSWORD" value="[here]"
- これは、そのまま使えるコマンドを参照します。ここでの
{EXT}...は、実際のコマンドです。例:{EXT}/usr/bin/getmypassword --section 1 --query company。/usr/bin/getmypasswordを実行すると、パスワードを標準出力に表示し、Security Vault のキーストアのパスワードとして使用します。この例では --section 1 と --query company のオプションを使用しています。 {EXTC[:expiration_in_millis]}...: 実際のコマンドを参照します。ここでの、... は、プラットフォームコマンドを実行するために Runtime.exec(String) メソッドに渡される、実際のコマンドラインです。コマンド出力の最初の行がパスワードとして使用されます。EXTC バリアントは expiration_in_millis ミリ秒のパスワードをキャッシュします。デフォルトのキャッシュ有効期限は 0 (ゼロ) です。これは、キャッシュ内のアイテムが期限切れにならないことを意味します。例:{EXTC:120000}/usr/bin/getmypassword --section 1 --query company。/usr/bin/getmypasswordの出力がキャッシュに含まれているかどうかを確認します。出力が含まれている場合はそれを使用します。出力がない場合は、コマンドを実行してこれをキャッシュに出力して使用します。この例では、キャッシュは 2 分 (120000 ミリ秒) で期限切れになります。{CMD}...or{CMDC[:expiration_in_millis]}...: 一般的なコマンドは 「,」 (コンマ) で区切られた文字列です。最初の部分は実際のコマンドで、追加の部分はパラメーターを表します。コンマにバックスラッシュを付けることで、パラメーターの一部として維持することができます。例:{CMD}/usr/bin/getmypassword,--section,1,--query,company{CLASS[@jboss_module_spec]}classname[:ctorargs]: [:ctorargs] は、クラス名から : (コロン) によって区切られるオプションの文字列です。これは、クラス名 ctor に渡されます。ctorargs は文字列のコンマ区切りの一覧です。例:{CLASS@org.test.passwd}org.test.passwd.ExternamPassworProvider.この例では、org.test.passwdモジュールからのorg.test.passwd.ExternamPassworProviderクラスを読み込んで、toCharArray()メソッドを使用し、パスワードを取得します。toCharArray()が利用できない場合はtoString()メソッドを使用します。org.test.passwd.ExternamPassworProviderクラスにはデフォルトのコンストラクターが必要です。
18.6.4. 機密性が高い文字列を格納する Java キーストアの作成 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- Java Runtime Environment (JRE) によって提供される keytool ユーティリティー。このファイルへのパスを見つけます。Red Hat Enterprise Linux では、
/usr/bin/keytoolです。
java.io.IOException: com.sun.crypto.provider.SealedObjectForKeyProtector
java.io.IOException: com.sun.crypto.provider.SealedObjectForKeyProtector
手順18.8 Java キーストアの設定
キーストアと他の暗号化された情報を格納するディレクトリーを作成します。
キーストアと他の重要な情報を格納するディレクトリーを作成します。この手順では、ディレクトリーはEAP_HOME/vault/と想定します。このディレクトリーには機密情報が含まれるため、アクセスは、一部のユーザーに制限する必要があります。JBoss EAP を実行しているユーザーアカウントには少なくとも読み書き込みアクセスが必要です。keytool ユーティリティーで使用するパラメーターを決定します。
以下のパラメーターの値を決めます。- alias
- エイリアスは、vault やキーストアに保存されている他のデータの一意識別子です。エイリアスは大文字と小文字を区別しません。
- storetype
- ストアタイプはキーストアのタイプを指定します。値は、
jceksが推奨されます。 - keyalg
- 暗号化に使用するアルゴリズム。JRE とオペレーティングシステムのドキュメントを使用して、他にどの選択肢が利用できるかを確認してください。
- keysize
- 暗号化キーのサイズは、ブルートフォースでの暗号解除の難易度に影響します。適切な値の詳細は、keytool ユーティリティーとともに配布されるドキュメントを参照してください。
- storepass
storepassの値は、キーストアに対する認証に使用されるパスワードであるため、鍵を読み取ることができます。パスワードは 6 文字以上である必要があります。パスワードは、キーストアへのアクセス時に入力する必要があります。このパラメーターを省略すると、コマンドの実行時に入力を求められます。- keypass
keypassの値は、特定のキーにアクセスするために使用されるパスワードで、storepassパラメーターの値と一致する必要があります。- validity
validityの値は、鍵が有効になる期間 (日数) です。- keystore
keystoreの値は、keystore の値が格納される予定のファイルパスおよびファイル名です。キーストアファイルは、データが最初に追加されると作成されます。正しいファイルパス区切り文字が使用されていることを確認します。Red Hat Enterprise Linux および同様のオペレーティングシステムの場合は/(フォワードスラッシュ)、Microsoft Windows Server の場合は\(バックスラッシュ) を使用します。
Keytool ユーティリティーには、その他の多くのオプションがあります。詳細は、JRE またはオペレーティングシステムのドキュメントを参照してください。keytool コマンドを実行します。
オペレーティングシステムのコマンドラインインターフェイスを開き、収集した情報を使用して keytool ユーティリティーを実行します。
例18.40 Java キーストアの作成
keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault22 -keypass vault22 -validity 730 -keystore EAP_HOME/vault/vault.keystore
$ keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault22 -keypass vault22 -validity 730 -keystore EAP_HOME/vault/vault.keystore
結果
この場合、キーストアはファイルは EAP_HOME/vault/vault.keystore に作成されています。JBoss EAP では、パスワードなどの暗号化された文字列を保存するために使用されるエイリアス vault とともに単一のキーを保存します。
18.6.5. パスワード vault の初期化 リンクのコピーリンクがクリップボードにコピーされました!
概要
パスワード vault は、各パラメーターの値を入力するように求められる対話的な方法、またはすべてのパラメーターの値がコマンドラインで指定される非対話的な方法で初期化できます。それぞれの方法で同じ結果が得られるため、どちらの方法を選択してもかまいません。
パラメーター値
- keystore URL (KEYSTORE_URL)
- キーストアファイルのファイルシステムパスまたは URI。この例では、
EAP_HOME/vault/を使用します。vault.keystore - キーストアパスワード (KEYSTORE_PASSWORD)
- キーストアのアクセスに使用されるパスワード。
- Salt (SALT)
Salt値は、キーストアの内容を暗号化するために、iteration count (反復カウント) とともに使用される 8 文字のランダムな文字列です。- keystore Alias (KEYSTORE_ALIAS)
- キーストア認識されているエイリアス。
- Iteration Count (ITERATION_COUNT)
- 暗号化アルゴリズムの実行回数。
- Directory to store encrypted files (ENC_FILE_DIR)
- 暗号化したファイルを保存するパス。これは通常、パスワード vault を含むディレクトリーです。暗号化されたすべての情報をキーストアと同じ場所に格納することは便利ですが、必須ではありません。このディレクトリーには、制限のあるユーザーのみがアクセスできるようにする必要があります。JBoss EAP を実行しているユーザーアカウントには少なくとも読み書き込みアクセスが必要です。「機密性が高い文字列を格納する Java キーストアの作成」 を実行した場合は、キーストアは
EAP_HOME/vault/というディレクトリーにあります。注記ディレクトリー名の後にはバックスラッシュまたはスラッシュが必要です。正しいファイルパス区切り文字が使用されていることを確認します。Red Hat Enterprise Linux および同様のオペレーティングシステムの場合は / (フォワードスラッシュ)、Microsoft Windows Server の場合は \ (バックスラッシュ) を使用します。 - Vault Block (VAULT_BLOCK)
- パスワード vault でこのブロックに与えられる名前。分かりやすい値を選択してください。
- Attribute (ATTRIBUTE)
- 保存される属性に与えられる名前。分かりやすい値を選択してください。たとえば、データソースに関する名前を選択できます。
- Security Attribute (SEC-ATTR)
- パスワード vault に保存されているパスワード。
手順18.9 パスワード vault コマンドを対話式に実行します。
パスワード vault コマンドをインタラクティブに起動します。
オペレーティングシステムのコマンドラインインターフェイスを起動し、EAP_HOME/bin/vault.sh(Red Hat Enterprise Linux および同様のオペレーティングシステム) またはEAP_HOME\bin\vault.bat(Microsoft Windows Server 上) を実行します。新しい対話セッションを開始するには、0(ゼロ) と入力します。要求パラメーターを入力します。
プロンプトに従って必要なパラメーターを入力します。マスクされたパスワード情報をメモします。
マスクされたパスワード、salt、iteration count (反復数) は、標準出力に出力されます。安全な場所にそれらを書き留めておきます。これらのエントリーは、パスワード Vault に追加する必要があります。キーストアファイルおよびこの値にアクセスすると、攻撃者はパスワード Vault の機密情報にアクセスできるようになります。対話式コンソールを終了します。
3と入力して、対話式コンソールを終了します。
例18.41 パスワード vault コマンドの対話式実行
手順18.10 パスワード Vault コマンドの自動実行
- オペレーティングシステムのコマンドラインインターフェイスを起動し、パスワード Vault コマンドを実行します。を参照してくださいパラメーター値リスト、プレースホルダーの値を好みの値に置き換えます。Red Hat Enterprise Linux または同様のオペレーティングシステムでは
EAP_HOME/bin/vault.sh、Microsoft Windows Server ではEAP_HOME\bin\vault.batを使用します。vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例18.42 パスワード Vault コマンドの自動実行
vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow コマンド出力Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
キーストアパスワードは、設定ファイルおよびデプロイメントで使用するためにマスクされています。さらに、vault は初期化され、使用できる状態になります。
18.6.6. パスワード vault を使用するよう JBoss EAP 6 を設定 リンクのコピーリンクがクリップボードにコピーされました!
概要
設定ファイルにあるパスワードや機密性の高いその他の属性をマスキングする前に、これらを保存し復号化するパスワード vault を JBoss EAP 6 が認識するようにする必要があります。
前提条件
手順18.11 パスワード Vault の有効化
- 「パスワード vault の初期化」 の管理 CLI コマンドを実行し、プレースホルダーの値をパスワード Vault コマンドの出力からの値に置き換えます。。注記Microsoft Windows Server を使用する場合は、通常 1 つを使用するファイルパスで 2 つの円記号 (
\\) を使用します。例:C:\\data\\vault\\vault.keystoreこれは、単一のバックスラッシュ (\) が文字エスケープに使用されるためです。/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例18.43 パスワード Vault の有効化
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "EAP_HOME/vault/vault.keystore"), ("KEYSTORE_PASSWORD" => "MASK-5dOaAVafCSd"), ("KEYSTORE_ALIAS" => "vault"), ("SALT" => "1234abcd"),("ITERATION_COUNT" => "120"), ("ENC_FILE_DIR" => "EAP_HOME/vault/")])
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "EAP_HOME/vault/vault.keystore"), ("KEYSTORE_PASSWORD" => "MASK-5dOaAVafCSd"), ("KEYSTORE_ALIAS" => "vault"), ("SALT" => "1234abcd"),("ITERATION_COUNT" => "120"), ("ENC_FILE_DIR" => "EAP_HOME/vault/")])
結果
JBoss EAP 6 が、パスワード Vault に保存されている、マスクされた文字列を復号化するように設定されました。パスワード Vault に文字列を追加して設定で使用するには、「パスワード Vault に Sensitive 文字列を保存します。」を参照してください。
18.6.7. パスワード Vault のカスタム実装を使用するよう JBoss EAP 6 を設定 リンクのコピーリンクがクリップボードにコピーされました!
概要
独自の SecurityVault 実装を使用して、設定ファイルのパスワードや機密性の高いその他の属性をマスクできます。
前提条件
手順18.12 パスワード vault のカスタム実装の使用
SecurityVaultインターフェイスを実装するクラスを作成します。- 直前の手順からクラスを含むモジュールを作成し、インターフェイスが
SecurityVaultのorg.picketboxで依存関係を指定します。 - 以下の属性を用いて vault 要素を追加して、JBoss EAP サーバー設定でカスタムのパスワード vault を有効にします。
- code
SecurityVaultを実装するクラスの完全修飾名。- module
- カスタムクラスが含まれるモジュールの名前。
オプションでvault-optionsパラメーターを使用して、パスワード Vault のカスタムクラスを初期化できます。例18.44
vault-optionsパラメーターを使用したカスタムクラスの初期化/core-service=vault:add(code="custom.vault.implementation.CustomSecurityVault", module="custom.vault.module", vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])/core-service=vault:add(code="custom.vault.implementation.CustomSecurityVault", module="custom.vault.module", vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
パスワード vault のカスタム実装を使用して、マスクされた文字列が復号化されるよう JBoss EAP 6 が設定されます。
18.6.8. パスワード Vault に Sensitive 文字列を保存します。 リンクのコピーリンクがクリップボードにコピーされました!
概要
プレーンテキストの設定ファイルにパスワードやその他の機密文字列を含めると、セキュリティーリスクが伴います。セキュリティー上の理由からも、これらの文字列はパスワード vault に保存します。パスワード vault では、これらの文字列は、マスク化した形式で設定ファイル、管理 CLI コマンド、およびアプリケーションで参照できます。
手順18.13 対話式での機密文字列の保存
PasswordVault コマンドを実行します
オペレーティングシステムのコマンドラインインターフェイスを起動し、パスワード Vault コマンドを実行します。Red Hat Enterprise Linux または同様のオペレーティングシステムではEAP_HOME/bin/vault.sh、Microsoft Windows Server ではEAP_HOME\bin\vault.batを使用します。新しい対話セッションを開始するには、0(ゼロ) と入力します。PasswordVault に関するプロンプトパラメーターを入力します
プロンプトに従って必要な認証パラメーターを入力します。これらの値は、パスワード vault の作成時に提供された値と一致している必要があります。注記キーストアパスワードは、マスク形式ではなく、プレーンテキスト形式で指定する必要があります。機密文字列に関するパラメーター入力を行います。
機密文字列の保存を開始する場合は0(ゼロ) を入力します。プロンプトに従って必要なパラメーターを入力します。マスクされた文字列についての情報を書き留めておきます。
メッセージは標準出力に出力され、vault ブロック、属性名、マスクされた文字列、設定の文字列の使用に関するアドバイスが表示します。この情報は、安全な場所にメモしておいてください。出力例を以下に示します。Vault Block:ds_Example1 Attribute Name:password Configuration should be done as follows: VAULT::ds_Example1::password::1
Vault Block:ds_Example1 Attribute Name:password Configuration should be done as follows: VAULT::ds_Example1::password::1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 対話式コンソールを終了します。
3と入力して、対話式コンソールを終了します。
例18.45 対話式での機密文字列の保存
手順18.14 機密性の高い文字列の非対話式保存
- オペレーティングシステムのコマンドラインインターフェイスを起動し、パスワード Vault コマンドを実行します。Red Hat Enterprise Linux または同様のオペレーティングシステムでは
EAP_HOME/bin/vault.sh、Microsoft Windows Server ではEAP_HOME\bin\vault.batを使用します。プレースホルダーの値を独自の値に置き換えます。パラメーターKEYSTORE_URL、KEYSTORE_PASSWORD、およびKEYSTORE_ALIASの値は、パスワード vault の作成時に提供された値と一致している必要があります。注記キーストアパスワードは、マスク形式ではなく、プレーンテキスト形式で指定する必要があります。EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow マスクされた文字列についての情報を書き留めておきます。
メッセージは標準出力に出力され、vault ブロック、属性名、マスクされた文字列、設定の文字列の使用に関するアドバイスが表示します。この情報は、安全な場所にメモしておいてください。出力例を以下に示します。Vault Block:vb Attribute Name:password Configuration should be done as follows: VAULT::vb::password::1
Vault Block:vb Attribute Name:password Configuration should be done as follows: VAULT::vb::password::1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例18.46 パスワード Vault コマンドの自動実行
EAP_HOME/bin/vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
EAP_HOME/bin/vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
結果
これで機密文字列が PasswordVault に保存され、設定ファイル、管理 CLI コマンド、およびアプリケーションでマスクされた形式で使用できるようになりました。
18.6.9. 暗号化した機密文字列を設定で使用 リンクのコピーリンクがクリップボードにコピーされました!
/host=HOST_NAME を追加します。
/core-service=SUBSYSTEM:read-resource-description(recursive=true)
/core-service=SUBSYSTEM:read-resource-description(recursive=true)
例18.47 管理サブシステム内のすべてのリソースの説明を一覧表示します
/core-service=management:read-resource-description(recursive=true)
/core-service=management:read-resource-description(recursive=true)
expressions-allowed パラメーターの値を探します。これが 当てはまる 場合は、このサブシステムの設定内で式を使用できます。
${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}
${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}
例18.48 マスクされたフォームでのパスワードを使用したデータソース定義
ds_ExampleDS であり、属性は パスワードです。
18.6.10. アプリケーションで暗号化した機密文字列の使用 リンクのコピーリンクがクリップボードにコピーされました!
例18.49 vault されたパスワードを使用するサーブレット
18.6.11. 機密文字列がパスワード vault 内にあるかどうかを確認します。 リンクのコピーリンクがクリップボードにコピーされました!
概要
パスワード vault に機密文字列を保存または使用する前に、その文字列がすでに保存されているかどうかを確認すると便利です。
手順18.15 対話式での機密文字列の確認
PasswordVault コマンドを実行します
オペレーティングシステムのコマンドラインインターフェイスを起動し、パスワード Vault コマンドを実行します。Red Hat Enterprise Linux または同様のオペレーティングシステムではEAP_HOME/bin/vault.sh、Microsoft Windows Server ではEAP_HOME\bin\vault.batを使用します。新しい対話セッションを開始するには、0(ゼロ) と入力します。PasswordVault に関するプロンプトパラメーターを入力します
プロンプトに従って必要な認証パラメーターを入力します。これらの値は、パスワード vault の作成時に提供された値と一致している必要があります。注記キーストアパスワードは、マスク形式ではなく、プレーンテキスト形式で指定する必要があります。1を入力してセキュリティー保護された属性が存在するかどうかを確認します。- 機密文字列を保存する vault ブロックの名前を入力します。
- チェックする機密文字列の名前を入力します。
結果
機密文字列が指定された vault ブロックに保存されている場合は、以下のような確認メッセージが表示されます。
A value exists for (VAULT_BLOCK, ATTRIBUTE)
A value exists for (VAULT_BLOCK, ATTRIBUTE)
No value has been store for (VAULT_BLOCK, ATTRIBUTE)
No value has been store for (VAULT_BLOCK, ATTRIBUTE)
例18.50 対話式での機密文字列の確認
手順18.16 機密性の高い文字列の非対話式チェック
- オペレーティングシステムのコマンドラインインターフェイスを起動し、パスワード Vault コマンドを実行します。Red Hat Enterprise Linux または同様のオペレーティングシステムでは
EAP_HOME/bin/vault.sh、Microsoft Windows Server ではEAP_HOME\bin\vault.batを使用します。プレースホルダーの値を独自の値に置き換えます。パラメーターKEYSTORE_URL、KEYSTORE_PASSWORD-password、およびKEYSTORE_ALIASの値は、パスワード vault の作成時に提供された値と一致している必要があります。注記キーストアパスワードは、マスク形式ではなく、プレーンテキスト形式で指定する必要があります。EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --check-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --check-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
機密文字列が指定された vault ブロックに保存されると、以下のメッセージが出力されます。
Password already exists.
Password already exists.
Password doesn't exist.
Password doesn't exist.
18.6.12. パスワード vault からの機密文字列の削除 リンクのコピーリンクがクリップボードにコピーされました!
概要
セキュリティー上の理由から、機密文字列が不要になった場合は、パスワード vault から削除することが推奨されます。たとえば、アプリケーションの使用を停止する場合、データソース定義で使用される機密文字列を同時に削除する必要があります。
前提条件
パスワード vault から機密文字列を削除するには、JBoss EAP の設定で使用されるかどうかを確認します。これを行う 1 つの方法は、grep ユーティリティーを使用して、マスクされた文字列のインスタンスの設定ファイルを検索することです。Red Hat Enterprise Linux (および同様のオペレーティングシステム) では、grep はデフォルトでインストールされますが、Microsoft Windows の場合は手動でインストールする必要があります。
手順18.17 対話式での機密文字列の削除
PasswordVault コマンドを実行します
オペレーティングシステムのコマンドラインインターフェイスを起動し、EAP_HOME/bin/vault.sh(Red Hat Enterprise Linux および同様のオペレーティングシステム) またはEAP_HOME\bin\vault.bat(Microsoft Windows Server 上) を実行します。新しい対話セッションを開始するには、0(ゼロ) と入力します。認証の詳細を提供する
プロンプトに従って必要な認証パラメーターを入力します。これらの値は、パスワード vault の作成時に提供された値と一致している必要があります。注記キーストアパスワードは、マスク形式ではなく、プレーンテキスト形式で指定する必要があります。2と入力して、セキュアな属性を削除するオプションを選択します。- 機密文字列を保存する vault ブロックの名前を入力します。
- 削除する機密文字列の名前を入力します。
結果
機密文字列が正常に削除されると、以下のような確認メッセージが出力されます。
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
例18.51 対話式での機密文字列の削除
手順18.18 機密性の高い文字列の非対話式削除
- オペレーティングシステムのコマンドラインインターフェイスを起動し、パスワード Vault コマンドを実行します。Red Hat Enterprise Linux または同様のオペレーティングシステムでは
EAP_HOME/bin/vault.sh、Microsoft Windows Server ではEAP_HOME\bin\vault.batを使用します。プレースホルダーの値を独自の値に置き換えます。パラメーターKEYSTORE_URL、KEYSTORE_PASSWORD、およびKEYSTORE_ALIASの値は、パスワード vault の作成時に提供された値と一致している必要があります。注記キーストアパスワードは、マスク形式ではなく、プレーンテキスト形式で指定する必要があります。EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --remove-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --remove-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
機密文字列が正常に削除されると、以下のような確認メッセージが出力されます。
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
例18.52 機密性の高い文字列の非対話式削除
18.7. Java Authorization Contract for Containers (JACC) リンクのコピーリンクがクリップボードにコピーされました!
18.7.1. JACC (Java Authorization Contract for Containers) リンクのコピーリンクがクリップボードにコピーされました!
18.7.2. JACC (Java Authorization Contract for Containers) のセキュリティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml を編集する必要があります。
セキュリティードメインへの JACC サポートの追加
セキュリティードメインに JACC サポートを追加するには、required フラグセットで JACC 承認ポリシーをセキュリティードメインの承認スタックへ追加します。以下は JACC サポートを持つセキュリティードメインの例です。ただし、セキュリティードメインは、XML で直接設定するのではなく、管理コンソールまたは管理 CLI で設定します。
JACC を使用するよう Web アプリケーションを設定
jboss-web.xml ファイルは デプロイメントの WEB-INF/ ディレクトリーに存在し、Web コンテナーに対する追加の JBoss 固有の設定を格納し、上書きします。JACC が有効になっているセキュリティードメインを使用するには、<security-domain> 要素が含まれるようにし、さらに <use-jboss-authorization> 要素を true に設定する必要があります。次のアプリケーションは、上記の JACC セキュリティードメインを使用するように適切に設定されています。
<jboss-web>
<security-domain>jacc</security-domain>
<use-jboss-authorization>true</use-jboss-authorization>
</jboss-web>
<jboss-web>
<security-domain>jacc</security-domain>
<use-jboss-authorization>true</use-jboss-authorization>
</jboss-web>
JACC を使用するよう EJB アプリケーションを設定
セキュリティードメインと JACC を使用するよう EJB を設定する方法は Web アプリケーションの場合とは異なります。EJB の場合、ejb-jar.xml 記述子にてメソッドまたはメソッドのグループ上で メソッドパーミッション を宣言できます。<ejb-jar> 要素内では、すべての子 <method-permission> 要素に JACC ロールに関する情報が含まれます。詳細は、設定例を参照してください。EJBMethodPermission クラスは Java Enterprise Edition 6 API の一部であり、で http://docs.oracle.com/javaee/6/api/javax/security/jacc/EJBMethodPermission.html 説明されています。
例18.53 EJB の JACC メソッドパーミッション例
<security> 子要素の jboss-ejb3.xml 記述子に宣言されます。セキュリティードメインの他に、EJB が実行されるプリンシパルを変更する <run-as-principal> を指定することもできます。
例18.54 EJB におけるセキュリティードメイン宣言の例
18.8. JASPI (Java Authentication SPI for Containers) リンクのコピーリンクがクリップボードにコピーされました!
18.8.1. JASPI (Java Authentication SPI for Containers) のセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
18.8.2. JASPI (Java Authentication SPI for Containers) のセキュリティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
<authentication-jaspi> 要素を追加します。設定は標準的な認証モジュールと似ていますが、ログインモジュール要素は <login-module-stack> 要素で囲まれています。設定の構成は次のとおりです。
例18.55 authentication-jaspi 要素の構造
domain.xml または EAP_HOME/standalone/configuration/standalone.xml に直接追加する前に、JBoss EAP 6 を完全に停止する必要があります。。
第19章 シングルサインオン (SSO) リンクのコピーリンクがクリップボードにコピーされました!
19.1. Web アプリケーションのシングルサインオン (SSO) について リンクのコピーリンクがクリップボードにコピーされました!
概要
シングルサインオン (SSO) を使用すると、1 つのリソースへの認証により、他のリソースへのアクセスを暗黙的に許可できます。
クラスター化および非クラスター化 SSO
非クラスターか SSO は、同じ仮想ホストでアプリケーションへの承認情報の共有を制限します。また、ホストに障害が発生した場合の回復性はありません。クラスター化された SSO データは、複数のホスト内のアプリケーション間で共有でき、フェイルオーバーに対して回復力があります。さらに、クラスター化された SSO はロードバランサーからリクエストを受信できます。
SSO のしくみ
リソースが保護されていない場合、ユーザーは認証をまったく要求されません。ユーザーが保護されたリソースにアクセスする場合、ユーザーは認証する必要があります。
19.2. Web アプリケーションのクラスター化されたシングルサインオン (SSO) について リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml デプロイメント記述子で定義できます。
19.3. 適切な SSO 実装を選択する リンクのコピーリンクがクリップボードにコピーされました!
web.xml デプロイメント記述子の <distributable/> タグを使用して、クラスターノード全体に分散できるものとしてマークされます。クラスター化された SSO は、アプリケーション自体がクラスター化されているかどうかに関わらず、セキュリティーコンテキストとアイデンティティー情報のレプリケーションを可能にします。これらのテクノロジーは一緒に使用できますが、別々の概念です。
Kerberos ベースのデスクトップ SSO
組織で既に MicrosoftActiveDirectory などの Kerberos ベースの認証および承認システムを使用している場合は、同じシステムを使用して、Active Directory で実行されているエンタープライズアプリケーションに対して透過的に認証できます。
非クラスター化 Web アプリケーション SSO
1 つのインスタンスで複数のアプリケーションを実行していて、それらのアプリケーションに対して SSO セッションレプリケーションを有効にする必要がある場合、非クラスター化 SSO が要件を満たします。
クラスター化された Web アプリケーション SSO
クラスター全体で単一のアプリケーションまたは複数のアプリケーションを実行していて、それらのアプリケーションの SSO セッションレプリケーションを有効にする必要がある場合、クラスター化された SSO は要件を満たします。
19.4. Web アプリケーションでシングルサインオン (SSO) を使用する リンクのコピーリンクがクリップボードにコピーされました!
概要
シングルサインオン (SSO) 機能は、Web および Infinispan サブシステムによって提供されます。この手順を使用して、Web アプリケーションで SSO を設定します。
前提条件
- 認証とアクセスを処理する設定済みのセキュリティードメイン。
- The
infinispanサブシステム。デフォルトでは、管理対象ドメインとスタンドアロンサーバーのすべてのプロファイルに存在します。 - The
webcache-containerおよび SSO レプリケートキャッシュ。初期設定ファイルにはすでにwebcache-container、および一部の設定には、SSO レプリケートされたキャッシュもすでに含まれています。次のコマンドを使用して、SSO レプリケートキャッシュを確認して有効にします。これらのコマンドはha管理対象ドメインのプロファイル。スタンドアロンサーバーの場合は、コマンドを変更して別のプロファイルを使用するか、コマンドの/profile=ha部分を削除できます。例19.1 を確認してください
webキャッシュコンテナー上記のプロファイルと設定には、webデフォルトでは cache-container。次のコマンドを使用して、その存在を確認します。別のプロファイルを使用する場合は、haの代わりにその名前に置き換えてください。/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=false,proxies=false,include-runtime=false,include-defaults=true)
/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=false,proxies=false,include-runtime=false,include-defaults=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 結果が成功した場合、サブシステムが存在します。それ以外の場合は、追加する必要があります。例19.2 追加します
webキャッシュコンテナー次の 3 つのコマンドを使用して、webcache-container を設定に追加します。プロファイルの名前、およびその他のパラメーターを必要に応じて変更します。ここでのパラメーターは、デフォルト設定で使用されるパラメーターです。/profile=ha/subsystem=infinispan/cache-container=web:add(aliases=["standard-session-cache"],default-cache="repl",module="org.jboss.as.clustering.web.infinispan")
/profile=ha/subsystem=infinispan/cache-container=web:add(aliases=["standard-session-cache"],default-cache="repl",module="org.jboss.as.clustering.web.infinispan")Copy to Clipboard Copied! Toggle word wrap Toggle overflow /profile=ha/subsystem=infinispan/cache-container=web/transport=TRANSPORT:add(lock-timeout=60000)
/profile=ha/subsystem=infinispan/cache-container=web/transport=TRANSPORT:add(lock-timeout=60000)Copy to Clipboard Copied! Toggle word wrap Toggle overflow /profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode="ASYNC",batching=true)
/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode="ASYNC",batching=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例19.3 を確認してください
SSOレプリケートされたキャッシュ次の管理 CLI コマンドを実行します。/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のような出力を探します。"sso" => {見つからない場合は、SSO レプリケートキャッシュが設定に存在しません。例19.4 追加します
SSOレプリケートされたキャッシュ/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=sso:add(mode="SYNC", batching=true)
/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=sso:add(mode="SYNC", batching=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
管理対象ドメインのクラスター化された SSO を設定する
web サブシステムは SSO を使用するように設定する必要があります。次のコマンドは、default-host と呼ばれる仮想サーバーと cookie ドメイン domain.com で SSO を有効にします。キャッシュ名は sso であり、再認証は無効になっています。
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")
jboss-web.xml デプロイメント記述子で同じ <security-domain> を使用し、web.xml 設定ファイルで同じレルムを使用するように設定する必要があります。
スタンドアロンサーバーのクラスター化または非クラスター化 SSO の設定
設定、設定ssoサーバープロファイルの Web サブシステムの下。TheClusteredSingleSignOnバージョンは属性のときに使用されますcache-container存在する、そうでない場合は標準SingleSignOnクラスが使用されます。
例19.5 非クラスター化 SSO 設定の例
/subsystem=web/virtual-server=default-host/sso=configuration:add(reauthenticate="false")
/subsystem=web/virtual-server=default-host/sso=configuration:add(reauthenticate="false")
セッションを無効にする
アプリケーションは、メソッドを呼び出すことにより、プログラムでセッションを無効にすることができますjavax.servlet.http.HttpSession.invalidate()。
19.5. Kerberos について リンクのコピーリンクがクリップボードにコピーされました!
19.6. SPNEGO について リンクのコピーリンクがクリップボードにコピーされました!
19.7. Microsoft Active Directory について リンクのコピーリンクがクリップボードにコピーされました!
- ユーザー、コンピューター、パスワード、およびその他のリソースに関する情報を格納する軽量 Directory Access Protocol (LDAP)。
- Kerberos: ネットワーク上でセキュアな認証を提供します。
- ドメインネームサービス (DNS): ネットワーク上のコンピューターおよびその他のデバイスにおける IP アドレスとホスト名との間のマッピングを提供します。
19.8. Web アプリケーション用に Kerberos または MicrosoftActiveDirectory デスクトップ Active Directory を設定する リンクのコピーリンクがクリップボードにコピーされました!
はじめに
Microsoft Active Directory などの組織の既存の Kerberos ベースの認証および承認インフラストラクチャーを使用して Web または EJB アプリケーションを認証するには、JBoss EAP 6 に組み込まれている JBoss ネゴシエーション機能を使用できます。Web アプリケーションを適切に設定した場合、デスクトップまたはネットワークへのログインが成功すれば、Web アプリケーションに対して透過的に認証できるため、追加のログインプロンプトは必要ありません。
プラットフォームの以前のバージョンとの違い
JBoss EAP 6 と、これまでのバージョンには顕著な違いがいくつかあります。
- セキュリティードメインは、管理対象ドメインの各プロファイル、またはスタンドアロンサーバーごとに設定されます。これらはデプロイメント自体には含まれません。デプロイメントが使用するセキュリティードメインは、デプロイメントの
jboss-web.xmlファイルまたはjboss-ejb3.xmlファイルで指定されます。 - セキュリティープロパティーはセキュリティードメインの一部として設定されます。これらはデプロイメントには含まれません。
- デプロイメントの一部としてオーセンティケーターをオーバーライドすることはできなくなりました。ただし、
jboss-web.xml記述子に NegotiationAuthenticator バルブを追加して、同じ効果を実現することができます。バルブを使用するには、<security-constraint>および<login-config>要素をweb.xmlに定義する必要があります。これらの要素は、セキュアなリソースを決定するのに使用されます。しかし、選択した auth-method はjboss-web.xmlの NegotiationAuthenticator バルブによって上書きされます。 - セキュリティードメインの
CODE属性は、完全修飾クラス名ではなく、単純な名前を使用するようになりました。以下の表は、JBoss Negotiation に使用されるクラスとそれらのクラスとの間のマッピングを示しています。
| 簡単な名前 | クラス名 | 目的 |
|---|---|---|
| Kerberos |
com.sun.security.auth.module.Krb5LoginModule
com.ibm.security.auth.module.Krb5LoginModule
|
Oracle JDK を使用する場合の Kerberos ログインモジュール
IBMJava 開発キットを使用する場合の Kerberos ログインモジュール
|
| SPNEGO | org.jboss.security.negotiation.spnego.SPNEGOLoginModule | Web アプリケーションが Kerberos 認証サーバーに対して認証できるようにするメカニズム。 |
| AdvancedLdap | org.jboss.security.negotiation.AdvancedLdapLoginModule | Microsoft Active Directory 以外の LDAP サーバーで使用されます。 |
| AdvancedAdLdap | org.jboss.security.negotiation.AdvancedADLoginModule | Microsoft Active Directory LDAP サーバーで使用されます。 |
JBoss Negotiation Toolkit
JBoss Negotiation Toolkit は、から https://community.jboss.org/servlet/JiveServlet/download/16876-2-34629/jboss-negotiation-toolkit.war ダウンロードできるデバッグツールです。これは、アプリケーションを実稼働環境にデプロイする前に認証メカニズムのデバッグおよびテストに役立つ追加ツールとして提供されます。これはサポート対象のツールではありませんが、SPENEGO を web アプリケーションに対して設定するのは難しいこともあるため、大変便利なツールと言えます。
手順19.1 Web または EJB アプリケーションの SSO 認証を設定する
サーバーの ID を表す 1 つのセキュリティードメインを設定します。必要に応じてシステムプロパティーを設定します。
最初のセキュリティードメインは、コンテナー自体をディレクトリーサービスに対して認証します。実際のユーザーは関与しないため、ある種の静的ログインメカニズムを受け入れるログインモジュールを使用する必要があります。この例では静的プリンシパルを使用し、クレデンシャルが含まれるキータブファイルを参照します。XML コードはわかりやすくするためにここに示されていますが、セキュリティードメインを設定するには管理コンソールまたは管理 CLI を使用する必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 1 つまたは複数の Web アプリケーションを保護するために、2 番目のセキュリティードメインを設定します。必要に応じてシステムプロパティーを設定します。
2 番目のセキュリティードメインは、Kerberos または SPNEGO 認証サーバーに対して個々のユーザーを認証するために使用されます。ユーザーを認証するために少なくとも 1 つのログインモジュールが必要であり、ユーザーに適用するロールを検索するために別のログインモジュールが必要です。次の XML コードは、SPNEGO セキュリティードメインの例を示しています。これには、ロールを個々のユーザーにマップするための承認モジュールが含まれています。認証サーバー自体でロールを検索するモジュールを使用することもできます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow web.xmlで security-constraint と login-config を指定しますweb.xml記述子には、セキュリティーの制約とログイン設定に関する情報が含まれています。以下は、それぞれの値の例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-web.xml記述子でセキュリティードメインおよびその他の設定を指定します。デプロイメントのjboss-web.xml記述子でクライアント側のセキュリティードメイン (この例では 2 番目) の名前を指定して、このセキュリティードメインを使用するようにアプリケーションに指示します。オーセンティケーターを直接オーバーライドすることはできなくなりました。代わりに、必要に応じて、NegotiationAuthenticator をバルブとしてjboss-web.xml記述子に追加できます。<jacc-star-role-allow>を使用すると、アスタリスク (*) 文字を使用して複数のロール名と一致させることができます。これはオプションです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションの
MANIFEST.MFに依存関係を追加して、ネゴシエーションクラスを見つけます。Web アプリケーションにはクラスへの依存が必要ですorg.jboss.security.negotiationJBoss Negotiation クラスを見つけるために、デプロイメントのMETA-INF/MANIFEST.MFマニフェストに追加されます。以下に、適切にフォーマットされたエントリーを示します。Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiation
Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiationCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 別の方法として、
META-INF/jboss-deployment-structure.xmlファイルを編集して、アプリケーションに依存関係を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
結果
Web アプリケーションは、Kerberos、Microsoft Active Directory、またはその他の SPNEGO 互換のディレクトリーサービスに対してクレデンシャルを受け入れて認証します。ユーザーがすでにディレクトリーサービスにログインしているシステムからアプリケーションを実行し、必要なロールがすでにユーザーに適用されている場合、Web アプリケーションは認証のプロンプトを表示せず、SSO 機能が実現されます。
19.9. SPNEGO フォールバックをフォーム認証に設定する リンクのコピーリンクがクリップボードにコピーされました!
手順19.2 フォーム認証へのフォールバックを備えた SPNEGO セキュリティー
SPNEGO を設定する
「Web アプリケーション用に Kerberos または MicrosoftActiveDirectory デスクトップ Active Directory を設定する」 に記載されている手順を参照してください。web.xmlの変更login-config要素をアプリケーションに追加し、web.xml でログインページとエラーページを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Web コンテンツを追加する
login.htmlおよびerror.htmlの参照をweb.xmlに追加します。これらのファイルは、form-login-config設定で指定された場所の Web アプリケーションアーカイブに追加されます。詳細は、JBoss EAP6 の 『セキュリティーガイド』 の 『フォームベースの認証』 を有効にするセクションを参照してください。典型的なlogin.htmlは次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
19.10. SAMLWeb ブラウザーベースの SSO について リンクのコピーリンクがクリップボードにコピーされました!
19.11. クッキーのドメイン。 リンクのコピーリンクがクリップボードにコピーされました!
19.11.1. クッキードメインについて リンクのコピーリンクがクリップボードにコピーされました!
/ です。これは、発行元のホストのみが Cookie の内容を読み取ることができることを意味します。特定の Cookie ドメインを設定すると、Cookie のコンテンツをより広範囲のホストで利用できるようになります。Cookie ドメインを設定するには、を参照してください。「シングルサインオン用に Cookie ドメインを設定する」。
19.11.2. シングルサインオン用に Cookie ドメインを設定する リンクのコピーリンクがクリップボードにコピーされました!
http://app1.xyz.com と http://app2.xyz.comの アプリケーションが、クラスター内の異なるサーバーまたはそれらが使用する仮想ホストで実行されている場合でも、SSO コンテキストを共有できます。関連付けられている複数のエイリアスがあります。
クラスター化された SSO(クラスター化された JBoss EAP インスタンスに対して共有)
CLI の使用 (スタンドアロンモード):
/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso")
/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso")
Standlone.xml または domain.xml を編集し、関連する Web サブシステムに以下を追加します。
非クラスター化 SSO(SSO は Jboss EAP インスタンス内のインスタンスに対してのみ共有されます)
CLI の使用 (スタンドアロンモード):
/subsystem=web/virtual-server=default-host/sso=configuration:add()
/subsystem=web/virtual-server=default-host/sso=configuration:add()
Standlone.xml または domain.xml を編集し、関連する Web サブシステムに以下を追加します。
/subsystem=web/virtual-server=default-host/sso=configuration:add(domain="example.com",...)
/subsystem=web/virtual-server=default-host/sso=configuration:add(domain="example.com",...)
<sso domain="example.com"/>
<sso domain="example.com"/>
第20章 開発セキュリティーリファレンス リンクのコピーリンクがクリップボードにコピーされました!
20.1. EJB セキュリティーパラメーターリファレンス リンクのコピーリンクがクリップボードにコピーされました!
| 要素 | Description |
|---|---|
<security-identity>
|
EJB のセキュリティー ID に関連する子要素が含まれています。
|
<use-caller-identity />
|
EJB が呼び出し元と同じセキュリティー ID を使用することを示します。
|
<run-as>
| <role-name> 要素が含まれています。
|
<run-as-principal>
|
存在する場合、発信コールに割り当てられたプリンシパルを示します。存在しない場合、発信コールは
anonymous という名前のプリンシパルに割り当てられます。
|
<role-name>
|
EJB を実行するロールを指定します。
|
<description>
| <role-name> で指定されたロールについて説明します
|
例20.1 セキュリティー ID の例
jboss-ejb3.xml ファイルに含めることもできます。jboss-ejb3.xml ファイルについては、「jboss-ejb3.xml デプロイメント記述子の参照」。
第21章 設定リファレンス リンクのコピーリンクがクリップボードにコピーされました!
21.1. jboss-web.xml 設定リファレンス リンクのコピーリンクがクリップボードにコピーされました!
はじめに
jboss-web.xml および web.xml デプロイメント記述子は両方ともデプロイメントの WEB-INF ディレクトリーに配置されます。jboss-web.xml は、JBoss EAP の Web アプリケーションデプロイメント記述子であり、JBossWeb の追加機能のための追加の設定オプションが含まれています。この記述子を使用して、web.xml 記述子の設定をオーバーライドし、JBoss EAP 固有の設定を設定できます。
グローバルリソースの WAR 要件へのマッピング
使用可能な設定の多くは、アプリケーションの web.xml で設定された要件をローカルリソースにマップします。web.xml 設定の説明は、を参照してください http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html。
web.xml で jdbc/MyDataSource が必要な場合、jboss-web.xml はこのニーズを満たすためにグローバルデータソース java:/DefaultDS をマップする場合があります。WAR は、グローバルデータソースを使用して、jdbc/MyDataSource の必要性を満たします。
| 属性 | Description |
|---|---|
| servlet |
サーブレット要素は、サーブレット固有のバインディングを指定します。
|
| max-active-sessions |
許可されるアクティブなセッションの最大数を決定します。セッションマネージャーによって管理されるセッションの数がこの値を超え、
パッシベーション が有効になっている場合、設定された passivation-min-idle-time に 基づいて超過分がパッシベーションされます。
-1 に設定すると、制限がないことを意味します。
|
| replication-config | Replication-config 要素は、jboss-web.xml ファイルでセッションレプリケーションを設定するために使用されます。
|
| passivation-config | passivation-config 要素は、jboss-web.xml ファイルでセッションパッシベーションを設定するために使用されます。
|
| distinct-name | 個別の名前 要素は、Web アプリケーションの EJB3 の個別の名前を指定します。
|
| data-source | web.xml に必要な データソース へのマッピング。
|
| context-root | アプリケーションのルートコンテキスト。デフォルト値は、.war 接尾辞のないデプロイメントの名前です。 |
| virtual-host | アプリケーションが要求を受け入れる HTTP 仮想ホストの名前。HTTP ホスト ヘッダーの内容を参照します。 |
| アノテーション | アプリケーションで使用される注釈について説明します。詳細は、<annotation> を参照してください。 |
| listener | アプリケーションで使用されるリスナーについて説明します。詳細は、<listener> を参照してください。 |
| session-config | この要素は、web.xml の <session-config> 要素と同じ機能を果たし、互換性のためにのみ含まれています。 |
| バルブ | アプリケーションで使用されるバルブについて説明します。詳細は、<valve> を参照してください。 |
| overlay | アプリケーションに追加するオーバーレイの名前。 |
| security-domain | アプリケーションが使用するセキュリティードメインの名前。セキュリティードメイン自体は、Web ベースの管理コンソールまたは管理 CLI で設定されます。 |
| security-role | この要素は、web.xml の <security-role> 要素と同じ機能を果たし、互換性のためにのみ含まれています。 |
| jacc-star-role-allow | jacc-star-role-allow 要素は、jacc プロバイダーが許可をバイパスするかどうかを決定できるように、Web レイヤーの jacc 許可生成エージェントが WebResourcePermission 許可を生成する必要があるかどうかを指定します。
|
| use-jboss-authorization | この要素が存在し、大文字と小文字を区別しない値 true が含まれている場合、JBossWeb 認証スタックが使用されます。存在しないか、true ではない値が含まれている場合は、JavaEnterpriseEdition 仕様で指定されている許可メカニズムのみが使用されます。この要素は JBoss EAP 6 の新機能です。 |
| disable-audit | このブール要素を false に設定すると有効になり、true に設定すると Web 監査が無効になります。Web セキュリティー監査は JavaEE 仕様の一部ではありません。この要素は JBoss EAP 6 の新機能です。 |
| disable-cross-context | false の場合、アプリケーションは別のアプリケーションコンテキストを呼び出すことができます。デフォルトは true です。 |
| enable-websockets | jboss-web.xml でこの要素を true に設定して、Web アプリケーションで WebSocket アクセスを有効にするかどうかを指定します。 |
<annotation> の子要素を示します。
| 属性 | 説明 |
|---|---|
| class-name |
注釈のクラスの名前
|
| servlet-security |
サーブレットのセキュリティーを表す
@ServletSecurity などの要素。
|
| run-as |
実行情報を表す
@RunAs などの要素。
|
| multipart-config |
multipart-config 情報を表す
@MultiPart などの要素。
|
<listener> の子要素を示します。
| 属性 | 説明 |
|---|---|
| class-name |
リスナーのクラスの名前
|
| listener-type |
アプリケーションのコンテキストに追加するリスナーの種類を示す
条件 要素のリスト。有効な選択肢は次のとおりです。
|
| module |
リスナークラスを含むモジュールの名前。
|
| param |
パラメーター。
<param-name> と <param-value> の 2 つの子要素が含まれます。
|
第22章 補足リファレンス リンクのコピーリンクがクリップボードにコピーされました!
22.1. Java アーカイブの種類 リンクのコピーリンクがクリップボードにコピーされました!
| アーカイブタイプ | 範囲 | 目的 | ディレクトリー構造の要件 |
|---|---|---|---|
| Java アーカイブ | .jar | Java クラスライブラリーが含まれています。 | META-INF/Manifest.mf ファイル (オプション)。どのクラスが メイン クラスであるかなどの情報を指定します。
|
| Web アーカイブ | .war |
Java クラスとライブラリーに加えて、Java Server Pages (JSP) ファイル、サーブレット、および XML ファイルが含まれています。Web アーカイブのコンテンツは、Web アプリケーションとも呼ばれます。
| WEB-INF/web.xml ファイル。これには、Web アプリケーションの構造に関する情報が含まれています。他のファイルも WEB-INF/ に存在する可能性があります。
|
| リソースアダプターアーカイブ。 | .rar |
ディレクトリー構造は、JCA 仕様で指定されています。
|
Java コネクターアーキテクチャー (JCA) リソースアダプターが含まれています。コネクターとも呼ばれます。
|
| エンタープライズアーカイブ | .ear |
Java Enterprise Edition (EE) によって使用され、1 つ以上のモジュールを単一のアーカイブにパッケージ化して、モジュールをアプリケーションサーバーに同時にデプロイできるようにします。Maven と Ant は、EAR アーカイブの構築に使用される最も一般的なツールです。
| META-INF/ ディレクトリー。1 つ以上の XML デプロイメント記述子ファイルが含まれています。
|
|
次のタイプのモジュールのいずれか。
| |||
| サービスアーカイブ | .sar |
エンタープライズアーカイブに似ていますが、JBoss EAP に固有です。
| jboss-service.xml または jboss-beans.xml ファイルを含む META-INF/ ディレクトリー。
|
付録A 改訂履歴 リンクのコピーリンクがクリップボードにコピーされました!
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 6.4.0-48 | Thursday November 16 2017 | ||
| |||