В этой документации говорится, что вы можете указать очередь, используя атрибут Queue
вызываемого метода. Это предполагает, что вы всегда хотите выполнять метод в одной и той же очереди. Есть ли способ для процесса, который вызывает Enqueue
, чтобы указать имя очереди для помещения задания (фактически передав принятие решений в руки генератора заданий, а не определения задания).
Могу ли я поставить в очередь с именем очереди в HangFire вместо использования атрибута очереди?
Ответы (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
Поскольку добавление дополнительного параметра кажется очень сложным для команды 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 быть общедоступными или нет, но если они должны быть, то _
важнее.