- PR -

tomcatの終了時にサーブレットを実行する方法

1
投稿者投稿内容
mongar
会議室デビュー日: 2007/04/14
投稿数: 5
投稿日時: 2007-04-14 00:49
tomcatの起動時にサーブレットを実行したい場合、web.xmlの<load-on-startup>要素で
指定できますが、逆に、tomcatの終了時に何らかの処理を行いたい場合、終了時に
実行するサーブレットを指定する方法はあるのでしょうか。

目的としては、

A.メイン処理を行うスレッド
B.Aのスレッドを、パラメータに応じて開始・停止できるサーブレット

の2つを用意し、

1.サーバー起動時にtomcatがサービスとして起動する
2.tomcatは起動の際に「パラメータ=開始」でBのサーブレットを呼び出す
3.tomcat起動中は、Bのサーブレットを通じてAのスレッドの開始・停止が行える
4.サーバー終了時、OSがtomcatを終了する前に、Aのスレッドの停止処理を行う

と言う事を行いたいのです。
現状で、4の処理を実行する方法が分かりません。
常駐プログラムを設計するに当たって、上記のようなやり方が正しいのかどうかと
言うことも含めて、ご教示いただければ幸いです。
よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-04-14 00:53
destroy メソッドに処理を書いてはいかがでしょう。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-04-14 01:00
ServletContextListenerというのもあります。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2007-04-14 01:02
引用:

mongarさんの書き込み (2007-04-14 00:49) より:

1.サーバー起動時にtomcatがサービスとして起動する
2.tomcatは起動の際に「パラメータ=開始」でBのサーブレットを呼び出す
3.tomcat起動中は、Bのサーブレットを通じてAのスレッドの開始・停止が行える
4.サーバー終了時、OSがtomcatを終了する前に、Aのスレッドの停止処理を行う

現状で、4の処理を実行する方法が分かりません。



http://www.javaroad.jp/servletjsp/sj_servlet1.htm

destory()に終了処理を書いておけばいいような気がしますが。。。

BサーブレットをAサーブレットから呼び出すのはdispatchすればいいので
可能ではあります。

引用:

常駐プログラムを設計するに当たって、上記のようなやり方が正しいのかどうかと
言うことも含めて、ご教示いただければ幸いです。
よろしくお願いします。



servlet A {
init(){
B->thread()->start();
}
doGet() {
param == start
B->thread()->start();
else
B->thread()->stop();
}

destroy() {
B->thread()->stop();
}

でやればいいだけなので、不思議な設計である気はします。
Bをサーブレットにする必要性を感じません。

ただし、その他の要因は分からないのでなんとも言いようはありません。

mongar
会議室デビュー日: 2007/04/14
投稿数: 5
投稿日時: 2007-04-14 01:43
インギさん、かつのりさん、加納正和さん、
ご返答、ありがとうございます。
少し説明不足でしたので、追記させていただきます。
実際の環境ではAのスレッドは複数あり、それぞれが

・ログ出力スレッド
・出力ログ集計スレッド
・集計結果送信スレッド

と言った形で上流から下流までの工程を担当することになっています。
そして、

1.サーバー起動時には上流の工程のスレッドから順番に開始する
2.サーバー起動中はそれぞれのスレッドを自由に開始・停止できる
3.サーバー終了時には下流の工程のスレッドから順番に停止する

と言う環境を構築したいと思っています。
起動時の順番は<load-on-startup>要素の数値で指定できるので、
終了時にも同じことが可能かと思い、質問させていただきました。
確かに、サーブレットのdestroyメソッドにスレッドの終了処理を
記述すれば停止は行えますが、順番を管理する方法が分かりません。
複数のサーブレットがある場合、それぞれのdestroyメソッドが
呼び出される順番は、管理できるのでしょうか。
現状では、各スレッドを呼び出すサーブレットを一つにまとめ、

1.開始時、initメソッド内で上流工程から順番に開始する
2.起動時、引数で開始・停止を行うスレッドを切り分ける
3.終了時、destroyメソッド内で下流工程から順番に停止する

と言うやり方しか思いつきません。
もっと良い方法があれば、お教えください。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-04-14 01:49
destroy() が呼び出される順序は少なくとも Servlet API 2.3 では規定されていなかったと思います。
2.4 や 2.5 の仕様は確認してみてください。
http://www.jcp.org/

実際に動かしてみて順序を確認してみるのも良いですね。

WebLogic なんかだと load-on-startup と逆の順序で destroy を呼び出してくれます。

順序が保証されていない/Tomcatでは順序がまもられない、のであれば一つのサーブレットの destroy() メソッド内で好みの順序で終了処理を行えば良いのではないでしょうか。

[ メッセージ編集済み 編集者: インギ 編集日時 2007-04-14 01:50 ]
1

スキルアップ/キャリアアップ(JOB@IT)