10.2. 展開ライフサイクルロジックからの構造認識の分離

展開上で実際の作業を実行するには、最初に、クラスパスとメタデータの場所を含む構造を理解する必要があります。
メタデータの場所には、my-jboss-beans.xmlweb.xmlejb-jar.xml などの設定ファイルが含まれます。クラスパスは WEB-INF/classesmyapp.ear/lib などのクラスローダーのルートです。
構造を考慮して、実際の展開処理に進むことができます。

一般的な展開ライフサイクル

  1. MainDeployer は認識のために展開を StructuralDeployer のセットに渡し、Deployment コンテキストを受け取ります。
  2. 次に、MainDeployer は、適切な Deployer により処理するために結果となる Deployment コンテキストを Deployers に渡します。
MainDeployer は使用するデプロイヤを決定する責任を持つブローカーです。
仮想展開またはプログラムを使用した展開の場合、事前に決定された既存の StructureMetaData 情報は構造情報を読み取り、StructuredMetaData 情報の処理 で説明されたいずれかの方法で処理します。

StructuredMetaData 情報の処理

VFS ベースの展開
構造認識は StructureDeployers のセットに転送されます。
JEE-specification-defined 構造
一致する StructureDeployer 実装は以下のとおりです。
  • EarStructure
  • WarStructure
  • JarStructure
DeclarativeStructures
展開内部の META-INF/jboss-structure.xml ファイルを検索し、解析して適切な StructureMetaData を構築します。
FileStructures
-jboss-beans.xml-service.xml などの既知の設定ファイルのみを認識します。

例10.1 jboss-structure.xml の例

<structure>
  <context comparator="org.jboss.test.deployment.test.SomeDeploymentComparatorTop">
    <path name=""/>
    <metaDataPath>
      <path name="META-INF"/>
    </metaDataPath>
    <classpath>
      <path name="lib" suffixes=".jar"/>
    </classpath>
  </context>
</structure>
EarStructure の場合、最初に最上位の展開を認識し、次にサブ展開を再帰的に処理します。
汎用的な StructureDeployer インターフェースにより提供された汎用的な GroupingStructure クラスを使用してカスタム StructureDeployer を実装できます。
認識された展開構造を用意したら、それを実際のデプロイヤに渡すことができます。デプロイヤオブジェクトは、DeploymentStage ごとにデプロイヤチェーンを使用して実際のデプロイヤを処理する方法を認識します。

例10.2 展開ステージ

public interface DeploymentStages {
   /** The not installed stage - nothing is done here */
   DeploymentStage NOT_INSTALLED = new DeploymentStage("Not Installed");

   /** The pre parse stage - where pre parsing stuff can be prepared; altDD, ignore, ... */
   DeploymentStage PRE_PARSE = new DeploymentStage("PreParse", NOT_INSTALLED);

   /** The parse stage - where metadata is read */
   DeploymentStage PARSE = new DeploymentStage("Parse", PRE_PARSE);

   /** The post parse stage - where metadata can be fixed up */
   DeploymentStage POST_PARSE = new DeploymentStage("PostParse", PARSE);

   /** The pre describe stage - where default dependencies metadata can be created */
   DeploymentStage PRE_DESCRIBE = new DeploymentStage("PreDescribe", POST_PARSE);

   /** The describe stage - where dependencies are established */
   DeploymentStage DESCRIBE = new DeploymentStage("Describe", PRE_DESCRIBE);

   /** The classloader stage - where classloaders are created */
   DeploymentStage CLASSLOADER = new DeploymentStage("ClassLoader", DESCRIBE);

   /** The post classloader stage - e.g. aop */
   DeploymentStage POST_CLASSLOADER = new DeploymentStage("PostClassLoader", CLASSLOADER);

   /** The pre real stage - where before real deployments are done */
   DeploymentStage PRE_REAL = new DeploymentStage("PreReal", POST_CLASSLOADER);

   /** The real stage - where real deployment processing is done */
   DeploymentStage REAL = new DeploymentStage("Real", PRE_REAL);

   /** The installed stage - could be used to provide valve in future? */
   DeploymentStage INSTALLED = new DeploymentStage("Installed", REAL);
}
既存の展開ステージは Microcontainer の組込みコントローラ状態にマッピングされ、汎用コントローラ状態の展開ライフサイクルを中心としたビューを提供します。
デプロイヤ内部では、展開は Microcontainer のコンポーネント DeploymentControllerContext に変換されます。Microcontainer の状態マシンは依存関係を処理します。
展開は展開ステージで順番に処理されます。各デプロイヤに対して、デプロイヤの parent-first プロパティを使用して、展開された全体の階層順序が処理されます。このプロパティはデフォルトで true に設定されます。
また、デプロイヤが処理する階層レベルを指定することもできます。alltop levelcomponents only、または no components を選択できます。
ここでは、Microcontainer によるコンポーネントモデルの処理と依存関係処理を行う方法が適用されます。未解決の依存関係がある場合、展開は現在の状態で待機し、現在の状態が必要な状態でない場合にエラーが報告されることがあります。
新しいデプロイヤの追加は、既存の多くのヘルパーデプロイヤのいずれかを拡張することにより実現されます。
一部のデプロイヤは実際に VFS 支援展開が必要であり、他のデプロイヤは一般的な展開を使用できます。ほとんどの場合、解析デプロイヤは VFS の支援が必要です。

警告

また、デプロイヤは各展開、サブ展開、およびコンポーネントで再帰的に実行されることにも注意してください。プロセスのできるだけ早い段階で、デプロイヤが現在の展開を処理する必要があるかどうかをコードで決定する必要があります。

例10.3 展開に関する情報を出力する単純なデプロイヤ

public class StdioDeployer extends AbstractDeployer {
   public void deploy(DeploymentUnit unit) throws DeploymentException
   {
      System.out.println("Deploying unit: " + unit);
   }

   @Override
   public void undeploy(DeploymentUnit unit)
   {
      System.out.println("Undeploying unit: " + unit);
   }
}
この記述を JBoss Application Server の deployers/ ディレクトリの -jboss-beans.xml ファイルのいずれかに追加します。この結果、MainDeployerImpl Bean が Microcontainer の IoC コールバック処理によりこのデプロイヤを取得します。

例10.4 単純な展開記述子

<bean name="StdioDeployer" class="org.jboss.acme.StdioDeployer"/>