Tomcat停止後の処理継続方法について

このQ&Aのポイント
  • Tomcat停止後の処理継続方法についての質問です。時間のかかるプログラムAをTomcatを停止しても稼働させる方法を教えてください。
  • Tomcat停止後にもプログラムAを稼働させ続ける方法について教えてください。プログラムAは時間がかかるため、Tomcatが停止しても中断させずに続けたいです。
  • Tomcatを停止するとプログラムAが中断されるため、停止後もプログラムAを稼働させ続ける方法について教えてください。Javaで開発されたプログラムAをRedHat上で稼働させています。
回答を見る
  • ベストアンサー

Tomcat停止後の処理継続について

Tomcat停止後の処理継続について質問です。 ある処理を行うプログラムAがあるとします。 この処理には非常に時間がかかり、1時間くらいかかるとします。 このプログラムをサーブレットから呼び出し、起動させた後、 仮に、Tomcatが停止してもプログラムAを稼動させ続けたいのですが、 どのようにすればよろしいでしょうか? つまり、 1:ユーザがあるリンクをクリック 2:TomcatがHTTPリクエストを受け取り、サーブレットを呼び出す 3:2のサーブレットがプログラムAを起動 4:サーブレットが「プログラムAを起動しました。」というHTMLをブラウザに返す 5:プログラムAの処理が終了していない段階で、Tomcatを停止させる という流れの中で、5以降もプログラムAを稼動させつづけたいのです。 どなたか、ご教授いただけませんでしょうか? ちなみに、プログラムAはJavaです。 動作OSはRedHatです。

  • Java
  • 回答数6
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.1

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

0121EO
質問者

補足

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

その他の回答 (5)

  • deadlock
  • ベストアンサー率67% (59/87)
回答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なりファイルなりに実行結果を保存するように設計しておいた方がいいです。

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.5

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

0121EO
質問者

補足

ありがとうございます! ・特定のポートで起動のリクエストを受け付ける ・特定のディレクトリを監視して、そこにファイルを作成することでやり取り ・ファイルではなく、DBでやり取り この3つの方法はありです! これは思いつきませんでした。 Cronで定期的にプログラムAを稼動させ、ファイルかDBでやり取りするのがいいかもしれませんね。 やっぱりこれしかないかなぁ・・・

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.4

プログラムAを直接呼び出すのではなく(同一JavaVM上で動かすのではなく)、Runtime#exec()等を利用して別のJavaVMを起動し、その上で走らせればいいのではないでしょうか?

0121EO
質問者

補足

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

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.3

Tomcatを停止した後そのプログラムAの実行結果は どのようにしてクライアントで受け取るのですか? 通信手段は既に停止してる訳ですよね。 それでプログラムAの意味はどうなるのでしょうか? それともMVCモデル+アルファという意味なのでしょうか。しかしセッションは終了している???

0121EO
質問者

補足

プログラムAはただのバッチ処理です。 そのバッチ処理には数十分から数時間の時間がかかります。 しかし、そのバッチ処理は1つのトランザクションなので、仮にTomcatが停止しても、稼動させつづけなければなりません。 なので、プログラムAはクライアントに何か情報を伝えるということはないので、 セッションが終了しても問題ありません。

  • ssm3u
  • ベストアンサー率52% (19/36)
回答No.2

プログラムAが servletVM上で動く限り無理だと思います。 サーブレットはフラグを立てるだけで終了してしまい、 cronかなんかでシェルスクリプトを呼び出して、 フラグが立ってたらプログラムAを実行する!という処理はどうでしょう? プログラムAの最初の作業は「フラグを倒すこと」になります。

0121EO
質問者

お礼

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

