私はオークション Web アプリケーションに取り組んでいます。
すべてのオークションには終了日があります。その時間の終わりに、アルゴリズムに基づいて勝者が決定されます。
終了日時の直後に勝者を決定する方法を見つけようとしています。
エージェントが間隔を空けてジョブを実行するようにスケジュールできます。しかし、終了日時の終了直後にプロセスを開始するのが好きです。
これを達成する方法はありますか?
私はオークション Web アプリケーションに取り組んでいます。
すべてのオークションには終了日があります。その時間の終わりに、アルゴリズムに基づいて勝者が決定されます。
終了日時の直後に勝者を決定する方法を見つけようとしています。
エージェントが間隔を空けてジョブを実行するようにスケジュールできます。しかし、終了日時の終了直後にプロセスを開始するのが好きです。
これを達成する方法はありますか?
SQL Server には Service Broker と呼ばれるものがあります。数秒ごとに実行するジョブをスケジュールして、アルゴリズムを計算する必要があるレコードを特定し、処理のためにサービス ブローカーに送信することができると思います。処理には、勝者の計算、勝者およびアイテムをオークションに出す人への通知などが含まれる可能性があります。Bookds Online の Service BRoker を読んでください。あなたがする必要があることには非常に便利だと思います。
勝者はオークション終了時に決定されます。あなたの質問は、オークションが終了したときに何かをしたいことを意味します。たとえば、勝者に通知します。
データベースに入札を挿入するアプリケーション、またはおそらくWindowsサービスは、次のオークションが終了したときに期限切れになるように設定されたタイマーを維持できます。ウェイクアップし、完了したすべてのオークションを処理し、次のオークションの有効期限を判断して、タイマーを再設定します。
オークションの終了を定期的にチェックする .Net アプリが最良の選択かもしれませんが、5 分ごとに実行され、次の 5 分以内に終了するオークションをチェックし、WinnerAlgorithm proc を WAITFOR DELAY で起動するジョブを使用することもできます。修飾子。ジョブは、その 5 分間の時間枠内に終了するすべてのオークションをキャプチャするために、複数の非同期ジョブを起動できる必要があります。
SELECT ID FROM Auction WHERE AlgorithmIsSet = 0 and AuctionEnd < DATEADD(minute, 5, GETDATE()); -- to pull the ones you need to process
UPDATE Auction SET AlgorithmIsSet = 1 WHERE ID = 12345; -- to mark that this one is taken care of.
WAITFOR DELAY "00:04:23"; -- the exact time until the auction ends - you'll need to construct this from DATEDIFF(second, AuctionEnd, GETDATE())
EXEC WinnerAlgorithm; -- after the wait time, the auction is closed and the winner determined.
これにより、オークションが終了するとすぐにプロセスが実行されます。5 分ごとなど、かなり定期的にジョブを実行し、エージェント サービスの実行が停止するか、マシンが再起動されると、最初の SELECT ステートメントがまだ処理されていないものをプルします。入札にタイムスタンプを付ける限り、事後にいつでも勝者を再構築できます。
オークション終了日の少し後にエージェント ジョブを起動するようにスケジュールします。