在HangFire中,我可以使用队列名称而不是使用队列属性进行排队吗?

时间:2015-04-23 13:27:15

标签: hangfire

documentation表示您可以使用要调用的方法的Queue属性指定队列。这假设您始终希望在同一队列上执行方法。调用Enqueue的进程是否有办法指定要将作业放入队列的名称(有效地将决策权交给作业生成者,而不是作业的定义)。 / p>

2 个答案:

答案 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方法,但是如果确实需要公开,则_更为重要。