Tomcat停止後の処理継続について質問です。
ある処理を行うプログラムAがあるとします。
この処理には非常に時間がかかり、1時間くらいかかるとします。
このプログラムをサーブレットから呼び出し、起動させた後、
仮に、Tomcatが停止してもプログラムAを稼動させ続けたいのですが、
どのようにすればよろしいでしょうか?
つまり、
1:ユーザがあるリンクをクリック
2:TomcatがHTTPリクエストを受け取り、サーブレットを呼び出す
3:2のサーブレットがプログラムAを起動
4:サーブレットが「プログラムAを起動しました。」というHTMLをブラウザに返す
5:プログラムAの処理が終了していない段階で、Tomcatを停止させる
という流れの中で、5以降もプログラムAを稼動させつづけたいのです。
どなたか、ご教授いただけませんでしょうか?
ちなみに、プログラムAはJavaです。
動作OSはRedHatです。
No.6
- 回答日時:
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なりファイルなりに実行結果を保存するように設計しておいた方がいいです。
No.5
- 回答日時:
プログラムAはTomcatとは別のプログラムで起動しておくという方法もあります。
呼び出しは、
・特定のポートで起動のリクエストを受け付ける
・特定のディレクトリを監視して、そこにファイルを作成することでやり取り
・ファイルではなく、DBでやり取り
等の方法があります。
BonjinさんのRuntime#exec()が一番手軽だとは思いますが、JavaVMがいくつも起動されるのが短所です。
VMは結構重いので、同時に実行される数が多い場合は避けたほうがいいです。
どの方法でも、処理結果を照会する手段はきちんと用意しておきましょう。
この回答への補足
ありがとうございます!
・特定のポートで起動のリクエストを受け付ける
・特定のディレクトリを監視して、そこにファイルを作成することでやり取り
・ファイルではなく、DBでやり取り
この3つの方法はありです!
これは思いつきませんでした。
Cronで定期的にプログラムAを稼動させ、ファイルかDBでやり取りするのがいいかもしれませんね。
やっぱりこれしかないかなぁ・・・
No.3
- 回答日時:
Tomcatを停止した後そのプログラムAの実行結果は
どのようにしてクライアントで受け取るのですか?
通信手段は既に停止してる訳ですよね。
それでプログラムAの意味はどうなるのでしょうか?
それともMVCモデル+アルファという意味なのでしょうか。しかしセッションは終了している???
この回答への補足
プログラムAはただのバッチ処理です。
そのバッチ処理には数十分から数時間の時間がかかります。
しかし、そのバッチ処理は1つのトランザクションなので、仮にTomcatが停止しても、稼動させつづけなければなりません。
なので、プログラムAはクライアントに何か情報を伝えるということはないので、
セッションが終了しても問題ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 windows11 update の「更新の再開」について初歩的な質問なのですが 1 2022/10/19 00:57
- ノートパソコン Windows 10 動作改善方法 6 2023/04/26 22:30
- その他(プログラミング・Web制作) Windows上のプログラム。「予め決められた時刻に自分で起動して処理して自分で終了する」って可能? 3 2023/01/04 14:29
- システム CPUの問題について 2 2022/07/09 12:04
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- C言語・C++・C# 1. 仮想CPU「exmini」を使用して,「$dataからn減算する」プログラムを作成してください 2 2022/07/04 17:49
- Java 問題作成のWebアプリの作り方を教えてください 1 2022/11/26 22:01
- その他(コンピューター・テクノロジー) Windows 11 Version 22H2 の (KB5023706)のアップデートに失敗する 2 2023/03/25 21:06
- ノートパソコン 2010年製ダイナブックノートパソコンを使っています 昨日再起動するタイミングでプログラム更新を行っ 3 2022/04/05 06:17
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0で作ったプロジェクトが起...
-
ローカルのHTMLからexeファイル...
-
Access クエリ実行が急に非常に...
-
VC++から引数付きexeファイルの...
-
OLE又はDDEを使うVISUAL BESIC...
-
jarファイル実行時の環境変数の...
-
デスクトップにショートカット...
-
JAVA .jarファイルに再圧縮する...
-
VBフォームアプリケーションに...
-
コンパイル ./aと./a.out の違い
-
エクセルの実行ファイルについ...
-
ミニゲーム作成。
-
VS codeを使って、ラズパイ Pic...
-
ファイルアイコンの左下に緑の□...
-
JavaScriptでコマンドプ...
-
ローカルアプリの実行
-
exeファイルで実行できない
-
64bit環境で32bitのodbc参照
-
SWTとSwingの違い
-
「xdoc2txt」を利用した文書検...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access クエリ実行が急に非常に...
-
OLE又はDDEを使うVISUAL BESIC...
-
xismoについてです!開こうとす...
-
VC++から引数付きexeファイルの...
-
JavaScriptでコマンドプ...
-
LINK : fatal error LNK1104に...
-
VBAでEXEファイルを動かす方法...
-
c/c++ ビルドしたにもかかわら...
-
WScript.Echo と msgbox
-
64bit環境で32bitのodbc参照
-
VBAでMP3を鳴らしたい
-
コマンドプロンプトで外のexeや...
-
batからexeを実行し戻り値を受...
-
ファイルアイコンの左下に緑の□...
-
コンパイル ./aと./a.out の違い
-
htaファイルが実行されません
-
jarファイルとjava.exeの関連付...
-
JAVA .jarファイルに再圧縮する...
-
VB6.0で作ったプロジェクトが起...
-
以下のように複数のファイルを...
おすすめ情報