У меня есть пользовательский интерфейс, который может ставить в очередь задания совершенно разных типов. В настоящее время он делает это, сохраняя задание в соответствующей таблице в базе данных (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
}
(На самом деле это не так уж и наивно, но это иллюстрирует порядок, в котором обрабатывается работа)
Как видите, это работает, но не учитывает, в каком порядке были добавлены задания. Это не является нарушением условий сделки, поскольку задания являются атомарными, но это раздражает с точки зрения пользовательского интерфейса — например, Пользователь 1 ставит в очередь 20 заданий из Тип 2, затем пользователь 2 Помещает в очередь 1000 заданий типа 1. Пользователь 1 теперь должен дождаться завершения всех заданий пользователя 2, прежде чем их (относительно) быстрые задания будут обработаны.
У заданий есть свойство CreatedOn
, поэтому определить порядок несложно, но как лучше всего реализовать комбинированную очередь строго типизированным способом, который не является спагетти-кодом?
Я пытаюсь избежать объекта "GenericJob" с .CreatedOn
, .Queue1Id
, .Queue2Id
, .Queue3Id
, так как это кажется неаккуратным.
Хотя в целом FIFO — это то, что мне нужно, это не строгое требование — я просто не хочу, чтобы элементы постоянно менялись.
Есть ли шаблон для такого рода вещей? Если нет, может ли кто-нибудь указать мне хороший учебник, пожалуйста?
(Кстати, это потенциально длительные задания. На самом деле я использую TPL за кулисами для управления рабочими после того, как задания взяты из очереди, но мне все еще нужно самому управлять очередью, так как заданий гораздо больше, чем я может загрузиться в память за один раз)
List<String>
иJobType
, которое работало, но приводило к путанице, если оно ожидало (скажем) доменные имена и получало имена хостов/IP-адреса. Он также выводит только в CSV с некоторыми метаданными и оставляет на усмотрение пользователя сопоставлять/организовывать результаты. На этот раз я хочу, чтобы выходные данные сохранялись структурированным образом в базе данных, чтобы я мог создавать отчеты, повторно использовать старые результаты и т. д. - person Basic   schedule 26.06.2012Date
иId
... - person Basic   schedule 26.06.2012