Cosminexus 機能解説

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

付録C.2 Webアプリケーションの更新検知とリロード

サーブレットエンジンモードでは,Webコンテナ上のアプリケーションの更新を検知し,更新したアプリケーションをリロードする機能を備えています。この機能によって,Webコンテナサーバを再起動することなく,デプロイ済みのサーブレットやJSPを動的に入れ替えることができます。この機能は,Webアプリケーション開発時のテストを支援する機能として利用します。

リロード機能には,次の二つがあります。

これらの機能によって,Webコンテナサーバにロード済みのサーブレットまたはJSPを,Webコンテナサーバ起動中に更新後のサーブレットまたはJSPに置き換えができます。

注※
Webコンテナサーバの起動後にアクセスされたサーブレット/JSP,またはweb.xmlの<load-on-startup>タグに指定されているサーブレット/JSPを指します。

Webアプリケーションのリロードと,JSPファイルの再コンパイルについて次に示します。

<この項の構成>
(1) Webアプリケーションのリロード
(2) リロードの動作に関する設定
(3) JSPファイルの再コンパイル

(1) Webアプリケーションのリロード

Webアプリケーションのリロードの条件について説明します。

(a) Webアプリケーションのリロードの条件

Webコンテナサーバ起動後,更新検知対象のファイルが次に示す条件でリロードされます。

表C-2 リロードの条件

更新検知対象のファイル種別 リロードの条件

Windowsの場合
WEB-INF\classesディレクトリ下のクラスファイルおよびリソースファイル(java.util.ResourceBundleによってロードされたファイルなど)

UNIXの場合
WEB-INF/classesディレクトリ下のクラスファイルおよびリソースファイル(java.util.ResourceBundleによってロードされたファイルなど)

  • ロード時の更新日時と異なる場合
  • ロードされたファイルが削除された場合

Windowsの場合
WEB-INF\libディレクトリ下のJARファイル

UNIXの場合
WEB-INF/libディレクトリ下のJARファイル

  • ロード時の更新日時と異なる場合
  • JARファイルが追加された場合
  • JARファイルが削除された場合
(b) リロード処理の流れ

Webアプリケーションの更新を検知して,リロードするまでの流れを次の図に示します。

図C-1 Webアプリケーションの更新検知からリロードまでの動作

[図データ]

  1. Webアプリケーションを更新する
  2. WebコンテナがWebアプリケーションの更新を検知する
    Webコンテナは,設定した間隔でWebアプリケーションが更新されているかどうかチェックします。この間隔は,更新検知のインターバルで設定します。詳細については,「(2)(a) 更新検知のインターバル」を参照してください。
    また,更新を検知してから,手順3.の処理を実施するまでのインターバルを設定できます。インターバルの設定については,「(2)(b) リソース更新用インターバル」を参照してください。
  3. 新規リクエストを実行待ち状態にする
    なお,処理中のリクエストはそのまま実行します。
    デフォルトでは,新規リクエストを実行待ちにしますが,処理中のリクエストの処理が終わってから,新規リクエストを実行待ちにすることもできます。この場合,リロード遅延実行の設定が必要になります。リロード遅延実行については,「(2)(c) リロード遅延実行(任意)」を参照してください。リロード遅延実行の設定は任意となります。
  4. Webアプリケーションの終了処理をする
    終了処理では次の処理が実行されます。
    • リロード前のクラスローダにローディングされたサーブレットのインスタンスが破棄されます。サーブレットがdestroyメソッドを実装している場合,destroyメソッドが実行されます。また,JSPファイルから生成されたサーブレットのインスタンスも破棄されます。この際,JSPファイルが,jspDestroyメソッドを実装している場合,jspDestroyメソッドが実行されます。
    • javax.servlet.ServletContextに登録されたオブジェクトは破棄されます。
  5. セッション情報(javax.servlet.http.HttpSessionオブジェクトに登録したオブジェクト)をシリアライズし,セッション情報ファイルに出力する
    セッション情報を引き継ぐかどうかを設定できます。セッション情報を引き継ぎたい場合に指定してください。詳細については,「(2)(d) リロード時のセッション引き継ぎ(任意)」を参照してください。
  6. Webアプリケーション単位のクラスローダを新規に作成する
    Webアプリケーションのリロード処理が実行されると,Webアプリケーション単位のクラスローダが新たに作成され,リロード後のリクエスト処理で使用されます。すでにロードされているサーブレットについては,destroyメソッドが実行され,インスタンスを破棄します。
  7. セッション情報ファイルからセッション情報を読み込み,デシリアライズする
    セッション情報ファイルからセッション情報を読み込み,リロード後のクラスローダ上でデシリアライズします。セッション情報の引き継ぎを設定している場合だけ実施されます。
  8. セッション情報ファイルを削除する
    セッション引き継ぎを指定している場合だけ実施されます。
  9. Webアプリケーションの開始処理をする
    リロード後は,初回アクセス時に更新後のサーブレットのインスタンスが作成され,initメソッドが実行されます。
  10. リクエスト処理を再開する
    3.で実行待ちにしていたリクエストの処理を再開します。

