3

asp.net で Web アプリケーションを作成しました。いくつかのユーザー ロールがあります。マネージャー、会計士、従業員の 3 つの役割があります。従業員は経費をフォームに記入し、マネージャーに送信します。マネージャーがそれを承認すると、支払いのために経理担当者に送られます。マネージャーが従業員の経費を 48 時間以内に承認しない場合、マネージャーのメールに自動電子メールを送信する必要があります。

1時間ごとにチェックすることで、それを処理する別の小さなコンソールアプリケーションを作成できると思いました。しかし、それはリソースを浪費し、パフォーマンスを低下させます。

私はそれを処理するための良いアイデアが必要です。どうすればいいですか?

4

3 に答える 3

4

いくつかの選択肢がありますが、私があなただったら、最初か 2 番目の選択肢を選びます。

コンソール アプリとスケジューラ

実行されるたびにチェックを実行するコンソール アプリケーションを作成します。次に、Windows スケジューラを使用して毎日 (00:05)、または必要に応じて 1 時間ごとに実行します。このようにして、Windows スケジューラ デーモンは 1 時間ごとに起動し、残りの時間はアプリが実行されていません。

Windows でスケジュールされたタスクがどのように作成されるかを確認するには、このMicrosoft リンクを確認してください。

Restful Web サービスとスケジューラ

@marapet の回答で示唆されているように、コンソール アプリケーションの代わりにこのアクションを実行できる安らかな Web サービスを使用すると、Web アプリケーションにすべてのコードを含めることができるという利点があります。

前のものと同様に、アクションを実行するには安静な uri のみを呼び出す必要があります。考えられる欠点として、エンド ユーザーがその uri にアクセスできないことを確認する必要があります。通常のアーキテクチャ (Web サーバー --> アプリケーション サーバー --> DB) では、この安らかなサービスは、エンド ユーザー アクセスから遠く離れたアプリケーション サーバーに配置する必要があります。

Windows サービス

別のオプションは、常に実行され、時間自体をチェックするWindows サービスを作成して、1 時間ごとにジョブを実行することです (おそらく Quartz などを使用します)。しかし、これはパフォーマンス要件を満たしていません。

いずれにせよ、サービスは 1 時間が経過したかどうかを毎分チェックし、その仕事を行う時間になったかどうかを確認する必要があるため、パフォーマンスへの影響は小さくなります。タスクは非常に簡単です。

利点は、Windows サービスはスケジュールされたタスクよりも制御と監視が容易であることです。

DB ジョブ

さらに別のオプション... アプリで SQL Server を使用している場合は、毎日または毎時間実行される t-sql ジョブを使用できます。本当にパフォーマンスの問題がない限り、このオプションはお勧めしません。

これに関する問題は、コードのロジックと責任を分割することになることです。将来の開発者や管理者は、アプリを維持するのが難しくなります。

于 2013-03-18T13:04:10.423 に答える
3

簡単にするためにWebアプリケーション内にロジックを保持したい場合(ソリューションの合計サイズに応じて、これが望ましい場合と望ましくない場合があります):

  • 特定のURLについて、Webアプリに正当な承認を確認させ、必要に応じてメールを送信します。同じメールが複数回送信されないように、送信されたメールを追跡してください。
  • このURLを定期的に呼び出します。これを行うには、スケジュールされたタスクまたはサードパーティのURL監視サービスを使用できます。

単純なVBScript(またはwgetcurlpowershell、または最も高速なもの)を使用してURLを呼び出すことができます。これにより、タスクスケジューラを使用して自動化できます(も参照)。

URLを呼び出すためのvbscriptのサンプルスクリプト:

Function LoadUrl(url)
    Dim objRequest
    Set objRequest = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    objRequest.open "POST", url , false
    objRequest.Send
    LoadUrl = objRequest.responseText
    Set objRequest = Nothing
End Function
于 2013-03-18T13:15:15.567 に答える
1

毎時間チェックしてもパフォーマンスには影響しません。データベースによっては、毎分チェックしても問題ないでしょう。最も単純なオプションは、スケジュールされたタスクとして起動されるコンソール プログラムです。Windows サービスを試すこともできますが、少し複雑です。

また、48 時間の数え方についても考えてみてください。従業員が週末の直前に経費を計上すると、毎回 48 時間が経過し、月曜日の朝にマネージャーの受信トレイに大量のメールが届くことになります。それはいくつかの摩擦を引き起こす可能性があります:)

于 2013-03-18T13:09:25.680 に答える