Как обрабатывать пакетные задания без Hangfire Pro

Я внедрил Hangfire в свой проект. Теперь мне нужно поставить в очередь несколько заданий, которые технически будут частью пакета. Компания не станет покупать Pro версию Hangfire, которая предлагает пакетную функциональность. Есть ли обходной путь, чтобы я мог определить, когда все связанные задания завершены, чтобы я мог вызывать другую функцию в самом конце каждого пакета?

Пример:

Batch A:
{
  BackgroundJob.Enqueue(jobA1);
  BackgroundJob.Enqueue(jobA2);
  BackgroundJob.Enqueue(jobA3);
}

When Batch A is all done: 
  BackgroundJob.Enqueue(createReportForBatchA);

Batch B:
{
  BackgroundJob.Enqueue(jobB1);
  BackgroundJob.Enqueue(jobB2);
  BackgroundJob.Enqueue(jobB3);
}

When Batch B is all done: 
  BackgroundJob.Enqueue(createReportForBatchB);

Единственное, о чем я могу придумать, - это установить флаг «Готово» для каждого задания в пакете и в конце каждого задания в пакетной проверке, все ли задания завершены, путем проверки флага для всех связанных с пакетом строк в таблице, тогда, если поэтому поставьте createReportForBatch в очередь. Кажется хакерским, хотя делать это, а затем я должен был бы поднять вопрос, могу ли я поставить фоновое задание в очередь в другом BackgroundJob (в основном вложенном). Спасибо за любой вклад или совет.


person TMan    schedule 22.01.2016    source источник


Ответы (1)


1. Реализация фильтра

Пакеты используют API расширяемости, доступный для всех. Вы можете создать фильтр, который добавляет идентификатор фонового задания к некоторому постоянному набору на этапе создания, устанавливает статус «обработано» для элемента в наборе во время процесса изменения состояния, проверяет наличие других ожидающих заданий, когда задание обрабатывается, и запускает новое фоновое задание, если оно было последним в пакете.

Это общий обзор партий. Необходимо учитывать множество факторов, чтобы избежать различных условий гонки и различных сценариев (повторная постановка задания в очередь, удаление и т. Д.).

2. Использование Hangfire + TPL

В качестве альтернативы вы можете использовать Hangfire + TPL вместо параллельного выполнения вычислений, если у вас относительно небольшое количество фоновых заданий в пакете. Итак, Пакет A - это простое фоновое задание, Пакет B - его продолжение. В методах пакета A и пакета B используется TPL для методов jobAN с Task.WaitAll ожиданием своего завершения.

person odinserj    schedule 23.01.2016
comment
но как связать идентификатор задания с пакетом? Можете ли вы отправить дополнительный параметр (идентификатор партии) в метод или? - person Medo; 29.01.2018