Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)

[目次][用語][索引][前へ][次へ]

13.8.1 J2EEアプリケーションのリロード方法

J2EEアプリケーションのリロードには,更新検知によるリロードと,コマンドによるリロードの2種類の方法があります。

<この項の構成>
(1) 更新検知によるリロード
(2) コマンドによるリロード

(1) 更新検知によるリロード

更新検知によるリロードは,J2EEアプリケーション開発時のテストを支援する機能として利用できます。更新検知によるリロードを次の図に示します。

図13-7 更新検知によるリロード

[図データ]

展開ディレクトリ形式のJ2EEアプリケーションを構成するEJBアプリケーション(EJB-JAR)やWebアプリケーション(WAR)が更新された場合に,J2EEサーバがJ2EEアプリケーションの更新を検知し,更新後のEJB-JARやWARを自動的にリロードします。

J2EEサーバは,J2EEアプリケーションの構成ファイルを定期的に監視し,構成ファイルの更新を検知すると,J2EEアプリケーションのリロードを実行します。J2EEアプリケーションの更新からリロードまでの処理の流れを次の図に示します。

図13-8 更新検知によるリロードの処理の流れ

[図データ]

図中の1.〜10.について説明します。

  1. J2EEアプリケーションの構成ファイルを更新します。
    展開ディレクトリ形式のJ2EEアプリケーションを構成するEJB-JARやWARを更新します。
  2. J2EEサーバがJ2EEアプリケーションの構成ファイルの更新を検知します。
    • J2EEサーバは,J2EEアプリケーションの構成ファイルを定期的に監視していて,構成ファイルが更新されると更新を検知します。J2EEアプリケーションの構成ファイルを監視して更新を検知する間隔は,更新検知インターバルとして設定します。更新検知インターバルについては,「13.8.6 J2EEアプリケーションの更新検知インターバル」を参照してください。
    • 更新を検知したあと,更新するファイルをロードします。このとき,ファイルのコピー中にロードが開始されてしまい,ロードに失敗することがあります。これを回避するため,構成ファイルの更新を検知してから処理中のリクエスト数の監視を開始するまでの時間を構成ファイル更新用インターバルとして設定しておくことができます。構成ファイル更新用インターバルについては,「13.8.7 J2EEアプリケーションの構成ファイル更新用インターバル」を参照してください。
    • JSPを更新した場合には,JSPの再コンパイル,またはクラスファイルの監視によって更新が検知されます。JSPのリロードについては,「13.8.9 JSPのリロード」を参照してください。
  3. リクエスト処理を閉塞します。
    構成ファイルの更新を検知し,構成ファイル更新用インターバルで指定した時間を経過すると,J2EEアプリケーションのリロードを実行するためにリクエスト処理を閉塞します。
    • EJBアプリケーション(EJB-JAR)の場合
      新規リクエストが来たらエラーを返します。処理中のリクエストがある場合には,処理を続行します。ただし,Stateless Session Beanの場合は,CTMを使用することで,新規リクエストを実行待ちにできます。
    • Webアプリケーション(WAR)の場合
      新規リクエストが来たら実行待ちになります。処理中のリクエストがある場合には,処理を続行します。このとき,リロード遅延実行機能を使用すると,リロードの開始処理を遅らせることができます。リロード遅延実行については,「13.8.8(1) Webアプリケーションのリロード遅延実行」を参照してください。
      参考
      処理中のリクエストの処理が完了しない場合には,J2EEアプリケーション実行時間の監視のメソッドタイムアウトおよびメソッドキャンセルを実行することで,リロード処理を開始できます。リロードとJ2EEアプリケーション実行時間の監視との関係については,「13.8.10(2) リロードとJ2EEアプリケーション実行時間の監視との関係」を参照してください。
  4. J2EEアプリケーションの終了処理をします。
    リロードを実行するために,J2EEアプリケーションを終了します。終了処理では,次の処理が実施されます。
    • リロード前のクラスローダにローディングされたサーブレットのインスタンスが破棄されます。サーブレットがdestroyメソッドを実装している場合,destroyメソッドが実行されます。また,JSPファイルから生成されたサーブレットのインスタンスも破棄されます。このとき,JSPファイルがjspDestroyメソッドを実装していると,jspDestroyメソッドが実行されます。
    • javax.servlet.ServletContextに登録されたオブジェクトは破棄されます。
    • リロード前のクラスローダにローディングされたEJBのインスタンスが破棄されます。このとき,次のEJBのコールバックメソッドが実行されます。
      分類 実行されるメソッド
      Stateless Session Beanの場合 ejbRemove
      PreDestroy
      Stateful Session Beanの場合 ejbRemove
      PreDestroy
      Entity Beanの場合 unsetEntityContext
      Message-driven Beanの場合 ejbRemove
  5. セッション情報をシリアライズし,セッション情報ファイルに出力します。
    Webアプリケーションをリロードする場合は,リロード実行前に生成したセッション情報を,リロード後も継続して利用できます。セッション情報の引き継ぎについては,「13.8.8(2) Webアプリケーションのリロード時のセッション情報の引き継ぎ」を参照してください。
  6. J2EEアプリケーション単位のクラスローダを新規に作成します。
    J2EEアプリケーションのリロード処理が実行されると,J2EEアプリケーション単位のクラスローダが新たに作成され,リロード後のリクエスト処理で使用されます。
  7. セッション情報ファイルからセッション情報を読み込み,デシリアライズします。
    Webアプリケーションをリロードする場合は,セッション情報ファイルに出力されたセッション情報を新しいクラスローダに読み込みます。
  8. セッション情報ファイルを削除します。
  9. J2EEアプリケーションの開始処理をします。
    • リロード後は,初回アクセス時に更新後のサーブレットのインスタンスが作成され,initメソッドが実行されます。
    • 開始処理では,プールの最小値分のEJBを生成してプーリングします。このとき,次のEJBのコールバックメソッドが実行されます。
      分類 実行されるメソッド
      Stateless Session Beanの場合 setSessionContext
      ejbCreate
      PostConstruct
      Entity Beanの場合 setEntityContext
      Message-driven Beanの場合 setMessageDrivenContext
      ejbCreate
  10. リクエストの閉塞を解除し,リクエストの処理を再開します。
    3.で実行待ちにしていたリクエストの処理を再開します。

