5

サービスがまだ実行されているかどうかを確認する最善の方法について質問があります。

最初に少し説明を。私が持っているサービスは、コマンド ラインから実行するか、Windows サービスとして実行できる C# アプリケーションです。このサービスの機能は、リモートのサード パーティ データ ソースへの変更を確認し、それらの変更を処理してからローカル データ ストアに追加することです。

何らかの理由でサービスが停止したことを特定し、これが発生したときにできるだけ自動的に誰かに通知できるようにしたいと考えています。これは、サービスが Windows サービスとして実行されているか、コマンド ラインから実行されているかに関係なく発生する必要があります。

ローカル データ ストアの変更を監視し、変更が一定時間行われなかった場合に通知することを既に検討しましたが、サード パーティのデータ ソースへの変更の頻度が変動するため、これは少し一貫性がないことが判明しました。 、つまり、変更が長期間行われていないからといって、サービスが機能しなくなったことを必ずしも示すわけではなく、単に変更がない可能性があります。

これを監視する方法について何か提案はありますか? 似たようなものを扱った経験のある人はいますか?

ありがとう、M

編集1 サービスがどのように機能するかを大まかに説明するために:サードパーティサービスは、新しい/更新されたデータが利用可能になるとイベントを発生させるため、サービスは座ってこれらのイベントが発生するのを待ち、発生したイベントで返されたデータを処理します。したがって、「サービスがクラッシュした」のではなく、「変更がない」場合を特定するのが難しいのはこのためです。

編集 2 少し明確にする必要があると思います: この監視の主な理由は、サービスまたはサードパーティ サービスへの接続に関する潜在的な問題についてユーザーに通知することです。サービス自体はシングル スレッドであり、適切な例外処理とログ記録を備えています。このサービスはどこかのサーバーで実行される可能性が高いため、サービスに問題があり、何らかの理由でローカル データ ストアの更新が停止した場合は、サービスが誰かに通知する必要があります。

4

3 に答える 3

5

「ハートビート」のようなものを検討したいかもしれません:

Windows サービスのハートビート アクティビティ

しかし、あなたの主な考慮事項は、サービスが停止/ハングできる理由を解決することです。すべての例外をキャッチする必要があります。最悪の場合、CPU の最大使用を防ぐために、少し待ってからサービスを開始状態にリセットしてください。

Windows 自体にもさまざまな方法があります。

Start > Run > Services.msc > Right Click Service > Properties > Recovery Options

例外を適切に使用して適切に処理するようにアプリケーションを設計すれば、サービスが「なんらかの理由で停止する」という問題が発生することはありません。

追加:

「作業不要」とハングアップの違いを判断する方法はありませんか?

于 2013-05-31T10:59:11.790 に答える
-1

このプロジェクトでうまくいった解決策は、ハートビートのような実装を使用して、サービスが利用可能であることを通知できるようにすることでした。

私たちのアプリケーションは WebAPI を使用しているため、サービスが [x] 秒ごとに "ping" するエンドポイントを設定できました。

サービスからの最後の通知の日付と時刻をチェックする別のプロセスが追加されており、それが設定されたしきい値内に収まらない場合は、サービスが利用できないことをユーザーに通知します。

ServiceControllerの使用を検討しましたが、サービスに追加された機能が Windows サービスではなく Windows コンソール アプリケーションとして実行される可能性があるため、これは理想的なソリューションにはなりませんでした。

于 2013-06-06T10:06:14.733 に答える