根本的に異なるタイプのジョブをキューに入れることができる UI があります。現時点では、ジョブをデータベースの適切なテーブルに格納することでこれを行います (Table-per-JobType)
次に、バックエンド プロセスがやって来てジョブを取得し、使用可能なワーカー (スレッド) があると仮定して、それを使用してジョブに適したメソッドを実行します。
擬似コードで:
While(Runnning) {
While(Queue1.HasJobs && Workers.IdleCount > 0) {
FirstIdleWorker.Execute(Queue1Method(Type1Job));
}
...
While(QueueN.HasJobs && Workers.IdleCount > 0) {
FirstIdleWorker.Execute(QueueNMethod(TypeNJob));
}
//Wait for a job to complete or a polling timeout if queues are empty
}
(実際にはそれほど単純ではありませんが、作業が処理される順序を示しています)
ご覧のとおり、これは機能しますが、ジョブが追加された順序は考慮されていません。ジョブはアトミックであるため、これは問題ではありませんが、UI の観点からは面倒です。たとえば、ユーザー 1 は 20 個のジョブをキューに入れます。タイプ 2、次にユーザー 2 タイプ 1 の 1,000 ジョブをキューに入れます。ユーザー 1 は、(比較的) 迅速なジョブが処理される前に、ユーザー 2 のすべてのジョブが完了するまで待機する必要があります。
ジョブにはCreatedOn
プロパティがあるため、順序を決定することは難しくありませんが、スパゲッティ コードではない厳密に型指定された方法で結合キューを実装するにはどうすればよいでしょうか?
.CreatedOn
, .Queue1Id
,.Queue2Id
が付いた「GenericJob」オブジェクトを避けようとしてい.Queue3Id
ます。
FIFOは私が求めているものですが、厳密な要件ではありません.アイテムが永遠にぶつけられたくないだけです.
この種のパターンはありますか?そうでない場合は、誰かが私に良いチュートリアルを教えてもらえますか?
(ちなみに、これらのジョブは長時間実行される可能性があります。ジョブがキューから取り出されたら、実際にはバックグラウンドで TPL を使用してワーカーを管理していますが、自分よりもはるかに多くのジョブがあるため、キューを自分で管理する必要があります。一度にメモリにロードできます)