Могу ли я поставить в очередь с именем очереди в HangFire вместо использования атрибута очереди?

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


person SFun28    schedule 23.04.2015    source источник


Ответы (2)


С экземпляром IBackgroundJobClient вы можете указать очередь.

IBackgroundJobClient hangFireClient = new BackgroundJobClient();
EnqueuedState myQueueState = new Hangfire.States.EnqueuedState("myQueue");
hangFireClient.Create<SomeClass>(c => c.SomeMethod(), myQueueState);

Обратите внимание, что таким образом повторная попытка вернет задание в очередь по умолчанию. Вам потребуется дополнительный код для повторной попытки в той же очереди с использованием JobFilter.

http://discuss.hangfire.io/t/one-queue-for-the-whole-farm-and-one-queue-by-server/490/3

person Xavero    schedule 29.05.2015
comment
Я пробовал это, но это дает мне Невозможно создать экземпляр интерфейса, несмотря на использование ...Create‹IFoo›(x=›x.Bar(), myQueueState). Любые идеи? - person JohanLarsson; 04.08.2015
comment
Вероятно, вам не хватает Rependency Inject Resolver, но я предполагаю, что вы уже исправили свою проблему. Извините, не увидела ваш вопрос раньше. - person Xavero; 19.09.2015
comment
Работал на меня. Класс и метод не могут быть статическими, но прекрасно работают. - person Daniel Abbatt; 02.02.2016

Поскольку добавление дополнительного параметра кажется очень сложным для команды Hangfire ;-)....

... Я нашел наиболее удобный способ - создать два метода, которые просто вызывают фактическую реализацию, и поместить в каждый из них разные атрибуты [Queue].

Обычно, если мне нужно переключать очереди, это между dev/production, и я хочу просто вызвать что-то вроде RunOrder(...) с isTestOrder=boolean и не беспокоиться об очередях на этом уровне.

public void RunOrder(int orderId, bool isTestOrder) 
{
   if (isTestOrder) 
   {
      BackgroundJob.Enqueue(() => _RunTestOrder(orderId));
   } 
   else 
   {
      BackgroundJob.Enqueue(() => _RunOrder(orderId));
   }
}

[Queue("dev")]
public void _RunTestOrder(int orderId) {
  OrderProcessor.RunOrder(orderId); // actual code to call processor
}

[Queue("production")]`
public void _RunProductionOrder(int orderId) {
  OrderProcessor.RunOrder(orderId); // is the same in both 'hangfire proxies'
}

Обратите внимание на использование _, чтобы указать, что они не предназначены для прямого вызова. Я не помню навскидку, должны ли методы Hangfire быть общедоступными или нет, но если они должны быть, то _ важнее.

person Simon_Weaver    schedule 03.02.2019