1

実行時間の長いプロセスを実行する Windows サービスがあります。タイマーによってトリガーされ、プロセス全体が完了するまでに数分かかる場合があります。タイマーが経過すると、サービスはさまざまなタスクを実行する管理オブジェクトをインスタンス化し、結果をログに記録してから終了します。

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

4

2 に答える 2

0

あなたが実際にどのようなタスクを行っているのかわからないので、漠然とした提案しかできません。

データベースで行うものであれば、コミットしないとロールバックできるトランザクションがあります。

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

Web サービスを扱っている場合、サービスの境界によって、1 つのトランザクションが開始/終了するタイミングと、もう 1 つのトランザクションが開始されるタイミングが決まります。補償モデルを使用します (自分の側で何かを壊した場合は、回復後に後で方法を提供する必要があります)。 、相手側で補償スクリプトを通知/実行する方法 (オンラインで書籍を注文し、バックオーダー、キャンセルなどの処理方法を考える)

メカニズムを追跡するために、シャットダウンなどの問題が発生した場合のトラブルシューティングのために、すべての手順とタイムラインを記録します。

于 2009-07-15T02:35:43.143 に答える
0

本質的にバッチプロセスを説明している場合、間隔を置いて機能するタイマーを使用しても問題ありません-世界の多くはそのように機能します。

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

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

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

于 2009-08-07T05:11:58.613 に答える