アプリ版:「スタンプのみでお礼する」機能のリリースについて

Tomcat停止後の処理継続について質問です。

ある処理を行うプログラムAがあるとします。
この処理には非常に時間がかかり、1時間くらいかかるとします。

このプログラムをサーブレットから呼び出し、起動させた後、
仮に、Tomcatが停止してもプログラムAを稼動させ続けたいのですが、
どのようにすればよろしいでしょうか?

つまり、
1:ユーザがあるリンクをクリック
2:TomcatがHTTPリクエストを受け取り、サーブレットを呼び出す
3:2のサーブレットがプログラムAを起動
4:サーブレットが「プログラムAを起動しました。」というHTMLをブラウザに返す
5:プログラムAの処理が終了していない段階で、Tomcatを停止させる
という流れの中で、5以降もプログラムAを稼動させつづけたいのです。

どなたか、ご教授いただけませんでしょうか?

ちなみに、プログラムAはJavaです。
動作OSはRedHatです。

A 回答 (6件)

なぜTOMCATを終了させなくてはならないのですか?

この回答への補足

あえて停止させるわけではなく、何らかの理由で停止せざるをえない場合を想定しています。
たとえば、Webアプリに異常が発生し、停止せざるをえない場合とか、メンテナンスなどの理由で停止せざるをえないとか、、、そんな感じです。
すみません・・・

補足日時:2005/09/22 16:04
    • good
    • 0

No5です。


>4:サーブレットが「プログラムAを起動しました。」というHTMLをブラウザに返す
をやるためには、数秒単位でチェックを行う必要があるので、cronではなくjava.util.Timerがオススメです。
JVMの起動/終了をcronで繰り返すとクラスのロードなどが毎回実行されるために、チェック処理が簡単なものでも時間がかかります。
java.util.Timerから待機している監視用モジュールのスレッドを起動するようにしていれば、結構細かい単位で実行できます。

以前私がバッチ処理をJavaで作ったときは、ファイル作成の形式でした。
概略を書いておきますね。
1.バッチ処理モジュールAとディレクトリ監視モジュールを作る
2.監視モジュールは、あらかじめ起動しておく。
3.サーバ側のモジュールは、そのディレクトリにパラメータなどが入ったファイルを作成
4.監視モジュールはプログラムAを処理するスレッドを起動し、チェックに戻る。このときに、起動済みのファイルをリネーム
5.サーバ側のモジュールは、ファイルがリネームされたらバッチ起動のメッセージを表示
6.モジュールAは、実行が終わったら処理実行結果をファイルに記録

監視モジュール部分は後でDBバージョンも作らされてしまったのですが…。
Webサーバ側からはレコード登録して、バッチ側は起動/処理結果などをフラグ変更するようにしてました。

>プログラムAはクライアントに何か情報を伝えるということはないので
多分、実行結果(もしかしたら途中経過も)を見たいという要望が出てきますよ。
この機能があったほうが、結合テスト以降の実施が楽になります。
実際に実装するかどうかは別として、後で困らないよう、DBなりファイルなりに実行結果を保存するように設計しておいた方がいいです。
    • good
    • 0

プログラムAはTomcatとは別のプログラムで起動しておくという方法もあります。


呼び出しは、
・特定のポートで起動のリクエストを受け付ける
・特定のディレクトリを監視して、そこにファイルを作成することでやり取り
・ファイルではなく、DBでやり取り
等の方法があります。
BonjinさんのRuntime#exec()が一番手軽だとは思いますが、JavaVMがいくつも起動されるのが短所です。
VMは結構重いので、同時に実行される数が多い場合は避けたほうがいいです。
どの方法でも、処理結果を照会する手段はきちんと用意しておきましょう。

この回答への補足

ありがとうございます!
・特定のポートで起動のリクエストを受け付ける
・特定のディレクトリを監視して、そこにファイルを作成することでやり取り
・ファイルではなく、DBでやり取り
この3つの方法はありです!
これは思いつきませんでした。

Cronで定期的にプログラムAを稼動させ、ファイルかDBでやり取りするのがいいかもしれませんね。

やっぱりこれしかないかなぁ・・・

補足日時:2005/09/23 15:10
    • good
    • 0

プログラムAを直接呼び出すのではなく(同一JavaVM上で動かすのではなく)、Runtime#exec()等を利用して別のJava

VMを起動し、その上で走らせればいいのではないでしょうか?

この回答への補足

それも検討しました。
しかし、JVMが複数稼動する恐れがあり、見送っている状況です

補足日時:2005/09/23 15:09
    • good
    • 0

Tomcatを停止した後そのプログラムAの実行結果は


どのようにしてクライアントで受け取るのですか?
通信手段は既に停止してる訳ですよね。

それでプログラムAの意味はどうなるのでしょうか?
それともMVCモデル+アルファという意味なのでしょうか。しかしセッションは終了している???

この回答への補足

プログラムAはただのバッチ処理です。
そのバッチ処理には数十分から数時間の時間がかかります。
しかし、そのバッチ処理は1つのトランザクションなので、仮にTomcatが停止しても、稼動させつづけなければなりません。

なので、プログラムAはクライアントに何か情報を伝えるということはないので、
セッションが終了しても問題ありません。

補足日時:2005/09/23 15:04
    • good
    • 0

プログラムAが servletVM上で動く限り無理だと思います。



サーブレットはフラグを立てるだけで終了してしまい、
cronかなんかでシェルスクリプトを呼び出して、
フラグが立ってたらプログラムAを実行する!という処理はどうでしょう?

プログラムAの最初の作業は「フラグを倒すこと」になります。
    • good
    • 0
この回答へのお礼

なるほど!
いいですね。有難うございます!システムの仕様にあうかどうか、
検討してみます。

お礼日時:2005/09/23 14:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!