此documentation表示您可以使用要调用的方法的Queue
属性指定队列。这假设您始终希望在同一队列上执行方法。调用Enqueue
的进程是否有办法指定要将作业放入队列的名称(有效地将决策权交给作业生成者,而不是作业的定义)。 / p>
答案 0 :(得分:11)
使用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
答案 1 :(得分:0)
因为添加一个额外的参数对于Hangfire团队来说似乎很难;-)....
...我发现最方便的方法是制作两个仅调用实际实现的方法,并在每个方法上放置不同的[Queue]
属性。
通常,如果我需要在开发/生产之间切换队列,我只想用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方法,但是如果确实需要公开,则_
更为重要。