- - PR -
異常終了の判断方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-05 13:32
特定のプロセスの生き死になら以下のバッチをWindowsタスクで定期的に動かせば
監視できますよ。
ただ、要件としてはDBが正常に更新できる状態が維持されているかが重要だと思いますので、わたしもunibon氏の言っているようにDBの更新状態をチェックするほうがいいと思います。(できれば別マシンからチェックするのが望ましい) | ||||||||
|
投稿日時: 2007-04-05 13:49
異常終了を検知したいのは、
1. クライアントアプリ 2. クライアントの進捗チェック(おそらく常駐、非表示でクライアントアプリとは別プロセス?) 3. APサーバ 4. DBサーバ のどれでしょう?どれを指しているのか明示されていないように読み取りました。 文脈からすると2番っぽいですが、あってますか?
はい、書くことは困難でしょう。だから、書かれていなかったら 異常終了していると判断するという意図です。 でも、ゆうじゅうさんの方法のほうが、本体の改造不要で よさそうかなと思いました。 | ||||||||
|
投稿日時: 2007-04-05 17:09
Jittaさん、Unibonさん、未記入さん、ゆうじゅん、よねKENさん
ご回答ありがとうございます。 > サービスで作って、異常終了してもサービスは再起動し、処理を継続あるいはステータスを変更出来るようにする。 > その他、WIN32APIを調べるよろし。 > シャットダウン前にくるメッセージとか、それをキャンセルする方法とか、あると思う。 深く調べるとそのあたりまで行き着きそうですね。 行き着くか、、というのが問題ですが。。(汗) >ただ、今回は、プロセスの異常終了を検出するよりは、DB をポーリングしても >いつになってもステータスが変化しない、というイベントを捉えたほうが良いような気がします。 >(タイムアウトという概念を自分で実装することになります。) タイムアウトの考え方は私も考えたことがあります。 処理ごとにタイムアウトの設定は、今回のケースでは現実的に 難しいと考えています。 ・処理ごとタイムアウトを決める必要があること ・今回想定している処理は、外部とのI/Fの部分があり、応答時間が 全く読めない処理もあること などがその理由です。 > 実際に処理をおこなうプロセスは進捗テーブルへの挿入と更新はおこなうが、 >正常終了するまでコミットしない。進捗をモニタするプロセスは進捗テーブルをダーティリードする。 > > 実際に処理をおこなうプロセスが異常終了した場合、つまりコミットせずに >プロセスが終了した場合はトランザクションがロールバックされるため、 >進捗テーブルへレコードが挿入されていない状態に戻る。進捗をモニタする >プロセスは進捗テーブルから対象レコードが取得できなかったら、処理プロセスが異常終了したと判断する。 実はこの方法は、既に試して、サンプルを作って提案してみたことがあります。 実際に意図通りに動作しましたが、長時間にわたってトランザクションをかけた状態で DBに繋ぎっぱなしにするのはどうか、という意見があり、 より良い方法(シンプルな方法)を模索しているところです。 > 異常終了を検知したいのは、 > > > 1. クライアントアプリ > 2. クライアントの進捗チェック(おそらく常駐、非表示でクライアントアプリとは別プロセス?) > 3. APサーバ > 4. DBサーバ > > のどれでしょう?どれを指しているのか明示されていないように読み取りました。 > 文脈からすると2番っぽいですが、あってますか? ご認識のとおり、今回は2番を想定しています。 「常駐、非表示でクライアントアプリとは別プロセス」もその通りです。 >はい、書くことは困難でしょう。だから、書かれていなかったら >異常終了していると判断するという意図です。 なるほど、了解しました。 書かれていなかったら、処理中かもしれないという判断が 入ってしまうのが難しいところだと思います。 >特定のプロセスの生き死になら以下のバッチをWindowsタスクで定期的に動かせば >監視できますよ なるほど、こういった方法もあるのですね。 ゆうじゅんさんの発想で調べてみたら、以下のような手法が使えそうな 気がしてきました。 DB側の長時間の処理は、別プロセスで実行されるという前提で 1.DB側で実行される長時間処理は別プロセスで実行される。その際、プロセスIDとプロセス開始時間をDBサーバにセット。 2.チェック側のプログラムは、現在進行中であれば、そのプロセスが存在するかチェックする。 その際、プロセスIDとプロセス開始時間をキーとして検索を実行する。 プロセスが存在しなければ、異常終了扱いとする。 現在のプロセスを取得 http://jeanne.wankuma.com/tips/process/getcurrentprocess.htmlを参考に
プロセスの一覧を取得 http://dobon.net/vb/dotnet/process/getprocesses.htmlを参考に
[ メッセージ編集済み 編集者: jojo 編集日時 2007-04-05 17:12 ] |