0

Windows のスケジュールされたタスクによって実行される、実行時間の長い C# コンソール アプリケーションをいくつか開発しました。

これらのアプリケーションは、イントラネット/エクストラネット上のさまざまなサーバー マシンで実行される可能性があります。各アプリケーションは、特定のマシンでのみ利用可能ないくつかのリソースにアクセスする必要がある可能性があるため、それらが 1 つのマシンで実行されることを保証することはできません。

それでも、これらのアプリケーションはすべて共通の WCF サービスを使用してデータベースにアクセスしています。

常に実行中のアプリケーションのインスタンスが 1 つしかないことを確認する必要があります。アプリは異なるエクストラネット コンピューター上にある可能性があるため、コンピューターごとのミューテックスや MSMQ を使用することはできません。

次の解決策について考えました-タイムアウトのあるWCFミューテックスサービス。1 つのアプリが実行されると、それが (おそらく別のマシンで) 既に起動されているかどうかを確認し、(専用スレッドで) 定期的に WCF Mutex サービスに ping を実行してタイムスタンプを更新します (ping が失敗した場合、アプリはすぐに終了します)。タイムスタンプの有効期限が切れた場合、これはアプリケーションがクラッシュしたことを意味するため、再度実行できます。

この「WCFミューテックス」が私の問題に対する最適な解決策であるかどうかを知りたいです。そのような機能を実装したサードパーティのライブラリがすでにいくつかあるのではないでしょうか?

4

2 に答える 2

1

ミューテックス ソリューションに競合状態があります。

タイムスタンプの有効期限が切れた後、現在のサービスがタイムスタンプを更新する前に、別のサーバー上のアプリがウィンドウ内のタイムスタンプをチェックする場合、2 つのインスタンスが実行されます。

多分、逆の道を歩んでいたと思います。中央監視サービスがあればいいのに。このサービスは、システムの状態を継続的に監視します。サービスがダウンしたことを検出すると、そのマシンまたは別のマシンでサービスを再起動します。

弾丸をかじって、完全な Enterprise Service Bus を使いたいと思うかもしれません。ESB については、ウィキペディアの記事を確認してください。10 を超える商用およびオープン ソース システムがリストされています。

于 2012-08-23T13:34:45.367 に答える
0

ネットワーク上の場所でのファイル ロックはどうですか?

排他的な読み書きでファイルを作成/開くことができる場合、それが実行中の唯一のアプリです。その後、この実行中のアプリがクラッシュした場合、ロックは OS によって自動的に解放されます。

ティム

おっと、質問を読み直して「エクストラネット」を見ました。無視してください。

于 2012-08-23T13:45:12.510 に答える