関連するQ&A

  • Tomcatの設定で困っています。

    Tomcatの設定で困っています。 現在、MySQLとTomcatでJDBCを用いてブラウザゲームを作成しております。 あるプログラムを何度か実行すると、Tomcatがどんどん重くなります。 TomcatのManagerでサーバーの状態を見ると、 "http-bio-8080"の何個かのスレッドのTimeがもの凄い時間になっていました。 Tomcatを再起動すると、直り、動作も軽くなります。 これは、いったいどういった状態なのでしょうか??完全に初心者なので教えてくださると助かります。 "http-bio-8080" Stage Time B Sent B Recv Client VHost Request R ? ? ? ? ? ? P ? ? ? ? ? ? S 5797966 ms 0 KB 0 KB ○.○.○.○ ○○.ne.jp POST ○○○ HTTP/1.1 R ? ? ? ? ? ? P ? ? ? ? ? ? R ? ? ? ? ? ? こんな感じです。Timeが長く、上手く処理されないスレッド?がないときは動作は軽いです。 こちら、対処法などございましたら、ご教示ください。

  • ApacheとTomcat ポート80番について

    現在、VPSでマルチドメインで以下の2つサイトを運用しています。 1. PHPによるWordPressサイト 2. Javaによる動的サイト(静的HTML無し) Apache HTTP Server(ポート80)のバーチャルドメインを使用し、2のJavaサイトの場合はAJPでTomcat(ポート8009)へ処理を振り分けています。一般的な連携方法でと思います。 サーバーOSはCentOS5.5、IPアドレスはひとつ、ウェブサーバーにはApache HTTP Server, サーブレットコンテナとしてApache Tomcatを使用しています。root権限保持しています。 質問させていただきたいことは、Apache HTTP ServerおよびApache Tomcatを同時に起動させながらポート80番を1のサイトの場合はApache HTTPが使用、2のサイトの場合はApache Tomcatが使用できるようにする方法はご存知ないでしょうか?ということです。 現在はTomcat単独で運用する場合よりもApache HTTPを経由させるためにJavaのサイトが若干反応が遅く感じます。そもそも静的コンテンツはありませんし、URLの書き換えなども別の手段を用いているため、Apache HTTP Serverを経由する意味はどちらのサイトともブラウザでポート80番へアクセスできるようにする以外ありません。 何かよい方法ご存知ないでしょうか?なお、IPアドレスはひとつ増やしても構いません。

  • 複数の処理でTomcatが停止する

    Javaのシステムを運用しています。 1台のサーバー(CentOS5.0)に、Apache-Tomcat5.0-PostgreSQL8.1-アプリケーション(顧客ごと(10社))がインストールされています。 アプリケーションの切り分けはTomcatのconf/catalina/localhost/コンテキスト.xml で定義しています。(コンテキスト1~10を作成) 昨年秋から以下の障害が発生していますが、未だに原因がわからない状況です。 Javaの知識、Tomcatの知識、PostgreSQLの知識など乏しく、ログも取れていない状況です。 どうか、疑わしい原因、調査方法など教えていただきたく存じます。 障害状況 日付  現象                         回復 11/6 A画面でB画面への遷移ボタンをした時に   Tomcat再起動し、再実行したところ      サーバーのB画面作成処理が中断       正常に処理できた。 11/16 TOPメニューからC画面を選択したが、     約10時間後、中断していたC画面処理      サーバーのC画面作成処理が中断       が再開された。その後正常に処理。 12/26  D画面でE画面への遷移ボタンをした時に   Tomcat再起動し、再実行したところ      サーバーのE画面作成処理が中断       正常に処理できた。 1/6   F画面でG画面への遷移ボタンをした時に   Tomcat再起動し、再実行したところ      サーバーのG画面作成処理が中断       正常に処理できた。 1/8   F画面でH画面への遷移ボタンをした時に    約45分後、中断していたH画面処理      サーバーのH画面作成処理が中断       が再開された。その後正常に処理。      ・他のユーザーがその顧客のシステムを      使うと、E画面処理、G画面処理、H画面      処理で中断する。      ・他の顧客のシステムは、同じ処理を行      っても正常に処理できる。(レスポンス      も正常) 中断した処理では、データベースのアクセスは読込み(SELECT文)のみです。 プログラムではThreadクラスは使っていません。 Tomcatの設定でセッションタイムアウト時間を無制限(-1)に設定していました。 Tomcatの設定でコネクションプールの最大値は100に設定しています。 障害発生時は、ログインユーザーは一人だけでした。 その後、GCログの出力、ヒープメモリ使用状況のログ出力、PostgreSqlのログ出力の設定を行いました。 また、セッションタイムアウト時間を30分に設定しました。 本日(1/29)まで障害は発生しておりません。 よろしくご教授ください。

  • Tomcatのスレッドを破棄する方法

    はじめまして。 使用ツール:Tomcat 6.0 前提条件:Tomcatのserver.xmlでmaxThreads="1"と記述し、同時にスレッドが1つしか動作しないようにしている 質問: ブラウザでDBに登録されている全ての情報を取得し表示する時の動作。 ブラウザ(情報取得ボタン押下) ↓ サーブレット:DB(情報取得) ↓ ブラウザ(結果出力)  DBからの情報取得の処理が多少時間がかかってしまうため、その間にブラウザの中止ボタンが押下されてしまう場合があります。  その場合、ブラウザ⇔HTTPサーバ(Tomcat)でのセッションは切れているのですが、サーブレットの処理は継続して行われています。  再度、情報取得ボタンが押下されると、前提条件でスレッドが1つしか作成しないようにしているため、前の処理が終了するまで待機しするという形になっています。  この場合、中止→取得→中止→取得と何度も繰り返される(IEの場合取得ボタンを連打でも可)と、さらに結果の出力が遅くなるということがおきてしまいます。  これを解決するために、Tomcatが新しいリクエストを受け取った場合、現在のスレッドを破棄するといった形にできればと考えています。  上記の考えで調査を行っているのですが、良い情報を見つけることが出来ません。    実際にTomcatが現在実行中のスレッドを破棄し、新しいリクエストを受付けて処理を実行するといったようなことはできるのでしょうか?  ご存知の方がいらっしゃったら、どうか助言をよろしくお願いいたします。

  • TOMCATインストール後、コンパイルエラーが起こってしまいます。

    WinXP(home)にTOMCATをインストールしサーブレット/JSPを勉強したいと思っているのでが、うまくいきません。 ○症状 TOMCATインストール語、「Hello Servlet」の文字を表示させるプログラムがコンパイルエラーになってしまいます。 プログラムコードに問題は無いとはずだと思い、TOMCAT以外に、「JRun」というソフトを入れて同じプログラムをコンパイルすると無事完了し、「Hello Servlet」が表示できました。 ○質問 TOMCATのインストールがうまくいっていないのでしょうか? ○TOMCATの動作確認状況 startup.batファイル実行すると、2つ目のプロンプトウィンドウは下記の様になります。 ========================================= サービス Tomcat-Standalone を起動します Apache Tomcat/4.0 サービス Tomcat-Apache を起動します Apache Tomcat/4.0 ========================================== また、 「http://localhost:8080/」は無事に表示されます。 ○コンパイルエラー内容 C:\java_sample>javac -classpath %TOMCAT_HOME%\bin\servlet.jar HelloServlet.java HelloServlet.java:3: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloServlet.java:4: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloServlet.java:6: シンボルを解釈処理できません。 シンボル: クラス HttpServlet 以下省略 ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • tomcat5について

    tomcat5をコマンドプロンプトで起動させようとしたところ The JAVA_HOME environment variable is not defined correctly This environment variable is needed to run this program NB: JAVA_HOME should point to a JDK not a JRE とでます。 環境変数JAVA_HOMEを見てみると C:\Program Files (x86)\Java\jdk1.8.0_11; となっております。 ちなみにtomcatはDドライブにあります。 その他は、 C:\Program Files (x86)\Java\jdk1.8.0_11の中にjreフォルダがあるのですが C:\Program Files (x86)\Javaにjre8フォルダがあります(その中にはlib,binフォルダ) どこが間違っているのでしょうか?

  • [SQLsrv+Apache+Tomcat]DB読み込みが遅い!!

    お世話になります!! Win2kServer + SQLserver7.0 + Apache + Tomcat 上記のような環境でJAVAサーブレットなどによるシステム開発を行っています。 しかしですね、ユーザの認証くらいの処理なのにめちゃくちゃ遅い!! 時間かかりすぎ!! その他の処理はスイスイいきます・・・が!DBがからむと・・・ 何でなんでしょうか? なんか情報をお持ちの方お教えください!!

    • ベストアンサー
    • Java
  • [apache+tomcat]なぜ!?実行したらトムキャットが落ちる!?

    こんにちわ♪ アパッチとトムキャットを使ってJavaシステムを構築しています。 昨日まで順調に動いていたユーザ認証のプログラムが、本日リカバリーして 実行しますと、サーブレットの処理がうまくいかず、トムキャットは閉じ、 IEには「Internal Server Error」と表示されてしまいます。 アパッチはSTOPにはなっていないようです。 このような現象はどういうときに発生しますか? アパッチとトムキャットの連携設定にミスがあるのでしょうか??

    • ベストアンサー
    • Java
  • tomcat7.0(404FOUND)へアクセス

    windows7でjava初心者です。tomcat7.0を起動してtomcatインストールディレクトリの webapps→entry→WEB-INFとディレクトリを使い http://localhost8080/entry/ へアクセスすると次のエラーメッセージが出ました。 HTTPステータス 404 - /entry/ type ステータスレポート メッセージ /entry/ 説明 The requested resource (/entry/) is not available. -------------------------------------------------------------------------------- Apache Tomcat/7.0.23 そんなファイル ディレクトリはないよとのことですが ディレクトリは本当に作っているんです。ファイル、サイズの頁だけ 表示させたいです「基礎からのサーブレット」 ソフトバンククリエイティブという本のp24です。ここでつまずいてます。 どうやったらアクセスできますか。

    • ベストアンサー
    • Java
  • Tomcatプロジェクトが正常に動作しません

    EclipseからTomcatプロジェクトで作成したwebアプリが正常に動作しません。Eclipseの表示とブラウザの表示は、以下の通りです。どのような原因が考えられるでしょうか? <Eclipseの表示> 2008/11/16 19:08:56 org.apache.catalina.core.ApplicationContext log 致命的: Error loading WebappClassLoader delegate: false repositories: /WEB-INF/classes/ ----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@17599cc hoge.MyServlet java.lang.ClassNotFoundException: hoge.MyServlet at ・・・(省略)・・・ 致命的: サーブレット mysrv に例外を割り当てます java.lang.ClassNotFoundException: hoge.MyServlet at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1355) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1201) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1034) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:757) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:130) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Unknown Source) <ブラウザの表示> type 例外レポート メッセージ 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 javax.servlet.ServletException: ラッパがサーブレットクラス hoge.MyServlet 又はそれが依存するクラスを見つけることができません org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) java.lang.Thread.run(Unknown Source) 原因 java.lang.ClassNotFoundException: hoge.MyServlet org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1355) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1201) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) java.lang.Thread.run(Unknown Source) 注意 原因のすべてのスタックトレースは、Apache Tomcat/5.5.20のログに記録されています

専門家に質問してみよう