2011-07-02 5 views
0

私は何を達成しようとしているのかを簡単に説明します。これを行う私の最初の考えは、私の意見でうまくいくわけではないので、私はこれをどのように計画するのが最善かを判断しようとしています。CでWindowsサービスを使用してメッセージを送信するスケジュールを設定する最良の方法

最初に考えました:

私はスケジュールされた時間で送信する必要のあるメッセージのリストを持って、それぞれが中央のSQLデータベースに格納されています。

30分ごとにタイマーを設定するWindowsサービスを使用することを意図しています。それぞれの場合

ScheduleActivated = 1 

:..だから

30 Mins pass > Call ScheduleMessages() 

ScheduleMessagesは、次の30分で出て行く必要がある任意の未送信メッセージのためのデータベースをチェックします、それはその後としてデータベースにそれらをマークしますScheduleActivated = 1とマークすると、通常のタイマーから継承する顧客時間オブジェクトを起動します。これには、送信する必要があるメッセージのプロパティも含まれます。

メッセージが送信されるタイミングでチェックされ、メッセージが送信され、データベースに成功とマークされます。

この問題の主な問題は、すべての場所でタイマーを使用することです。一度に数百のメッセージがスケジュールされると、おそらくうまく動作しないか、完全にフォールオーバーすることになります。

は再evalutating後、私は2

私の他のアイデアは、10分ごとにティックサービス、で実行されている1つのタイマーを持っていることでした解決策を考えました。それが刻印されるたびに、その時点までの任意の時点でリストに送られるすべてのメッセージを収集し、一度に1つずつ処理するメソッドを起動します。

これはリソースの消費量がはるかに少ないようですが、10分後にタイマーが遅くなると、送信が完了していないメッセージが次のティックで捕捉され、再度送信されることが心配です。

タイマーが10分間経過するとタイマーを停止してから、ゼロにリセットしてメッセージが送信された後に再び開始することができますか?

問題の第3の解決策は、上記より優れていますか?

答えて

1

私たちは私たちのために働いていたものを、一つのプロジェクトでこれをして実装:

  • テーブルに書き込まれたすべてのメッセージを送信する時間で
  • を送信するために何かがある場合は、すべてのx分をチェックするサービスを
  • は、サービスがメッセージを送信するとき、それはまた、送信されたメッセージは、再送信を回避マーキング

(更新は、実際の送信された時間にヌルからの時間を送った)メッセージをマークし、あなたを再送信したい場合だけです日付をnullにします。

唯一の問題は、サービスが単一のスレッドとして実行され、送信されるメッセージの数が制限されていることです。しかし、これが問題になる前に、あなたは非常に多くのメッセージと非常に小さなウィンドウを持っています。

0

私の意見では、スケジューリングサービスはスケジュールのチェックのみに責任があり、作業は別のサービスに引き渡す必要があります。スケジューリングサービスは、スケジューリングされる作業を気にするべきではありません。 executeメソッドを含むワークアイテムインターフェイスを実装してみてください。このようにして、実行オブジェクトは内部自体を処理することができ、スケジューリングサービスを意識する必要はありません。あなたがquartz.netをチェックアウトしたことを予定していますか?

+0

メッセージ自体は単純な構成です。当社には複数のタイプの「連絡先」があります。連絡先の種類には、電子メール、または内部IMがあります。インターフェイスから継承する各Contactタイプには、独自のSendMessage()メソッドが必要です。メッセージは各IContactに送信されます。実際の連絡先オブジェクトは、実際のスケジューリングサービスではなくメッセージを送信します。スケジューリングサービスは、メッセージが成功したと言う応答を受信し、それに応じてデータベースを更新する。 –

1

固定間隔をドッチします。 Windowsには、スリープ機能、待ち受け可能なタイマーなど、特定の時間だけスリープ状態になる方法が豊富です。

これらのうちのいくつかは.NETで利用できます。たとえば、WaitHandle.WaitAllはスリープ時間とイベントを受け入れますあなたのスレッドは、次のスケジュールされたアイテムまで待つことができますが、スケジュールを変更する要求によっても呼び起こされます。

関連する問題