7

人のタスクを処理する小さなアプリケーションを作成しています。非常にシンプルですが、テーブルのデザインに関する限り、私がこだわっている領域は、1 回限り、毎日、毎週、または毎月の繰り返しタスクの場合です。毎週の場合は、特定の日、毎週です。毎月は特定の日です。

タスク テーブルと recurring_type_id があり、定期的なタスクをコードで処理する予定でしたが、理想的な方法はありますか? もう 1 つの方法は、タスクの作成時にすべてのタスクを挿入することです (イベント時間ごとに)。しかし、それも正しくないようです。

設計と、保守可能で効率的な方法でこれを処理する方法について、誰でもアドバイスできますか?

SQL Server 2008 R2 を使用しています

4

8 に答える 8

7

試行錯誤したソリューションを使用しようとします。Unix Cron テーブルソリューション。このソリューションは、Hudson/Jenkins などの他の多くのツールでも使用されています。

ウィキペディアより。

* * * * * 実行するコマンド
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ │
│ │ │ └───── 曜日 (0 ~ 7) (0 または 7 は日曜日、または名前を使用)
│ │ │ └────────── 月 (1 - 12)
│ │ └─────────────── 日 (1 - 31)
│ └──────────────────── 時間 (0 - 23)
└──────────────────────────分(0~59)

また、エントリのショートカット名も使用できます。

エントリの説明と同等
@yearly 1 年に 1 回、1 月 1 日の午前 0 時に実行 0 0 1 1 *
@毎年   
@monthly 毎月 1 回、月初の午前 0 時に実行 0 0 1 * *
@weekly 週に 1 回、日曜日の午前 0 時に実行 0 0 * * 0
@daily 1 日 1 回午前 0 時に実行 0 0 * * *
@hourly 1 時間に 1 回、正時に実行 0 * * * *

ここから、次のテーブル デザインが得られます。

taskID cronExpression preDefinedDefinition
 1 30 * * * * ヌル
 2 0 * * * * @毎時
 3 …………

@Timothy Britt は、このソリューションは 1 回限りのオフを考慮していないと述べました。それは本当です。Linux や Unix にもatという名前のコマンドがあります。エントリを別のファイルに保存し、別のデーモンがこのファイルを監視しているようです。このテーブルに 1 回限りのジョブを含めたい場合。ブール列 OneTimeOnly を追加する場合があります。または、1 回限りのジョブのみを含む別のテーブル。

于 2013-01-27T11:06:39.353 に答える
1

このように表のように日付を参考にしたいと思います

taskid      date_reference Freq            distance
----------- -------------- --------------- -----------
1           2011-01-01     daily           NULL
2           2011-01-17     monthly         NULL
3           2013-01-17     weekly          NULL
4           2013-01-24     once            NULL
5           2011-01-01     monthly         NULL
6           2011-01-01     monthly         NULL
7           2011-01-01     before_eomonth  5
8           2013-01-01     loop_day        4
9           2013-01-01     loop_month      4

だからあなたは多くの方法で期間をチェックすることができます...

伝統的な毎週、毎日、毎月、そして一度。槍の解決策のように。

しかし、あなたはいくつかの異なる方法を持っているでしょう、

4日ごと

4か月ごと

または月末まで5日

または月末

タスクループの最後に別の日付を含めることを検討する必要があります...

しかし、仕事は決して終わらない...だから、それは決して使われないだろう..;)

于 2013-01-24T19:41:37.737 に答える
1

私は非常に似たようなことをします:

   _id
   interval_type
   time
   day
   next

このdayフィールドは、間隔内の日を表します。これは、ワンショットおよび毎日の場合は null です。テーブル内のnextフィールドは、タスクを次にいつ実行するかを識別するために使用されます。これは、タスクの実行時にデバイスがオフになっている場合に必要です。1 つまたは複数の欠落した間隔を処理する方法を決定する必要があるだけです。

于 2013-01-24T19:26:08.537 に答える
1

このためのリレーショナル デザインを考え出す代わりに、業界標準の iCalendar 形式 ( http://www.rfc-editor.org/rfc/rfc5545.txt ) を使用することをお勧めします。ここでいくつかの例を見ることができます。繰り返しパターンは非常に単純に見えるので、それらの iCalendar 式を作成するのはかなり簡単な作業です。

役立つ構文バリデータは次のとおりです: http://severinghaus.org/projects/icv/

于 2013-01-30T20:52:52.237 に答える
0

あなたの環境がどのようなものかは正確にはわかりませんが、オープンソースのジョブ スケジューラはこのタイプのタスクを解決できます。

http://en.wikipedia.org/wiki/Open_Source_Job_Scheduler

于 2013-01-30T22:43:48.060 に答える