0

我有一个用户界面,可以将完全不同类型的作业排队。目前,它通过将作业存储在数据库中的相应表中来实现这一点(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,的“GenericJob”对象.Queue2Id.Queue3Id因为这感觉很草率。

虽然 FIFO 基本上是我所追求的,但这并不是一个严格的要求——我只是不希望物品永远被撞到。

这种事情有模式吗?如果没有,有人可以指点我一个好的教程吗?

(顺便说一句,这些可能是长期运行的作业。一旦从队列中取出作业,我实际上是在幕后使用 TPL 来管理工作人员,但我仍然需要自己管理队列,因为作业比我多得多可以一次性加载到内存中)

4

2 回答 2

1

如果我错了,戳我,我希望这个伪代码可以解释接口抽象。

一个界面可能如下所示:

enum JobTypes
{
    JobType1 = 0x01,
    JobType2 = 0x02,
    JobType3 = 0x03
}
interface IJob
{
    int ID { get; set; }
    JobTypes JobType { get; set; }
    DateTime Date { get; set; }
    bool Complete { get; set; }
    void Process(List<object> parameters);
}

每个作业类型处理器都实现此接口,更改和添加属性以满足您的需求:

class JobType1 : IJob
{
    public int ID { get; set; }
    public JobTypes JobType { get; set; }
    public DateTime Date { get; set; }
    public bool Complete { get; set; }
    public void Process(List<object> parameters)
    {
        throw new NotImplementedException();
    }
}

然后,您可以将作业类型混合到一个列表中:

List<IJob> joblist = new List<IJob>();

并可能使用 lambda 按日期对它们进行排序:

joblist.Sort((a, b) => DateTime.Compare(a.Date, b.Date));

获取未处理作业的列表(不检查那些繁忙的处理*)

List<IJob> undone = joblist.Where(job => job.Complete == false) as List<IJob>;
于 2012-06-27T07:28:51.067 回答
1

完整的答案可能类似于作业车间调度,因为您有需要不同资源或资源级别的工作,并且您希望避免让短期工作挨饿。这有点复杂,需要阅读一些内容,但最终它比尝试从单个队列中进行复杂的临时调度要少得多。

听起来您在作业之间没有依赖关系,因此一种省力的方法是为每个用户每个作业类型设置队列,然后对队列进行加权循环。(即队列 Y 中的每个作业从队列 X 中获取 2 个作业。)

于 2012-07-18T14:05:16.177 回答