2016-08-18 37 views
1

我的应用程序正在使用Hangfire进行后台作业处理。 我创建的后台作业如下:使用ContinueWith时,在Hangfire中排队的子作业有哪些优先级?

var parentJobId = _backgroundJobClient.Enqueue<IMyService>(x => x.ParentMethod(id)); 
_backgroundJobClient.ContinueWith<IMyService>(parentJobId, x => x.ChildMethod(id)); 

_backgroundJobClient.Enqueue<IMyService>(x => x.OtherMethod1(id)); 
_backgroundJobClient.Enqueue<IMyService>(x => x.OtherMethod2(id)); 

这些方法在服务定义如下:

public interface IMyService 
{ 
    [Queue(HangfireQueuePriority.Default)] 
    void ParentMethod(int id); 

    [Queue(HangfireQueuePriority.Default)] 
    void ChildMethod(int id);  

    [Queue(HangfireQueuePriority.Default)] 
    void OtherMethod1(int id); 

    [Queue(HangfireQueuePriority.Critical)] 
    void OtherMethod2(int id);  
} 

我想的ChildMethod要尽快父作业运行完毕。 我对ContinueWith的理解是,子作业在父作业之后运行,但在Hangfire文档中未指定子任务将运行的时间。

我的问题是子任务相对于队列中其他任务的“优先级”是什么? 队列中定义的任何任务是否有可能在ParentMethod和ChildMethod之间运行?例如OtherMethod1或OtherMethod2

回答

0

我的问题是子任务的优先级高于队列中其他 任务的优先级?

All jobs in critical queues will be fetched first before default queues不管并发水平如何。

是否有机会在队列中定义的任何任务在ParentMethod和ChildMethod之间运行 ?例如OtherMethod1或 OtherMethod2

从技术上讲基于我的第一个回答你的第一个队列中的关键队列中的所有作业都将被取出的第一,这将包括您OtherMethod2。现在所有剩余的作业都在Defaults Queue中,默认情况下,Hangfire设置为根据可用数量Worker以并发方式执行作业。这意味着OtherMethod1可能会在ParentMethodChildMethod之间运行,因为它们都在Default Queues之下。

+0

这很有道理。但是,有一点我不清楚。 在开始处理ParentMethod(在处理ChildMethod之前)之后,将紧急任务(OtherMethod2)添加到队列时会发生什么情况? 首先处理哪个任务:Crital任务(OtherMethod2)或ChildMethod任务? –

0

对于这个问题,我使用了2个hangfire服务器。 第一个使用这样的队列“继续,默认” 第二个这样的“默认,继续”

您继续必须在继续队列中。

因此,当一个任务进入继续队列时,如果第一个被占用,第二个服务器就会占用它,即使它被默认作业占用。

我使用这个,因为当我有一个成千上万的队列和数千个继续的批处理时,我想要2个队列并行运行。