注※
シリアライズ処理,およびデシリアライズ処理の時間は,リロードを実行しているWebアプリケーション上で生成されたセッション数,javax.servlet.http.HttpSessionオブジェクトに登録したオブジェクトの容量などに依存します。

(2) リロードの動作に関する設定

アプリケーションの更新検知とリロード機能は,デフォルトの設定では実行されません。必要に応じて実行するように設定してください。

この機能では,次の動作をカスタマイズできます。

リロードの動作に関する設定は,Webコンテナサーバのプロパティ,またはWebコンテナ上で動作するWebアプリケーションプロパティとして設定します。アプリケーションの更新検知とリロードの設定については,マニュアル「Cosminexus システム構築ガイド」を参照してください。

(a) 更新検知のインターバル

Webアプリケーションの更新を検知する間隔を設定できます。更新検知は,デーモンスレッドによって実行されます。デフォルトでは1秒間隔となっています。

更新検知インターバルの値を大きくすると,構成ファイルを監視する間隔が長くなり,ファイル更新後のリロードの反映が遅くなります。また,値を小さくすると,リロードの反映が早くなります。

ポイント
更新検知の対象となるファイル数が増えると,更新検知処理のオーバーヘッドが大きくなり,CPU使用率が高くなります。このような場合は,更新検知インターバルを変更することによって,性能への影響が小さくなります。更新検知インターバルの値は大きくすることをお勧めします。
(b) リソース更新用インターバル

Webアプリケーションの更新を検知してから,処理中のリクエスト数の監視を実施するまでの時間を設定できます。

Webコンテナは,ファイル(リソース)の更新を検知すると,更新するファイルをコピーし,処理中のリクエスト数の監視を開始します。処理中のリクエストの処理が完了すると,コピーしたファイルをロードします。ファイルの容量が大きい場合,ネットワークを経由した場合や,ファイルが複数ある場合には,ファイルコピーなどの処理時間が長くなることがあります。このとき,ファイルコピーが完了する前に処理中のリクエストがなくなると,ファイルコピー中にロードが開始されて,ロードに失敗するおそれがあります。これを回避するため,ファイルコピーに掛かる時間を考慮してコピーが完了してからロードが開始されるように,構成ファイルの更新を検知してから処理中のリクエスト数の監視を開始するまでの時間をリソース更新用インターバルとして設定しておくことができます。

ポイント
  • リソース更新用インターバルには,実際に掛かるコピー時間にゆとりを持たせた時間を設定することをお勧めします。
  • 複数のファイルを同時に更新する場合,複数のファイルの更新に掛かる時間を算出して,設定してください。
(c) リロード遅延実行(任意)

