在迟发型,我可以与队列名称入队使用队列属性,而不是?

问题描述 投票:7回答:2

documentation说,你可以通过使用该方法Queue属性被调用指定的队列。这是假设你总是希望在同一个队列执行的方法。是否有一个调用Enqueue指定队列的名称把工作分成了(有效地把决策在作业生成,而不是作业的定义的手)过程的方法。

hangfire
2个回答
12
投票

随着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
投票

由于添加一个额外的参数似乎是这么难的迟发型团队; - )....

......我已经找到了最方便的方法就是让两个方法,只需调用实际执行,并把每个不同[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'
}

注意_的使用,以表明这些都注定不会被直接调用。我不记得了手,如果迟发型方法需要公开或不 - 但如果他们确实需要那么_更重要。

© www.soinside.com 2019 - 2024. All rights reserved.