- ベストアンサー
Tomcat停止後の処理継続方法について
- Tomcat停止後の処理継続方法についての質問です。時間のかかるプログラムAをTomcatを停止しても稼働させる方法を教えてください。
- Tomcat停止後にもプログラムAを稼働させ続ける方法について教えてください。プログラムAは時間がかかるため、Tomcatが停止しても中断させずに続けたいです。
- Tomcatを停止するとプログラムAが中断されるため、停止後もプログラムAを稼働させ続ける方法について教えてください。Javaで開発されたプログラムAをRedHat上で稼働させています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
なぜTOMCATを終了させなくてはならないのですか?
その他の回答 (5)
- deadlock
- ベストアンサー率67% (59/87)
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なりファイルなりに実行結果を保存するように設計しておいた方がいいです。
- deadlock
- ベストアンサー率67% (59/87)
プログラムAはTomcatとは別のプログラムで起動しておくという方法もあります。 呼び出しは、 ・特定のポートで起動のリクエストを受け付ける ・特定のディレクトリを監視して、そこにファイルを作成することでやり取り ・ファイルではなく、DBでやり取り 等の方法があります。 BonjinさんのRuntime#exec()が一番手軽だとは思いますが、JavaVMがいくつも起動されるのが短所です。 VMは結構重いので、同時に実行される数が多い場合は避けたほうがいいです。 どの方法でも、処理結果を照会する手段はきちんと用意しておきましょう。
補足
ありがとうございます! ・特定のポートで起動のリクエストを受け付ける ・特定のディレクトリを監視して、そこにファイルを作成することでやり取り ・ファイルではなく、DBでやり取り この3つの方法はありです! これは思いつきませんでした。 Cronで定期的にプログラムAを稼動させ、ファイルかDBでやり取りするのがいいかもしれませんね。 やっぱりこれしかないかなぁ・・・
- Bonjin
- ベストアンサー率43% (418/971)
プログラムAを直接呼び出すのではなく(同一JavaVM上で動かすのではなく)、Runtime#exec()等を利用して別のJavaVMを起動し、その上で走らせればいいのではないでしょうか?
補足
それも検討しました。 しかし、JVMが複数稼動する恐れがあり、見送っている状況です
- fortranxp
- ベストアンサー率26% (181/684)
Tomcatを停止した後そのプログラムAの実行結果は どのようにしてクライアントで受け取るのですか? 通信手段は既に停止してる訳ですよね。 それでプログラムAの意味はどうなるのでしょうか? それともMVCモデル+アルファという意味なのでしょうか。しかしセッションは終了している???
補足
プログラムAはただのバッチ処理です。 そのバッチ処理には数十分から数時間の時間がかかります。 しかし、そのバッチ処理は1つのトランザクションなので、仮にTomcatが停止しても、稼動させつづけなければなりません。 なので、プログラムAはクライアントに何か情報を伝えるということはないので、 セッションが終了しても問題ありません。
- ssm3u
- ベストアンサー率52% (19/36)
プログラムAが servletVM上で動く限り無理だと思います。 サーブレットはフラグを立てるだけで終了してしまい、 cronかなんかでシェルスクリプトを呼び出して、 フラグが立ってたらプログラムAを実行する!という処理はどうでしょう? プログラムAの最初の作業は「フラグを倒すこと」になります。
お礼
なるほど! いいですね。有難うございます!システムの仕様にあうかどうか、 検討してみます。
補足
あえて停止させるわけではなく、何らかの理由で停止せざるをえない場合を想定しています。 たとえば、Webアプリに異常が発生し、停止せざるをえない場合とか、メンテナンスなどの理由で停止せざるをえないとか、、、そんな感じです。 すみません・・・