DOBON.NET DOBON.NETプログラミング掲示板過去ログ

OnStartで例外発生時に停止しない

環境/言語:[WindowsXP/VisualBasic.NET 2003]
分類:[.NET]

お世話になります。
初めてプログラム道掲示板に投稿するかづきと申します。

VB.NET2003を利用しWindowsサービスアプリケーションを作成しております。
WindowsサービスアプリケーションのOnStartイベントで例外が発生すると
コンピュータの管理→サービスよりサービスが正常に停止出来なくなって
しまいます。(DOSの net stop も同様です)

また、FileSystemWatcherを使用してファイルの動態を捉えているのですが
OnCreateイベントで例外が発生した場合も同現象が出ます。

googleを使用し検索して見たのですが、このような現象の記事はなく
事実上、開発に手詰まりしてしまいました。

暫定策として、現在は例外が発生した場合、イベントログに例外内容を
記録し、タスクマネージャよりプロセスを強制終了しております。

この現象に心当たりがある方がいらっしゃいましたら是非ご教授下さい。

環境は以下の通りです。

【開発環境】
OS :Windows XP SP2
言語:Visual Basic .NET 2003
CLR :.NET Framework 1.1 SP1 (JPパッチ適用)

【実行環境】
OS :Windows 2003 Server Enterprize
CLR:.NET Framework 1.1 SP1 (JPパッチ適用)


以上、よろしくお願い致します。
例外を正しく処理しないと当然そのような結果になってしまいます。

問題なのは、例外が発生することではなく、例外の処理を適切に行
っていないことです。

なぜ例外が発生するのかその原因を追究し、例外発生時に正しい処
理を行うようプログラムの見直しをして下さい。

それしか方法がありません。

以上。
オショウ様

早速のご回答ありがとうございます。

> 例外を正しく処理しないと当然そのような結果になってしまいます。

初歩的な質問で申し訳ありませんが、Try〜Catchでハンドリングを
行っているかという事でしょうか?Try〜Catchでしたら無論行っております。

> なぜ例外が発生するのかその原因を追究し、例外発生時に正しい処
> 理を行うようプログラムの見直しをして下さい。

ORACLEの接続処理を行っており、例外が発生するのは
別サーバ上にあるORACLEが障害などで停止している時です。
このようなケースの場合、プログラムでは例外を発生しないように
仕掛けることは出来ないと私は考えております。


例外のハンドリグは行っており、処理も考える限りは適切な処理を行っています。
実際にWindowsサービスでなくコンソールアプリケーションでデバックすると
問題なく終了します。

以上、よろしくお願い致します。
ODP.NET使用されているのですよネ?!
また、必ずOracleサーバーに接続できると言う前提でコーディングされて
いるのが問題かと。ネットワークの障害(LANケーブルやハブの故障)
もありますので、私はpingが通るよう設定していて、必ずアクセスする前
にping打ってOracleサーバーから応答があればコネクトして・・・
と言うふうにしています。

それとTray〜いれていて、サービスが停止不能になる部分ですが、もしか
して、OnStartの関数内で直接Oracleサーバーにコネクトするコード書い
ているのではないでしょうか?
OnStart自体の処理は迅速にOSに戻さないといけない(タイムアウトが
確か15秒だったようにな)ので、それ以上止めてしまうようなケースは、
別クラスに処理を書いて、尚且つマルチスレッドにして非同期処理にさせ
ます。

どんな状態でも1秒以内に戻ってくるのであれば、OnStart内に書けばいい
かとは思いますが・・・

いろいろ制約があるので、必ず正しく動作する場合のみに限定したコード
を書かない方がよいと思います。

以上。
オショウ様

ご回答有難うございます。
返答が遅くなり申し訳ないです。

ミドルウェアはODP.NETを使用しております。
オショウ様の仰るとおりOnStartはタイムアウトがあるので
コネクトするのをマルチスレッド化したいと思います。

一点、お伺いしたことがあります。
ORACLEに接続する前にpingを実行するのは、有効だと思います。
とても参考になりました。
サーバは上がっているがリスナーが落ちてしまっている時など
pingは通るがORACLEのみ障害が発生している時は、どのように
対処されておりますか?

当初の掲示とは別の内容になってしまいましたが、ご教授頂けると
幸いです。

以上、よろしくお願いいたします。
> 一点、お伺いしたことがあります。
> ORACLEに接続する前にpingを実行するのは、有効だと思います。
> とても参考になりました。
> サーバは上がっているがリスナーが落ちてしまっている時など
> pingは通るがORACLEのみ障害が発生している時は、どのように
> 対処されておりますか?

  orapingを使うところですが、プログラム中からorapingを打った
  ことは無いので、解りません。

  オラクル関係の掲示板でお問い合わせさせるのがよいと思います。

※ 尚、コネクトする際の接続文字列では、コネクションタイムアウト
  の設定は、何かされていますか?
  通常は接続できなければ、タイムアウトか拒否か接続できないエラー
  が正しく返ってくるはずです。(Tra〜で)

以上。
参考までに・・・

ttp://otn.oracle.co.jp/forum/thread.jspa?threadID=27000133&tstart=137

ここにそこそこ有用な情報がありました。

以上。
オショウ様

ご回答ありがとうございます。

tnspingは、初めての試みです。
少し時間がかかるかもしれませんが試して見ます。

改修した結果を、またご報告致します。

DOBON.NET | プログラミング道 | プログラミング掲示板