Tomcatには、Webアプリケーション自動配備の仕組みがあります。アプリケーションのベースディレクトリ(デフォルトでは「%TOMCAT_HOME%\webapps」)以下にアプリケーションを追加したり、アプリケーションを変更したときに、自動的にロードしてくれる仕組みです。
こうした、特定ディレクトリ以下のファイル更新を自動的にチェックするような機能は、Javaの基本的なテクニックの組み合わせで実現できます。本TIPSで説明する方法は、Tomcatで実際に使われています。
更新自動チェックのプログラミング方法
スレッドを1つ常駐させて一定間隔でチェック処理を走らせます。ここで、ディレクトリ更新の自動チェックを行うクラスを作成する上でのポイントを、5点挙げます。
- (1)Runnableインターフェイスを実装した内部クラスを作る
- (2)スレッドを停止するためのフラグを持つ
- (3)管理下に置かれているファイルのリストを持つ
- (4)管理下に置かれているファイルの最終更新時刻を記録する
- (5)常駐させるスレッドはデーモンスレッドとする
(1)と(5)について簡単に補足します。まず、(1)でなぜ内部クラスにするかというと、このRunnable実装クラスは、本体クラスと強い関連を持つクラスなので、外で定義したところでほかに再利用されることが極めて考えにくいためです。外に見えるクラス数を不必要に多くし、プログラマを混乱させないためにも、このクラスは内部クラスとした方が良いでしょう。
(5)でスレッドをデーモンスレッド(注)にするのは、プログラム本来の動作が終了したときにプログラムが終了するようにするためです。例えばTomcatの場合、本来の動作とはサーブレット・コンテナとしての動作です。従って、ディレクトリ更新の自動チェックだけが目的のプログラムであれば、逆にデーモンスレッドにしてはいけません。
注:Javaでは通常、スレッドが生きている限りプログラムは終了しませんが、生きているスレッドがデーモンスレッドだけになった場合、プログラムは終了することになっています。
更新チェッククラスは、以下のようになります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
サンプルクラスでは、ファイルの追加/更新/削除があったときに、それを標準出力へ知らせるだけの処理をしています。この処理を変更したければ、サンプルクラスのcheckRemoved()、checkNew()、checkModified()の各メソッドを修正すればよいでしょう。これらのメソッドはprotected属性になっていますので、このクラスをサブクラス化して、各メソッドの実装をオーバーライドすることで、動作の変更ができます。
さて、このプログラムを実行させるためのクライアントコードは以下のようになります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
プログラムを実行させてみます。実行の前に、カレントディレクトリに「my_dir」ディレクトリがあることを確認してください。実行後にファイルの追加/更新/削除を行うと、以下のように表示されます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Copyright © ITmedia, Inc. All Rights Reserved.