3

ここではジョブサーバーが必要で、現在Quartz.netで遊んでいますが、自分で作成するというアイデアは魅力的です。少なくとも、Quartz.netが裏で何をしているのかを理解することは、Quartz.netをより効果的に使用するという私の理解/チャンスを損なうことはありません。

だから私の質問は、ポーリングなしでスレッドでジョブを取得して起動する方法についてです。解雇する必要のあるジョブがないか「ジョブストア」を2分ごとにチェックすると、約2分の遅延が発生する可能性があります。ポーリング時間を短縮すると、ジョブストアの負担が増大しますが、それでも実際の開始時刻は取得されません。次の2分間のセグメントでジョブをプリロードし、残りの時間スレッドをスリープ状態にして、適切な時間にスレッドを開始することができますが、ポーリング時間が長い場合(削除、再スケジュールなど)、それは厄介で問題が発生しやすいようです。クォーツを分析してそれがどのように行われるかを理解しましたが、基本的な何かが欠けているのではないかと思いました。

編集:

最初に説明したKevinのようなスレッド構造は、ジョブサーバーを実行する方法のようです。最小限のオーバーヘッドで最大限の柔軟性を提供します。スレッドはほとんどの人が(たぶん私だけで)作業するのに非常に重要なので、より単純なポーリングの例では、柔軟性が失われ、オーバーヘッドが増えるという犠牲を払って、ケースの90%で作業が完了します。

反対に、単一のジョブが実行されてシングルスレッド化されていない限り、とにかくスレッド化を処理する必要があります。完全なイノシシに行き、信号を理解することもできます。

また、ポーリングデータベースの例で無料で入手できると主張しているものは実際には無料ではないというKevinにも同意します。スレッド化/待機中のアプリの場合と同じようにコーディングします。ポーリングデータベースのジョブサーバーがジョブの途中で爆発した場合はどうなりますか?どちらも、災害が発生した場合に状態を追跡するために、耐久性のあるストレージに依存しています。

'jobstore'を抽象化のレベルに移動し、それが通常のACID(正しい用語?)データベースに基づいていない場合はどうなりますか?今、あなたの「無料」のものの多くが基づいていたと私が信じているものは、もはや利用できません(トランザクション?)。

4

1 に答える 1

2

時間順に(最短から最長の時間)、実行されるタスクのキューを作成します。キューの先頭で時間を待機するスレッドは1つだけです。その時間が経過したら、アイテムを削除してタスクを実行します。繰り返しのタスクの場合は、再計算してキューに戻します。

唯一注意が必要なのは、スレッドが何らかの条件変数に基づいて待機する必要があることです。キューの先頭が変更された場合、条件変数を通知できます。通常、条件変数を使用すると、それが通知されたのか、タイムアウトが期限切れになったのかを判断できます。したがって、通知された場合は、新しいヘッドタイムで再度待機します。それ以外の場合、タイムアウトは、キューの先頭でタスクを実行する時間であることを示します。

このソリューションは、タスクを管理するスレッドが1つだけであり、ポーリングされていないことを意味します。

編集:

クォーツが非常に優れたソリューションであることを考えると、独自のスケジューラーを作成することはおそらくあまり良い考えではないことを指摘するために、ソリューションを更新します。また、ジョブは通常、1秒ごとではなく、1分ごとに実行されるため、毎秒のポーリングは一種のやり過ぎだと思います。たとえば、ジョブが12:00:05に開始するのか、それとも12:00:00で十分なのか、本当に気になりますか?いずれにせよ、必要な粒度のレベルを満たすようにポーリングをパラメーター化できます。

于 2011-06-06T19:55:47.347 に答える