ファイル(リソース)の更新を検知してから,リロードを開始するまでの時間を設定できます。リロード遅延実行の時間を設定している場合に,Webアプリケーションの更新を検知すると,リロードの開始を遅延実行に指定した時間まで遅らせます。指定した時間内に処理中のリクエストがなくなるか,または指定した時間がくると,アプリケーションのサービスを停止してリロードを開始します。これによって,処理中のリクエストの実行待ち時間を減らすことができるため,アプリケーションのサービス停止期間を最小限にできます。

なお,デフォルトでは,リロード遅延実行が設定されていません。デフォルトでは次のような動作となります。

  1. Webコンテナがリソースの更新を検知すると,アプリケーションのサービスを停止する
  2. リクエストを次のように処理する
    • 新規のリクエスト:実行待ちにする
    • 処理中のリクエスト:すべてのリクエストを処理する
  3. 処理中のリクエストの処理が完了すると,リロードが実施される

リロードの遅延実行が設定されていないと,アプリケーションのサービス停止の期間が長くなります。これを回避するため,リロード遅延実行を設定することをお勧めします。

リロード遅延実行を設定した場合と設定しない場合の,アプリケーションのサービス停止期間の違いを,次の図に示します。

図C-2 アプリケーションのサービスの停止期間の違い

[図データ]

(d) リロード時のセッション引き継ぎ(任意)

Webアプリケーションのリロード実行前に生成したセッション情報を,リロード後も継続して利用するかどうかを設定できます。これによって,リロード前にjavax.servlet.http.HttpSessionオブジェクトに登録されているオブジェクトを,リロード後も引き続き利用できるようになります。セッションの情報は,シリアライズされてセッション情報ファイルに出力されます。セッション情報ファイルは,リロード処理開始時に作成されます。そして,リロード後にセッション情報がクラスローダ上でデシリアライズされ,セッション情報ファイルはリロード処理完了時に削除されます。

なお,セッション引き継ぎ機能を使用しない場合,リロード処理が実行されるとセッション情報はすべて失われます。

(e) 注意事項

Webアプリケーションのリロード機能を使用する際の,注意について説明します。

●リロード機能の使用に関する注意
●リソースの更新に関する注意
●リロード処理実行時の注意
●リロードの処理時間に関する注意

リロード処理時間は,Webアプリケーションの実装に大きく依存します。このため,次の点に注意が必要です。

●セッション引き継ぎ機能を使用する場合の注意

(3) JSPファイルの再コンパイル

WebコンテナにロードされたJSPファイルの更新日時がロード時と異なる場合,再コンパイルされるように設定できます。ただし,JSPファイルから生成されたJavaファイル,またはクラスファイルを更新しても,再コンパイルの対象にはなりません。

JSPの再コンパイル機能は,デフォルトの設定では実行されません。必要に応じて実行するように設定してください。

この機能では,次の動作をカスタマイズできます。

JSPファイルの再コンパイルに関する設定は,Webコンテナサーバのプロパティ,またはWebコンテナ上で動作するWebアプリケーションプロパティとして設定します。アプリケーションの更新検知とリロードの設定については,マニュアル「Cosminexus システム構築ガイド」を参照してください。

(a) 更新検知のインターバル

JSPファイルの更新を検知する間隔を指定できます。更新検知は,デーモンスレッドによって実行されます。デフォルトでは1秒間隔となっています。

ポイント
更新検知の対象となるファイル数が増えると,更新検知処理のオーバーヘッドが大きくなり,CPU使用率が高くなります。このような場合は,更新検知インターバルを変更することによって,性能への影響が小さくなります。更新検知インターバルの値は大きくすることをお勧めします。
(b) JSPファイル更新用インターバル

JSPファイル更新用インターバルとは,JSPファイルの更新を検知してから,JSPファイルをコンパイルするまでの間隔を指します。

(c) 注意事項