(2) コマンドによるリロード

コマンドによるリロードは,J2EEアプリケーション開発時のテストを支援する機能,またはシステムの運用時にJ2EEアプリケーションの入れ替えを支援する機能として利用できます。コマンドによるリロードを次の図に示します。

図13-9 コマンドによるリロード

[図データ]

展開ディレクトリ形式のJ2EEアプリケーションを構成するEJBアプリケーション(EJB-JAR)やWebアプリケーション(WAR)を更新した場合に,ユーザがcjreloadappコマンドを実行します。J2EEサーバは,cjreloadappコマンドを契機にJ2EEアプリケーションの更新を検知し,更新後のEJB-JARやWARを自動的にリロードします。

J2EEアプリケーションの更新からリロードまでの処理の流れを次の図に示します。

図13-10 コマンドによるリロードの処理の流れ

[図データ]

図中の1.〜4.について説明します。5.以降の手順については,更新検知によるリロードの場合と同じです。5.以降の手順については,「(1) 更新検知によるリロード」を参照してください。

  1. J2EEアプリケーションの構成ファイルを更新します。
    展開ディレクトリ形式のJ2EEアプリケーションを構成するEJB-JARやWARを更新します。
  2. cjreloadappコマンドを実行します。
  3. cjreloadappコマンドを契機に,J2EEサーバがJ2EEアプリケーションの構成ファイルの更新を検知します。
  4. リクエスト処理を閉塞します。
    J2EEアプリケーションのリロードを実行するためにリクエスト処理を閉塞します。
    • EJBアプリケーション(EJB-JAR)の場合
      新規リクエストが来たらエラーを返します。処理中のリクエストがある場合には,処理を続行します。ただし,Stateless Session Beanの場合は,CTMを使用することで,新規リクエストを実行待ちにできます。
    • Webアプリケーション(WAR)の場合
      新規リクエストが来たら実行待ちになります。処理中のリクエストがある場合には,処理を続行します。
      参考
      処理中のリクエストの処理が完了しない場合には,J2EEアプリケーション実行時間の監視のメソッドタイムアウトおよびメソッドキャンセルを実行することで,リロード処理を開始できます。リロードとJ2EEアプリケーション実行時間の監視との関係については,「13.8.10(2) リロードとJ2EEアプリケーション実行時間の監視との関係」を参照してください。