2009-07-15 12 views
1

長期実行プロセスを実行するWindowsサービスがあります。これはタイマーによって起動され、プロセス全体が完了するまでに数分かかることがあります。タイマーが経過すると、サービスはさまざまなタスクを実行する管理オブジェクトをインスタンス化し、結果を記録してから終了します。Windowsサービスで長期実行プロセスをシャットダウンする

処理の途中でサーバーがシャットダウンされたときに、私は何も実装していません。いくつかの問題を引き起こす可能性があります。これを処理するベストプラクティスは何ですか?

答えて

0

あなたが実際に行っている作業がわからないのであいまいな提案しかできません。

データベースを使用する場合は、コミットされていなければロールバックできるトランザクションがあります。

ファイル操作が必要な場合は、おそらくトランザクションNTFSに関するthisの記事を参照してください。 TransactionScopeオブジェクトと組み合わせて使用​​すると、アトミックなトランザクションを確実に行うことができます。

ウェブサービスを扱っている場合、1つのトランザクションの開始時と終了時にサービス境界が正しく指定され、他のトランザクションが開始されるときには補償モデルを使用します(もしあなたが何かを壊してしまった場合、復旧後、反対側に補償スクリプトを通知/実行する方法を考えてください(オンラインでの注文とバックオーダーの取り消し、取り消しなどを考えてみましょう)

追跡の仕組みについては、すべての手順とタイムラインを記録してください

0

基本的にバッチプロセスの説明で、ある一定の間隔で動作するタイマーが正常に動作している場合 - 多くのワーニングdはそのように働く。

長時間実行されている場合は、プロセスが少なくとも停止するかどうかを確認するために、作業単位またはバッチを最小限に抑えてください。これにより、サービス停止メッセージを本質的に無視するのではなく、正常に終了することができます。

あなたのタイマー関数のどこかにIsShutdownRequiredなどのプロパティがあります(チェックはループ処理を想定しています)。このプロパティは、サービス停止制御メッセージでtrueに設定されています。これにより、より多くの処理を行わないか、Jimmyが提案したように、トランザクションが正常に終了することができます。

理想的には、小さなバッチは1つの大きなバッチよりも優れています。

関連する問題